这两个都是未定义行为,因为(y++)+(y++)+(y++)里面没有顺序点,所以你无法保证执行完第一个y++之后,y的值是否增加了,如果增加了,那么第二个y++就会是6。
只有顺序点才能确定一个副作用被实现,在这里,副作用就是确保y++之后,y加1。
下面的那个++y亦是同理。
至于什么是顺序点,可以参考这个:
C/C++语言定义(语言的参考手册)明确定义了顺序点的概念。顺序点位于:
1. 每个完整表达式结束时。完整表达式包括变量初始化表达式,表达式语句,return语句的表达式,以及条件、循环和switch语句的控制表达式(for头部有三个控制表达式);
2. 运算符 &&、||、?: 和逗号运算符的第一个运算对象计算之后;
3. 函数调用中对所有实际参数和函数名表达式(需要调用的函数也可能通过表达式描述)的求值完成之后(进入函数体之前)。
这实在是个令人纠结的问题。
C语言中区分前自增与后自增,它们都有副作用,尤其是后自增。
前自增可能更好一点,它不产生临时变量,效率更高一些。
++y相当于:y=y+1;在变量的使用之前先自增。
y++相当于:y; 其它语句... y=y+1;也就是使用它时,它的值不变,在其使用之后的某一时刻但在再次使用它前其值加一。而且不同的编译器不一定有一致的实现行为。
a=(y++)+(y++)+(y++) 这是一条语句,通常的编译器实现会将此语句一次性扫描完成。这种情况下,y++会保持其值不变,此语句完成后,将y的值递增3次。
b=(++y)+(++y)+(++y)这也是一条语句,编译器扫描完此语句后,先将y递增3次,再作+运算,将运算结果赋予b,此时b应该为24。 但是不同的系统及编译器不一定这样实现,还有可能y依次递增,其结果是21。
printf("%d\n",++i);//9
i=9
printf("%d\n",--i);//8
i=8
printf("%d\n",i++);//8
i=9
printf("%d\n",i--);//9
i=8
printf("%d\n",-i++);//-8
i=9
printf("%d\n",-i--);//-9
i=8
前面是输出值,后面是执行该语句后的i值。-i++应该这样分,输出的是-i,执行后i自动加1。i的值始终是正的,最后2个输出的是-i。
第五个:-i
++是先把
-i输出,在i=i+1;则i
=9;输出为:
-8
第六个:
-i
--是先把-i输出,再i=i-1;则i=8;
输出为
-9;
输出负数是因前面的
-
符号.,而i是正数
a++和++a,
前一个先把a用了
然后再给a加一,后一个
先把a自己增加一
然后
再
做运算;
例如:
x=5;
y=++x;
x先加到6,然后再将x的值应用到表达式y=x中,y值为6
x,y都为6
x=5;
y=x++;
x为6,y为5.
同样,对于你的数组也适用!