前面走了,后面也走了,最终x被4覆盖掉了呀
注意第二个if前面是没有else的,就是说不管前面走不走,后面都走
首先,a、b、c都被初始化为0,因此if(!a) x--会执行,x的值变为34。
接着,由于b也是0,else if(b)不会执行,直接跳过。
最后,由于c也是0,if(c)不会执行,else x=4会执行,将x的值更新为4。
因此,程序的最终输出结果为4
这里不就走else了么
作用
用来连接前后两个(宏)变量。
举例
#define MK_ID(n) i##n
int MK_ID(1), MK_ID(2);
预编译后声明变为:
int i1, i2, i3;
注意事项
##连接符生成的新记号(token),应该是一个合法的,有意义的记号。比如你不能连接 "c"和 “-”/ "+"等等类似标记来生成"c-"或者 “c+”,否者预编译时候就会提示错误;
##连接生成的新记号,但是如果生成的是某变量,依旧需要确保该变量名是合法的;
所有的注释代码,在 ##进行连接前,预编译器已经将他们翻译成空格符了,因此不能期望使用 ##来连接 /和 *来生成一个注释代码(当然如果不是闲得疼,应该也不会这么用);
##和前后两个记号之间的空格数可以随意。
常见使用场合如下
#define PRINT_LOG_ERROR(format, ...) \
{\
if(g_LogLevel <= LOG_LEVEL_DEBUG)\
{\
printf("[debug] %s:%d %s()| "format"\n", __FILE__, \
__LINE__, __func__, ##__VA_ARGS__);\
fflush(stdout);\
}\
}
##__VA_ARGS__为了当…可变参数传入为空时,编译不报错。