printf(..)参数的执行顺序是什么?

Tom*_*tro 0 c printf

我想做这样的事情printf("%d,%d",array[c], array[c+1]),只有一个变量在每次迭代中都会增加.我写了下面的代码,我期待"1,2"到stdout,我错了:

#include <stdio.h>
int main()
{
    int c = 1;
    printf("%d,%d",c++,c++); /* 2,1 */
    //printf("%d,%d",c,c++);   /* 2,1 */
    //printf("%d,%d",c++,c);   /* 1,2 */
}
Run Code Online (Sandbox Code Playgroud)

如果我尝试做printf("%d,%d",c++,c)和 printf("%d,%d",c,c++),我可以看到,有没有定义的"C++"语句的执行顺序.

有人可以解释我写的代码是如何编译的吗?为什么以及如何根据"c ++"语句的位置进行更改.

Ste*_*ner 5

函数调用中参数的求值顺序是未指定的,并且在这些表达式的求值之间没有序列点.这意味着 - 如果一个表达式改变作为副作用的对象(如值c)也被另一个表达式访问 - 这些表达式的结果将是不可预测的.因此,该语言将此类情况定义为未定义的行为(例如,参见此在线C标准草案):

6.5表达式

2.)如果对标量对象的副作用相对于对同一标量对象的不同副作用或使用相同标量对象的值进行的值计算未被排序,则行为未定义....