printf()函数评估C中的前后减量

时间:2015-01-10 15:33:37

标签: c

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

输出打印0 2 0而非0 2 2。我无法理解,因为我假设printf()从右到左进行评估。

2 个答案:

答案 0 :(得分:4)

您的代码展示Unspecified behaviour。根据{{​​1}}标准文件,第6.5.2.2章,第10段:

  

实际参数中的函数指示符,实际参数和子表达式的评估顺序未指定,但在实际调用之前有一个序列点

同样,这会显示undefined behaviour,因为c99在两个序列点之间被多次修改 。根据第6.5章第2段:

  

在前一个和下一个序列点之间,对象的存储值最多只能通过表达式的计算修改一次。此外,先前的值应该是只读的,以确定要存储的值。

答案 1 :(得分:-1)

printf什么都不评估。编译器评估函数的参数(即生成目标代码的编译器),并且未指定在C中计算参数的顺序。因此编译器可以按任何顺序对它们进行评估。