C语言(2) 常量与变量

  1. 常量

字符常量

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)来包裹他们的逻辑,这样不管在调用代码中怎么使用分号和大括号,而该宏总能确保其行为是一致的。

  1. 变量
    <存储类型> <数据类型> 变量名;
    存储类型
    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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值