printf和cout有什么区别

时间:2013-04-03 05:26:34

标签: c++ c printf cout post-increment

以下是一些代码:

int x = 1;
printf("%d,%d,%d",x,x++,x);  //A  statement
cout<<x<<x++<<x<<endl; //B statement

我知道执行顺序是从右到左,而为什么A语句结果是“1,1,1” 和B语句结果是“112”???

我使用vs2008 使用调试模式:结果相同:2,1,2。 发布模式:结果不同:A:1,1,1,B:1,1,2

4 个答案:

答案 0 :(得分:1)

您使用printf的方式会导致未定义的行为。未指定对函数的参数的评估顺序。它们甚至不必以谨慎的单位进行评估,因为可以评估一个表达式的一部分,然后评估另一个表达式的一部分。这意味着如果您对评估顺序有某些依赖关系,则整个表达式可能会变得未定义。

operator <<调用cout也是如此。 <<不是序列点。 cout的不同子句的评估顺序完全没有说明。由于您在评估中具有与printf示例相同的依赖关系,因此您也在此处调用未定义的行为。

因此,对于两个表达式,您可能会得到相同的结果。您可能会得到不同的结果。当您评估其中任何一个时,守护进程可能会飞出您的鼻子。你无法分辨。

序列点和评估顺序的主题可能相当复杂。如果你想了解更多信息,我建议你看一下这个问题:

答案 1 :(得分:0)

使用printf,在调用printf之前评估所有参数(x = 1)。 使用cout,参数将按顺序进行评估和应用。 (至少就你的编译器而言)

答案 2 :(得分:0)

浏览this Article。 这很好。

重复this条。

但是,如果我们谈论printf()cout<<,请提供技术支持, 在执行printf语句时,它接受最后一个语句更改了变量的值,并且还将更改的值影响到下一个语句,而不是当前语句。

cout语句中,最近的值取自变量,因此,它直接影响当前语句。

希望你能说清楚。

答案 3 :(得分:0)

陈述A和B的结果相同。

        int x = 1;
        printf("%d,%d,%d",x,x++,x);  //A  statement
        //cout<<x<<x++<<x<<endl; //B statement
        return 0;

<强> STATEMENT A

     int x = 1;
    //printf("%d,%d,%d",x,x++,x);  //A  statement
    cout<<x<<","<<x++<<","<<x<<endl; //B statement
    return 0;

<强> STATEMENT B

结果/行为与编译器不一致。