关于C语言宏定义输出

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于C语言宏定义输出相关的知识,希望对你有一定的参考价值。

#define TOUPPER(c) ('a'<=(c)&&(c)<='z'?(c)-'a'+'A':(c))

设s是一个足够大的字符数组,i是int型变量,则以下代码段的输出是:

strcpy(s, "abcd");
i = 0;
putchar(TOUPPER(s[++i]));

奇怪,不应该是B吗?为何输出了D??解释下

宏定义就是字符串代替,先把整个东西代替进去 。
'a' < ( s[++i]) && ( s[++i]) < 'z' ? ( s[++i]) -'a' + 'A' : (s[++i] )
?: 这是三目运算符,从左到右。
先是'a' < s[++i] 这里是 'a' < s[1] = 'b' 成立
接下来是 s[++i] < 'z' 这里是 s[2] = 'c' < 'z' 也成立 。
所以是, ( s[++i]) -'a' + 'A' 这里其实就是小写转大写
这里是, s[3] = 'd' - 'a' + 'A' 。
结果 就是D 了。。。
这就是宏定义最容易出错的点。
参考技术A 表达式里面str[++i]被运算了3次,最后i=3;所以是D 参考技术B 宏定义,首先,它是定义一个变量并已经初始化了,就像你说的,将A定以后初始化为1000,作用域是整个文件(如果没有#ifndef和#endif);但是不包括字符串常量和字符常量的里面的A
是否可以解决您的问题?

以上是关于关于C语言宏定义输出的主要内容,如果未能解决你的问题,请参考以下文章

关于C语言宏定义,这样为啥不行

关于C语言参数化宏的问题?

C语言的宏定义问题

C语言的宏定义问题

关于三维向量加减乘除的C语言宏定义?

C语言中,宏替换与定义全局变量的区别是啥?