如何评估printf()的参数?

时间:2014-04-03 11:38:52

标签: c

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
    int i = 2;
    printf("%d %d\n", ++i, ++i);
    i = 2;
    printf("%d %d\n", i++, i++);
    return 0;
}

输出:

4 4

3 2

我知道参数在printf()中从右向左传递。但如果我在第二行获得3 2,为什么我不能在第一行获得4 3?

3 个答案:

答案 0 :(得分:7)

这是undefined behavior

  

printf(“%d%d \ n”,++ i,++ i);

i在上述声明中被多次修改。

答案 1 :(得分:1)

您编写的代码属于编程语言的未定义行为。因为每个平台上的语言解析器可能是不同的。一些解析器从左到右读取,反之亦然。请参阅wiki link完整的信息

答案 2 :(得分:0)

你可以用堆栈的例子来考虑这种情况,即FILO。

在第二个printf语句printf("%d %d\n", ++i, ++i);

两个++我将从左到右依次进入堆栈。因为它的后增量,所以去的值将是2和2但是在出来时第一个值将是2而第二个值将是3.