printf使用堆栈?

时间:2011-07-08 10:49:31

标签: c++ programming-languages

  

可能重复:
  confused about printf() that contains prefix and postfix operators.

我遇到了包含以下代码段的代码,

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

我预计输出为100& 101但我输出

 101     100

任何人都可以帮我解释原因吗?

4 个答案:

答案 0 :(得分:9)

C和C ++标准不保证功能参数的评估顺序。大多数编译器将从右到左评估参数,因为这是使用cdecl调用约定将它们推送到堆栈的顺序。

答案 1 :(得分:5)

无法保证左侧的c或右侧的c++是否会先评估。

根据标准,功能参数的评估顺序为 Unspecifeid ,因此未定义行为

根据 C ++标准的第1.9节

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

答案 2 :(得分:1)

如果您刚刚使用printf ("%d\n", c++)printf ("%d\n", c),则无论如何结果都是100。在一个函数调用中打印c和c ++就像未定义的行为

答案 3 :(得分:-3)

printf从右到左工作,所以先执行c ++(c = 100)然后执行C ++并且C = 101 因此输出101和100 http://en.wikipedia.org/wiki/Printf