这是一些更奇怪的宏观行为,我希望有人能够阐明:
#define MAX(a,b) (a>b?a:b)
void main(void)
{
int a = 3, b=4;
printf("%d %d %d\n",a,b,MAX(a++,b++));
}
输出为 4 6 5。 b 的值增加两次,但在 MAX 显示其值之前。谁能告诉我为什么会发生这种情况以及如何预测这种行为? (为什么应该避免使用宏的另一个例子!)
宏进行文本替换。您的代码相当于:
printf("%d %d %d\n",a,b, a++ > b++ ? a++ : b++);
这有未定义的行为,因为b
可能会递增(在第三个参数末尾),然后在没有中间序列点的情况下使用(在第二个参数中)。
但与任何 UB 一样,如果您盯着它看一会儿,您可能能够解释一下您的实现实际上做了什么才能产生您所看到的结果。参数的求值顺序未指定,但在我看来,参数似乎是按从右到左的顺序求值的。所以首先,a
and b
增加一次。a
不大于b
, so b
再次递增,条件表达式的结果为5
(也就是说,b
在第一个增量之后和第二个增量之前)。
这种行为是不可靠的 - 由于以不同的顺序评估参数,另一个实现或另一天的相同实现可能会给出不同的结果,或者理论上甚至可能由于序列点问题而崩溃。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)