c程序中的变长参数

c程序中的变长参数,c,post-increment,pre-increment,C,Post Increment,Pre Increment,在下面的节目中 #include<stdio.h> int main() { int a; a=5; printf("%d %d %d\n", a, a++ , a++); //statement 1 a=5; printf("%d %d %d\n", a, ++a , ++a); //statement 2 return 0; } 我的问题是为什么a++和++a有不同的行为。我知道在变长参数中,它是从左到右执行的,语句1是有意义的,但我想知道语句2的结果,我期望的结果是7 6

在下面的节目中

#include<stdio.h>
int main()
{
int a;
a=5; printf("%d %d %d\n", a, a++ , a++);  //statement 1
a=5; printf("%d %d %d\n", a, ++a , ++a);  //statement 2
return 0;
}

我的问题是为什么a++和++a有不同的行为。我知道在变长参数中,它是从左到右执行的,语句1是有意义的,但我想知道语句2的结果,我期望的结果是7 6..我在这里遗漏了什么吗?

函数参数的求值顺序未指定。无论顺序如何,您都有责任编写工作相同的代码。

这个问题每周被问六次。在你最喜欢的搜索引擎中输入“sequence point preincrement postincrement”(序列点预增量后增量)。我想你会问,因为如果你在谷歌上搜索,浏览器会崩溃,因为重复太多?请看:我知道在可变长度参数中,它是从左到右执行的。。。不,你没有!函数参数的求值顺序是未指定的,即使对于可变参数函数也是如此。@Martin James:新手们正在试图理解增量和求值顺序。他们使用试错法:他们尝试一些东西,打印一些东西并解释输出。。。未定义的行为,如指针,对于初学者来说是一个困难的概念。侮辱他们就像抱怨下雨一样没用。OP的代码只是未指定的行为还是在
a
?UB,@chqrlie上多次读取时未定义的行为。。。你说得对。如果标量对象上的副作用相对于同一标量对象上的不同副作用或使用同一标量对象的值进行的值计算是未排序的,则该行为是未定义的。如果一个表达式的子表达式有多个允许的顺序,则该行为是未定义的效果发生在任何订单中。”
7 6 5
7 7 7