printf使用堆栈?

Foo*_*ooo 5 c++ programming-languages

可能重复:
对包含前缀和后缀运算符的printf()感到困惑.

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

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

我预计输出为100和101,但输出为

 101     100
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮我知道原因吗?

Fer*_*cio 9

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


Alo*_*ave 5

无法保证是c在左侧还是c++在右侧,首先评估.

函数参数的评估顺序是Unspecifeid,因此符合标准的Undefined Behavior.

根据C++标准的1.9节:

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


ash*_*sh2 -3

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

  • -1。这是错误的。无法预期调用未定义行为的结果是什么。 (2认同)
  • @ashmish2:您对 printf 如何处理其参数以及参数在传递给 printf 之前如何在调用站点“准备”感到困惑。标准未指定第二部分(函数调用中参数的求值顺序)。 (2认同)