i++与++i的运算求助

来源:百度知道 编辑:UC知道 时间:2024/05/16 17:00:01
i++与++i的运算求助
请问下列的结果是甚么呢?
i=1
(一)
k=(i++)+(i++)+(i++)

(二)
k=(++i)+(++i)+(++i)
tc中二目运算,vc中多目运算

这样的表达式的求值顺序是没有定义的。因为分号是一个顺序点,而二元加号不是一个顺序点,相邻顺序点之间的表达式的求值顺序是任意的,并且它们的副作用只在下一个顺序点之后才生成。不管是
k = (i++) + (i++) + (i++);
还是
k = (++i) + (++i) + (++i);
这里分号是一个顺序点,理论上所有++操作和赋值操作的副作用都要在分号之后才生成。但是这一点并不是强制编译器必须要等到分号结束之后才执行赋值操作,只是规定相邻两个顺序点之间的表达式求值所产生的副作用只有等到下一个顺序点结束才是确定的。而在这个顺序点结束之前,编译器对位于该个顺序点和前一个顺序点之间的表达式以任意顺序求值。就是说,你上面的这每个表达式中的三个++i(或者i++)的求值顺序是任意的,编译器想先做哪个就先做哪个。而每做一个,你都想依赖另一个的副作用。但副作用要到分毫结束才是确定的,所以这个时候编译器想怎样取舍都是可以的,不管++i还是i++它都既可以取没加1之前的值也可以取加1后的值来作为++i或者i++的值,这样每次都有不同的取舍,等到分号结束,你得到的k的值当然就可能有不同的情况了。你这两个表达式都违反了C语言有关顺序点的规定,编译器给出的值也具有一定的任意性,没有人能确切地告诉你它们的值,你只能去问编译器。不同的编译器可能会给出不同的值,就像楼上的两位得到的结果一样。如果,对上面的解释不太明白,你就应该好好参考一下顺序点的定义和作用了。总之,像i++(或者++i)这类含副作用的表达式,不要揉在一块儿,宁可多声明几个变量都好:
int r, s, t;
r = ++i;
s = ++i;
t = ++i;
k = r + s + t;

(一) 3
(二) 6

(一) 3
(二) 10

我考 用gcc编译运行结果
跟Turbo c还不一样???

6
9
tc中的运行结果