C - printf的输出说明("%d%d \n",k = 1,k = 3);

jay*_*ayd 5 c printf function-calls variable-assignment sequence-points

如何解释下面代码的输出:

include <stdio.h>

int main(void) {
    int k;
    printf("%d %d\n",k=1,k=3);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Ideone Link

我的想法是1将分配给k变量然后1打印.同样3将分配给k和输出3.

预期产出

1 3
Run Code Online (Sandbox Code Playgroud)

实际产出

1 1
Run Code Online (Sandbox Code Playgroud)

我是从外推

int a;
if (a = 3) { 
    ...
} 
Run Code Online (Sandbox Code Playgroud)

等于

if (3) { 
    ... 
}
Run Code Online (Sandbox Code Playgroud)

请让我知道我哪里错了?

Sou*_*osh 7

问题是,函数参数的评估顺序没有定义,评估或参数之间没有序列点.所以,这句话

 printf("%d %d\n",k=1,k=3)
Run Code Online (Sandbox Code Playgroud)

调用未定义的行为,因为您尝试多次修改同一个变量,而中间没有序列点.

一旦一个程序调用UB运行并且(如果)有一个输出,它无论如何都无法证明,输出可以是任何东西.