这是代码
int main()
{
int x=15;
printf("%d %d %d %d",x=1,x<20,x*1,x>10);
return 0;
}
输出为1 1 1 1
我期待1 1 15 1
作为输出,
x*1
等于15
,但此处x*1
为1
,为什么?
使用赋值运算符或修改printf()
中的值会导致undefined behaviour
?
答案 0 :(得分:7)
您的代码会产生未定义的行为。函数参数评估不是相对于彼此进行排序的。这意味着修改x
中对x=1
的访问权限与其他访问无关,例如x*1
中的访问权限。行为未定义。
再一次,它是未定义的,不是因为您使用了赋值运算符或修改了printf()&#34;中的值,而是因为您对排序的变量进行了修改访问与其他访问同一个变量的关系。这段代码
(x = 1) + x * 1
出于同样的原因,也有未定义的行为,即使其中没有printf
。同时,这段代码
int x, y;
printf("%d %d", x = 1, y = 5);
非常好,即使它&#34;使用赋值运算符或修改printf()&#34;中的值。
答案 1 :(得分:3)
在函数调用中,可以按任何顺序调用函数参数。
由于其中一个参数修改了x
而其他参数访问了它,结果是未定义的。
答案 2 :(得分:1)
标准规定:
在前一个和下一个序列点之间,对象的存储值最多只能通过表达式的计算修改一次。此外,只能访问先前值以确定要存储的值。
除非在子表达式之间存在序列点,否则不会对子表达式强加评估顺序,而不需要一些未指定的评估顺序set %%A=%appData%\winscp
。