【发布时间】:2020-06-01 17:57:17
【问题描述】:
#define MAX(a,b) ((a)>(b) ? (a) : (b))
int main(void) {
int a=2;
int b=3;
int c = MAX(a++,b++); // c=((a++)>(b++) ? (a++) : (b++));
printf("\na= %d", a);// a=3
printf("\nb= %d", b);//b=5
printf("\nc= %d", c);//c=4
a=3;
b=2;
cc = MAX(a++,b++); // c=((a++)>(b++) ? (a++) : (b++));
printf("\na= %d", a); // a=5
printf("\nb= %d", b); //b=3
printf("\nc= %d", c); //c=4
return 0;
}
我想知道为什么 c 没有评估为 5。
在我看来,评估顺序应该是:
- 首先 a 和 be 在
(a++)>(b++)中递增 - 例如,如果第一个更大,则三元运算符
c=((a++)>(b++) ? (a++) : (b++)),转到(a++),所以a再次递增。 - 三元表达式的结果,它是一个两倍的增量,
应分配给
c,然后c应具有更大的值 增加了两倍,即 5。但是,我得到 4。我怀疑 最后发生更大价值的第二次增量,但我不能 解释原因,因为括号似乎表明 作业在最后。
有什么想法吗?
【问题讨论】:
-
后缀 ++ 运算符返回之前的值并递增变量。尝试使用前缀 ++ 运算符
++a得到 5。 -
请注意,在某些国家/地区使用带有此类参数的宏会被视为刑事犯罪。
-
宏不是函数,就像经常说的那样。
-
关于“括号似乎表明分配在末尾”:括号对副作用没有影响。
++增加对象的效果是一个副作用。它通常与表达式的评估分开,不受括号的影响。 (可能会受到表达式中的序列点和其他排序规则的影响。) -
不相关的建议:更喜欢在 printf 的末尾打印
"\n",即:printf("%d%s%f\n", ...)而不是printf("\n%d%s%f", ...)