udi*_*043 1 c printf gcc assignment-operator
这是代码
int main()
{
int x=15;
printf("%d %d %d %d",x=1,x<20,x*1,x>10);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出是 1 1 1 1
我期待1 1 15 1
作为输出,
x*1
等于,15
但这里x*1
是1
,为什么?使用赋值运算符或修改内部值会printf()
导致undefined behaviour
?
您的代码会产生未定义的行为.函数参数评估不是相对于彼此进行排序的.这意味着修改对x
in的访问x=1
不会与其他访问相关,例如x*1
.行为未定义.
再一次,它是未定义的,不是因为你"使用了赋值运算符或修改了printf()中的值",而是因为你对与同一变量的其他访问无关的序列进行了修改访问.这段代码
(x = 1) + x * 1
Run Code Online (Sandbox Code Playgroud)
出于同样的原因,也有未定义的行为,即使printf
它没有.同时,这段代码
int x, y;
printf("%d %d", x = 1, y = 5);
Run Code Online (Sandbox Code Playgroud)
完全没问题,即使它"使用赋值运算符或修改printf()中的值".