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中计算参数的顺序。 因此编译器可以按任何顺序对它们进行评估。