2011-07-08 81 views
5

可能重复:
confused about printf() that contains prefix and postfix operators.printf使用堆栈?

我遇到与下面的代码段代码来了,

int main() { 
    int c = 100; 
    printf("\n %d \t %d \n", c, c++); 
    return 0; 
} 

我预计输出为100 & 101,但我得到的输出as

101  100 

任何人都可以帮助我知道为什么?从右到左,从而第一C++

+0

我猜测代码是以相反的顺序来评估printf参数,因此首先插入来自“C++”参数的c,然后插入先前的c参数,然后该参数已经增加。 如果你想为第二个值做1加c,并且增加c,我想你必须使用printf(“\ n%d \ t%d \ n”,c,c + 1)。 C++; –

回答

-3

printf的作品被执行(C = 100)C++执行和C = 101再经过 因此101和100是输出 http://en.wikipedia.org/wiki/Printf

+2

-1。这是错误的。不能期望调用未定义行为的结果是什么。 –

+0

其不undefinef http://en.wikipedia.org/wiki/Printf阅读维基atleast ..默认情况下,printf是正确对齐 – ashmish2

+2

@ ashmish2:你很混淆printf如何处理它的参数,以及参数如何“准备”在他们交给printf之前在呼叫地点。第二部分(函数调用中参数的评估顺序)未由标准规定。 – Mat

5

没有保证是否c左侧,或右侧的c++,将首先进行评估。

的功能参数评价的顺序是Unspecifeid因此按照标准未定义行为

作为每部分C++标准 1.9:

“某些其它方面和抽象机的操作在本国际标准被描述为unspecifiedfor example, order of evaluation of arguments to a function)可能时,本国际标准。定义了一组允许的行为,它们定义了抽象机器的非确定性方面。“

+0

您的问题中有一个大胆的“未指定行为”。但是这不是很有用,因为行为是不确定的。所以你应该至少有一个更大胆的“未定义行为”。 –

9

C和C++标准并不保证函数参数的评估顺序。大多数编译器都会从右向左计算参数,因为这是使用cdecl调用约定将它们压入堆栈的顺序。

+0

男人!如果是未定义的行为,您必须在此快速回答这些“为什么我的程序会执行”类型的问题。 –

+0

http://en.wikipedia.org/wiki/Printf它不是undefined – ashmish2

+0

@ ashmish2:David Hammens评论中的''不是'printf'(它是一个明确定义的函数),而是'c,C++ “论点。这是不明确的。关于这个主题请参阅前面的Q,http://stackoverflow.com/questions/3109475/confused-about-printf-that-c​​ontains-prefix-and-postfix-operators – MSalters

1

如果您刚刚使用printf ("%d\n", c++)printf ("%d\n", c),结果在任何情况下均为100。在一次函数调用中同时打印c和C++是未定义的行为