#include<stdio.h>
main()
{
int a=10;
printf("\n %d %d", a, a++); //11 10
a=10;
printf("\n %d %d", a++, a); //10 11
a=10;
printf("\n %d %d %d ", a, a++,++a); //12 11 12
}
Run Code Online (Sandbox Code Playgroud)
运行之后,我得到了评论中给出的输出.据我所知,第一次输出是预期的,因为printf的执行从右到左但不能理解第二和第三
函数参数评估中没有"从右到左".当评估函数参数时,评估的顺序是未指定的,并且在评估单独的参数之间没有序列点.这意味着在这个过程中绝对没有时间顺序.可以按任何顺序评估参数,并且可以以任何方式将评估过程交织在一起.
但是,您的代码会遇到更严重的问题.调用所有三个语句printf产生不确定的行为(UB),因为它们要么使试图修改同一个对象(a)两次没有改变之间的序列点(第三通话),或者他们试图修改一个对象,并读它的独立目的(第一次和第二次通话).因此,甚至提及评估顺序还为时过早.您的代码行为未定义.
没有一个输出能够真正符合意料之外的条件。函数的所有参数在进入函数本身之前都会被评估 - 但它们相对于彼此的评估顺序是未指定的,因此所有这些结果都是允许的。正式地,您的最后一个(有两个单独的incrementing实例a)具有未定义的行为,因此它根本不必做任何明智的事情。