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)
我的想法是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)
请让我知道我哪里错了?
问题是,函数参数的评估顺序没有定义,评估或参数之间没有序列点.所以,这句话
printf("%d %d\n",k=1,k=3)
Run Code Online (Sandbox Code Playgroud)
调用未定义的行为,因为您尝试多次修改同一个变量,而中间没有序列点.
一旦一个程序调用UB运行并且(如果)有一个输出,它无论如何都无法证明,输出可以是任何东西.