关于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语言宏定义输出的主要内容,如果未能解决你的问题,请参考以下文章