本专栏为个人在华清远见嵌入式linux学习期间的笔记,希望能与各位读者共同进步!
文章目录
前言
数据类型、常量、变量及运算符:
通过今天课的学习,学员可以掌握Linux下C语言编程必备的基础知识,为后续编程打下基础。
一、数据类型上
1.数据类型的分类
2.基本数据类型
逻辑类型:只有两个量true和false,表示逻辑真值和逻辑假值。
整数类型:包括char, short, int和long。
浮点类型:包括float和double。
void类型:主要用于说明不返回值的函数或指向任一类型的指针等。
bool类型:需要头文件 <stdbool.h> 宏 _Bool
二、数据类型下
1.char类型
使用char数据类型的变量需要特别注意,防止数据超出值域,思考下列几个语句:
char c1= 128; //出错,数据越界(-128)
char c1= 129; //出错,数据越界(-127)
unsigned char c2= -1; //出错,数据越界(255)
2.short类型
short类型 头文件<limits.h>
3.int类型
4.long类型
5.浮点类型
6.强制数据类型的转换
强制数据类型的转换是指采用某种方式将某种数据类型强制转换成指定的数据类型。包括显式的数据类型转换,和隐式的数据类型转换。
例如
int a=22, b=0 ;
float c = 24.87, d= 3.3;
b = (int) (a + c +d) ; // b为50
强制类型转换符后面的表达式如存在复杂运算,就一定要用小括号括起来
强制类型转换符是一种不安全的转换,一般都是将高级类型转换成低级类型,要丢失数据的精度;
强制类型转换并不改变表达式中变量的数据类型和其值。
三、常量
1.整型常量
常量是指在程序运行期间其数值不发生变化的数据。整型常量通常简称为整数。
整数可以是十进制数、八进制数和十六进制数。例如,十进制的数值3356可以有下列二种不同的表示形式:
八进制数 06434
十六进制数 0xd1c
2.浮点常量
浮点常量又称为实数,一般含有小数部分。
在C语言中,实数只有十进制的实数,分为单精度和双精度。实数有两种表示方法, 即一般形式和指数形式,一般形式的实数基本形式如下:
例如
3.5
-12.5
3.1415926
3.指数常量
指数形式的实数一般是由尾数部分、字母e或E和指数部分组成。 当一个实数的符号为正号时,可以省略不写,其表示的一般形式如下:
1.176e+10 表示 1.176×10^10
-3.5789e-8 表示 -3.5789×10^-8
通常表示特别大或特别小的数
4.字符常量
字符常量是指一个单一字符, 其表示形式是由两个单引号包括的一个字符。
'A' 'a' 'Q' '0' '9' '+' ':' '?' '$' 都是字符常量。
在C语言中, 字符常量具有数值。字符常量的值就是该字符的ASCII码值。
可以把字符常量看做一个字节的正整数。
例如
char a, b, u, v
a = 'F' ; // 将70送给a
b = 'A' + 2; // b存放的是 'C' 字符
u = ' ' + 'B'; // u存放的是 'b' 字符
v = 'b' - 32; // v存放的是 'B' 字符
它们分别相当于下列运算;
a = 70;
b = 65+2;
u = 32+66;
v = 97-32;
5.字符串常量
所谓字符串常量是指用双引号括起来的一串字符来表示的数据。(字符串以\0结尾)
下面给出几个字符串常量的例子:
"Hello!"
"StudentS"
"9"
"LINUX"
"李四"
"北京海淀成府路***号"
"姓名:"
"****@163.com"
6.标识常量
所谓标识常量是指用标识符代替常量使用的一种常量, 其名称通常是一个标识符。
标识常量也叫符号常量,一般用大写英文字母的标识符。
在使用之前必须预先定义。说明形式为:
#define <标识常量名称> <常量>
例如
#define MAX 50
#define PI 3.1415926
#define NULL 0
#define EOF -1
#define ERROR -1
其中,MAX、PI、NULL、 EOF和ERROR都是标识常量, 它们代替的常量分别是50、3.1415926、0 、-1和-1 。
一般情况,每个标识常量说明式子只能给出一个标识常量,并且占据一个书写行。
定义一个宏名字之后,可以在其他宏定义中使用,例如:
#define ONE 1
#define TWO ONE+ONE
#define THREE ONE+TWO
如果一个串长于一行,可在行尾用反斜线”\”续行
#define LONG_STRING “This is a very very long\
String that is used as an example”
四、变量
1.变量的基础
变量在程序中用变量名表示。变量名由用户根据其用途任意命名。
变量名由字母、数字、下划线组成,不能以数字开头,不能和C的关键字重名。
在程序运行时,变量占据存储空间的大小由其数据类型决定。
变量在内存空间中的首地址,称为变量的地址。
2.变量的说明
变量在程序中使用时,必须预先说明它们的存储类型和数据类型。
变量说明的一般形式是:
<存储类型> <数据类型 > <变量名> ;
<存储类型>是关键词auto、register、static和extern
<数据类型>可以是基本数据类型,也可以是自定义的数据类型
3.变量的存储类型
auto说明的变量只能在某个程序范围内使用,通常在函数体内或函数中的复合语句里。(默认是随机值)
在函数体的某程序段内说明auto存储类型的变量时可以省略关键字auto,如下:
auto int k ;
int j ;
double x;
register称为寄存器型,register变量是想将变量放入CPU的寄存器中,这样可以加快程序的运行速度。
如申请不到就使用一般内存,同auto
register变量必须是能被CPU所接受的类型。这通常意味着register变量必须是一个单个的值,并且长度应该小于或者等于整型的长度;不能用“&”来获取register变量的地址。
由于寄存器的数量有限,真正起作用的register修饰符的数目和类型都依赖于运行程序的机器。
在某些情况下,把变量保存在寄存器中反而会降低程序的运行速度。因为被占用的寄存器不能再用于其它目的;或者变量被使用的次数不够多,不足以装入和存储变量所带来的额外开销。
五、变量二
1.变量的存储类型static
static变量称为静态存储类型的变量,既可以在函数体内,也可在函数体外说明。(默认是0)
局部变量使用static修饰,有以下特点:
在内存中以固定地址存放的,而不是以堆栈方式存放
只要程序没结束,就不会随着说明它的程序段的结束而消失,它下次再调用该函数,该存储类型的变量不再重新说明,而且还保留上次调用存入的数值
2.变量的存储类型extern
当变量在一个文件中的函数体外说明,所有其他文件中的函数或程序段都可引用这个变量。
extern称为外部参照引用型,使用extern说明的变量是想引用在其它文件中函数体外部说明的变量。
static修饰的全部变量,其它文件无法使用
六、运算符一
1. 算术运算符
C提供的算术运算符:+,-,*,/,%,++,如下图:
float/double不能取余
例如
int a=15, b=8,c;
double x=15, y=8, z;
c = a + b; c = a – b; c = a * b; c = a / b; // c 赋值为
c = a % b; // c 赋值为
z = x + y; //z 赋值为
z = x - y; // z 赋值为
z = x * y; // z 赋值为
z = x / y; // z 赋值为
z = x % y;
int x=5, y=9, z;
z = ++x ;
z = x++ ;
z = --x ;
z = x-- ;
z= ++x + y++ ;
z= --x + y++ ;
z= ++x + y-- ;
2. 关系运算符
C语言的关系运算符如下:
例如
int a=5, b=6;
a>(b-1) 结果值为0
(a +1)== b 结果值为1
a>=(b-2) 结果值为1
a<100 结果值为1
(a+3)<=b 结果值为0
a != (b-1) 结果值为0
3. 逻辑运算符
C语言的逻辑运算符如下:
逻辑非“!”运算符的运算律如下:
例如
int k=8;
! ( k ==0) 结果值为1
! ((k-8) == 0) 结果值为0
! (k<= 0) 结果值为1
逻辑与“&&”运算符的运算规律如下:短路特性-逢0截止:
逻辑或“||”运算符的运算规律如下:短路-逢1截止:
例如
int x=5, y=18;
(x>=5) && (y<20) 结果值为1
((x+1)>=0) && (y<17) 结果值为0
((x-8)>=0) && (y==18) 结果值为0
((x-5)>0) && (y!=18) 结果值为0
((x>=5)) || (y<20) 结果值为1
((x+1)>=0) || (y<17) 结果值为1
((x-8)>=0) || (y==18) 结果值为1
((x-5)>0) || (y!=8) 结果值为1
七、运算符二
1.位运算符
C语言的位运算符如下:
位逻辑反为0变1,1变0:
例如
unsigned char x=0x17, y;
y = ~x;
位逻辑与“&”运算符的运算规律如下:
例如
unsigned char x=0126, y=0xac, z;
z = x & y;
位逻辑或“|”运算符的运算规律如下:
例如
unsigned char x=076, y=0x89, z;
z = x | y;
位逻辑异或“^”运算符的运算规律如下:
例如
unsigned char x=75, y=0173, z;
z = x ^ y ;
位移位运算的一般形式:
<运算量> <运算符> <表达式>其中:
<运算量> 必须为整型结果数值;
<运算符>为左移位(<<)或 右移位(>>)运算符;
<表达式> 也必须为整型结果数值。
例如
unsigned char a=0xe4, b;
b=a<<3;
八、运算符三
九、运算符四
1.赋值运算符
赋值运算符为“=”,其运算的一般形式如下:
<左值表达式> = <右值表达式>
赋值复合运算符其运算的一般形式如下:
<变量> <操作符>= <表达式>
2.赋值复合运算符
C语言的赋值复合运算符如下:
例如
#include <stdio.h>
int main(int argc, char **argv)
{
int count, sum;
count = 0; sum = 0;
while (count++ < 20) { sum +=count; }
printf("sum = %d\n", sum);
return 0;
}
3.C语言的特殊运算符
条件运算符"? :"
是三目运算符, 其运算的一般形式是:
<表达式1> ? <表达式2> : <表达式3>
例如
int x=82, y=101;
x >= y ? x+18 : y-100 //运算结果为1
x < (y-11) ? x-22 : y-1 //运算结果为60
int main()
{ int x, y=25;
x=70;
y= x++ > 70 ? 100 : 0 ;
printf(“x=%d y=%d”, x, y);
return 0;
}
运行结果: x=71 y=0
逗号运算符
float x=10.5, y=1.8, z=0;
z = (x+=5, y = x+0.2) ;
z = (x=y=5, x +=1) ;
z = (x=5, y=6, x+y ) ;
z = (z=8, x=5, y=3) ;
sizeof运算符
运算的一般形式:sizeof(<类型或变量名>) 注意:它只针对数据类型,而不针对变量!
例如
sizeof(double)
sizeof(long)
4.C运算符的优先级
例如
int x=1, y=0, z=0;
x++ && y++ || ++z //结果为 1 (2 1 1)
! (x+1>0) && y++ || ++z //结果为 1 (1 0 1)
x += y==z, y=x+2, z=x+y+x >0//x为2,y为4 ,z为1