App*_*ter 4 c macros undefined-behavior
这里有一些奇怪的宏观行为我希望有人可以阐明:
#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++));
}
Run Code Online (Sandbox Code Playgroud)
输出为4 6 5. b的值增加两次,但在MAX显示其值之前不增加.任何人都可以告诉我为什么会这样,以及如何预测这种行为?(应该避免使用宏的另一个例子!)
宏进行文本替换.您的代码相当于:
printf("%d %d %d\n",a,b, a++ > b++ ? a++ : b++);
Run Code Online (Sandbox Code Playgroud)
这具有未定义的行为,因为b可能会增加(在第三个参数的末尾),然后使用(在第二个参数中)而没有插入序列点.
但是和任何UB一样,如果你盯着它看一段时间,你可能会想出你的实现已经实现了什么来解释你看到的结果.参数的评估顺序是未指定的,但它看起来好像参数已经按从右到左的顺序进行了评估.因此,首先,a和b递增一次.a不大于b,因此b再次递增并且条件表达式的结果是5(也就是说,b在第一个增量之后和第二个增量之前).
这种行为是不可靠的 - 另一个实现或另一天的相同实现可能会因为以不同的顺序评估参数而给出不同的结果,或者理论上甚至可能因序列点问题而崩溃.