3

像下面这样的一些代码:

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

4 回答 4

1

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

呼吁operator <<也是如此cout<<不是序列点。cout 的不同子句的评估顺序是完全未指定的。并且由于您对评估具有与示例中相同类型的依赖关系printf,因此您也在这里调用了未定义的行为。

因此,对于这两个表达式,您可能会得到相同的结果。你可能会得到不同的结果。当您评估其中任何一个时,守护程序可能会飞出您的鼻子。你就是说不出来。

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

于 2013-04-03T05:32:02.010 回答
0

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

于 2013-04-03T05:28:51.653 回答
0

浏览这篇文章。这是一个很好的。

本文的副本。

但是,技术上,如果我们谈论printf()or cout<<,在执行printf语句时,它会获取变量的最后一条语句更改的值,并且还会将更改的值影响到下一条语句,而不是当前语句。

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

希望你能清楚。

于 2013-04-03T05:29:31.227 回答
0

语句 A 和 B 的结果相同。

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

声明一

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

声明 B

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

于 2013-04-03T05:32:54.680 回答