回 帖 发 新 帖 刷新版面

主题:关于自增一个简单问题

i=5;
分别计算x,y,(两表达式是独立计算的)
x=(++i)+(++i)+(++i);    /*先自增再加


y=(i++)+(i++)+(i++);    /*先加再自增
TC结果是:

x=24
y=15
i=8


我看过解释,不理解,为什么两个算术加的方法不一样,我知道++i和i++的区别的!!

我怕是刚学C的 不清楚 希望大家解释清楚啊!

回复列表 (共13个回复)

沙发

在我的机器上 x=(++i)+(++i)+(++i);是等于22,另一个结果和你一样,估计的机器上是这么运算的,原则上运算是自右往左运算的,前曾是先自增再引用,那么,你有三次自增,你添加的括号改变了运算的顺序,先运算三个括号内的i,导致最后i=8,然后才执行+运算,所以8+8+8==24;
后自增是先引用后自增,你的三个括号只是导致了分别先取出i的值进行+运算5+5+5==15;然后再进行三次自增,i==8;
网上的说法也不一致,因机器而异

板凳

不好意思,我用vc2008,结果是x=24,y=24,i=11;第一个式子计算完后i=8,三个8相加为24.第二个式子先是三个8相加,结果也为24,然后i自增为11.

3 楼

[quote]在我的机器上 x=(++i)+(++i)+(++i);是等于22,另一个结果和你一样,估计的机器上是这么运算的,原则上运算是自右往左运算的,前曾是先自增再引用,那么,你有三次自增,你添加的括号改变了运算的顺序,先运算三个括号内的i,导致最后i=8,然后才执行+运算,所以8+8+8==24;
后自增是先引用后自增,你的三个括号只是导致了分别先取出i的值进行+运算5+5+5==15;然后再进行三次自增,i==8;
网上的说法也不一致,因机器而异[/quote]
再请教一个问题,"i++;"这个表示式出现在另一个表达式里,比如"(i++)+(i++);",
如果计算其中一个"(i++);"时,先引用,然后自增,那么这自增是在整个"(i++)+(i++);"表达式计算完再自增还是就计算完"(i++);"后就自增啊??

4 楼

用VC++6.0运行出来是:x=22,y=24,i=11!

5 楼

运行出来y=24,由这个结果可以知道(i++)+(i++)+(i++)是先计算完整个表达式的值以后i的值自增3次,最后i的值是11!

6 楼

再请教一个问题,"i++;"这个表示式出现在另一个表达式里,比如"(i++)+(i++);",
如果计算其中一个"(i++);"时,先引用,然后自增,那么这自增是在整个"(i++)+(i++);"表达式计算完再自增还是就计算完"(i++);"后就自增啊??
//---------------------------------
先计算完整个表达式后i才自增,在"(i++)+(i++);"这里,从结果上看,括号不起作用,括号的作用只是改变了原来自右向左的运算规则,即先引用两个i的值,然后再进行+运算

7 楼

[quote]运行出来y=24,由这个结果可以知道(i++)+(i++)+(i++)是先计算完整个表达式的值以后i的值自增3次,最后i的值是11![/quote]

呵呵 对不起 是我表达不清 ,x=(++i)+(++i)+(++i); 和 y=(i++)+(i++)+(i++);不是在一个程序里 我的意思是分别独立计算。所以计算y的表达式i初始值还是5,不是8,是我没表达清楚 不好意思!

8 楼

平级的自增运算的计算顺序是个未定义行为,所以写严谨的代码的时候应该避免这样的写法。平级自增的计算取值顺序完全是由编译器决定的,所以这个问题严格来讲没有实用意义。

9 楼

[quote]平级的自增运算的计算顺序是个未定义行为,所以写严谨的代码的时候应该避免这样的写法。平级自增的计算取值顺序完全是由编译器决定的,所以这个问题严格来讲没有实用意义。[/quote]
这个是我看过的经典的考自增的题目,其实我也觉得是无用的。

10 楼

主要不是无用,而是这道题的出题人多半是学TC出身的……印象比较深刻的也只有谭老头喜欢干这种把编译器特性当语言特性的事

我来回复

您尚未登录,请登录后再回复。点此登录或注册