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