关于#c语言#的问题

img


(!a)不是为真吗,那么为什么不直接执行x--呢?我写出来的答案是34,但是正确答案为4

前面走了,后面也走了,最终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了么

img

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7735023
  • 你也可以参考下这篇文章:#c语言判断输入的合法性
  • 你还可以看下c语言参考手册中的 c语言-成员访问与间接
  • 除此之外, 这篇博客: 再谈C语言宏定义中的 ##运算符 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
    1. 作用

      用来连接前后两个(宏)变量。

    2. 举例

      #define MK_ID(n) i##n
      int MK_ID(1)MK_ID(2);
      

      预编译后声明变为:

      int i1, i2, i3;
      
    3. 注意事项

      • ##连接符生成的新记号(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__为了当…可变参数传入为空时,编译不报错。


  • 您还可以看一下 黄强老师的精通C语言指针课程中的 什么是指针?小节, 巩固相关知识点