#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()
从右到左进行评估。
答案 0 :(得分:4)
您的代码展示Unspecified behaviour。根据{{1}}标准文件,第6.5.2.2章,第10段:
实际参数中的函数指示符,实际参数和子表达式的评估顺序未指定,但在实际调用之前有一个序列点。
同样,这会显示undefined behaviour,因为c99
在两个序列点之间被多次修改 。根据第6.5章第2段:
在前一个和下一个序列点之间,对象的存储值最多只能通过表达式的计算修改一次。此外,先前的值应该是只读的,以确定要存储的值。
答案 1 :(得分:-1)
printf什么都不评估。编译器评估函数的参数(即生成目标代码的编译器),并且未指定在C中计算参数的顺序。因此编译器可以按任何顺序对它们进行评估。