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

时间:2017-02-20 06:47:47

标签: c printf variable-assignment function-calls sequence-points

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

include <stdio.h>

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

Ideone Link

我的想法是1将被分配到k变量,然后会打印1。同样,3将分配给k,输出将为3

预期输出

1 3

实际输出

1 1

我是从

推断出来的
int a;
if (a = 3) { 
    ...
} 

等于

if (3) { 
    ... 
}

请告诉我哪里出错?

2 个答案:

答案 0 :(得分:7)

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

 printf("%d %d\n",k=1,k=3)

调用undefined behavior,因为您尝试多次修改同一个变量而没有序列点。

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

答案 1 :(得分:-4)

我希望你看到1 1的原因是因为两个赋值语句正在发生控件传递给printf

printf("%d %d\n",k=1,k=3);

因此,在回应下选票时,是的,这是未定义的行为,因此您不应指望此行为继续。但是,在确定输出为1 1而不是1 3的原因方面,我们可以推断,3的分配可能已被1的后续分配所踩踏。

当调用printf时,调用堆栈包含两个包含最终值k的条目,即1

你可以通过用一个在执行时打印一些东西的函数来替换它们来测试它。

示例代码:

#include <stdio.h>

int test(int n) {
    printf("Test(%d)\n", n);
    return n;
}

int main(void) {
    int k;
    printf("%d %d\n",k=test(1), k=test(3));
    return 0;
}

输出:

Test(3)
Test(1)
1 1