- 常量
字符常量
man ascii或者 man ASCII查看ascii值
‘A’ ‘!’ ‘1’ ‘C’ ‘Z’
记忆’\0’ (0) ‘0’(48) ‘\n’(10) ‘A’(65) ‘a’(97)
整形常量
36 10 100 -19 0 十进制 0~9
0b1000 二进制 0 1
0664 八进制 0~7
0x123f 十六进制0x或0X 0~15 ==》 0-9 a-f或者0-9 A-F
实型常量
3.14 1.5
3.14e8 3.14E-2 (e是10的次方)
字符串常量
“helloworld”
“cprogram”
“welcome”
标识常量
#define M 10
* 1、含义:使用M替代10这个数字
* 2、它可以让数据具备对应的含义,减少魔鬼数字的出现
* 3、改变宏的值,相关的内容就会都跟着改变
* 4、原则上定义的时候大小写都可以,但是我们一般用大写
* 5、define后面没有分号
* 6、宏是在预处理阶段完成的
*7、宏只进行简单的替换,不进行任何运算
#define N M+10
printf(“N * N = %d\n”,N*N); //120= M + 10 * M + 10
#define N (M+10)
printf(“N * N = %d\n”,N*N); //120= (M + 10) * (M + 10)
利用宏定义函数
#define ERR_LOG(err_log) printf(err_log);return -1;
//#define ERR_LOG(err_log) {printf(err_log);return -1;}
//#define ERR_LOG(err_log) do{printf(err_log);\
return -1;}while(0)
//open(file)
//ERR_LOG("open failed\n");
ERR_LOG("*********\n");
//printf("open failed\n");
//return -1;
总结:
‘\’它在定义宏函数时,可以实现多行一起定义:主要作用就是链接上下行,使一个宏可以定义一个多行函数 do-while()包裹宏可以避免定义复杂宏出现错误
参考
举例 假设你需要定义这样一个宏:
#define DOSOMETHING() foo1(); foo2();
这个宏的本意是,当调用DOSOMETHING()时,函数foo1()和foo2()都会被调用。但是如果你在调用的时候这么写:
if(a>0)
DOSOMETHING();
因为宏在预处理的时候会直接被展开,你实际上写的代码是这个样子的:
if(a>0)
foo1();
foo2();
出现了问题,因为无论a是否大于0,foo2()都会被执行,导致程序出错。
那么仅仅使用{}将foo1()和foo2()包起来行么?比如:
#define DOSOMETHING() { foo1(); foo2(); }
我们在写代码的时候都习惯在语句右面加上分号,如果在宏中使用{},代码里就相当于这样写了:“{…};”,展开后就是这个样子:
if(a>0)
{
foo1();
foo2();
};
很明显,这是一个语法错误(大括号后多了一个分号)。
在所有可能情况下,期望我们写的多语句宏总能有正确的表现几乎是不可能的。你不能让宏表现的像函数一样—在没有do/while(0)的情况下。
如果我们使用do{…}while(0)来定义宏,即:
#define DOSOMETHING() \
do{ \
foo1();\
foo2();\
}while(0)\
这样,宏被展开后,上面的调用语句才会保留初始的语义。do能确保大括号里的逻辑能被执行,而while(0)能确保该逻辑只被执行一次,就像没有循环语句一样。
总结:在Linux和其它代码库里的,很多宏实现都使用do/while(0)来包裹他们的逻辑,这样不管在调用代码中怎么使用分号和大括号,而该宏总能确保其行为是一致的。
- 变量
<存储类型> <数据类型> 变量名;
存储类型
auto register static volatile const extern 6种存储类型
数据类型
int char float int a[] int *p enum union struct
变量名
1)、变量名只能由数字、字母、下划线组成,不能以数字开头on(√) _h(√) -w(×) 9test(×) test9(√)
2)、不能和关键字重名(32个关键字)
auto register static volatile const extern 6
void char short int long struct union enum float
double signed unsigned 12
typedef 1
sizeof 求类型大小的关键字 1
if else switch case do while goto for 8
return continue break default 4
3)、见名思意(一般英文的简写)
max min
4)、严格区分大小写
on
On light_on LigntOn