printf()中赋值运算符的问题

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*11,为什么?使用赋值运算符或修改内部值会printf()导致undefined behaviour

AnT*_*AnT 7

您的代码会产生未定义的行为.函数参数评估不是相对于彼此进行排序的.这意味着修改对xin的访问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()中的值".