关于define的问题

img


为什么结果是10而不是18,不应该是2+1+2+1=6,然后6*3嘛

img


这里为什么是F,不太明白,和运算符优先级有关系吗

  1. 这个的意思就是以后遇到有 add(x) 的地方就自动替换为 x + x,而不是 (x + x),因此 int sum = add(1 + 2) * 3 就等价于 int sum = 1 + 2 + 1 + 2 * 3,因此结果等于 10

  2. 优先级比较:* 高于 < 高于 ==,对于2 * 2 == 5 < 2 * 2 == 4,可以看成 (2 * 2) == (5 < (2 * 2)) == 4,即 4 == (5 < 4) == 4,即 4 == 0 == 4,然后得到 0 == 4,因此是FALSE,执行 else 语句

1、第一个将add(1+2)换成1+2+1+2后,sum=add(1+2)x3变成:sum=1+2+1+2x3=10;
2、优先级:“*”高于“<”高于高于“==”。

add(1+2)3在宏展开时扩展为 : 1+2+1+23
结果为10
如果希望结果是18应该 这样定义add:#define add(x) ((x)+(x))
宏是非常缺乏可读性的,建议使用函数而不是宏

第二个问题,因为<符号的优先级比==更高,正确的结合顺序是(22)==(5<(22))==4;
第一个==的结果是false,也就是0,那么0==4是错误的。

  1. define不是函数,只是在做字符的替换,就像先写好了一个模板,你想要的时候用一下,即你的sum = 1 + 2 + 1 + 2 * 3
  2. 详情可以去看一下运算符优先级,一般这么写的人已经被揍了