一个关于i++和++i的初级问题……

软件和网站开发以及相关技术探讨
宇智波殤
帖子: 9
注册时间: 2009-07-29 18:14

Re: 一个关于i++和++i的初级问题……

#16

帖子 宇智波殤 » 2009-08-01 20:02

什么叫i++先使用再加1,这种语言真是让人感到糊涂。
应该是先计算表达式的值i的值再自增一这样才说得过去。
而且这个问题应该从副作用的角度来说明,先使用再加1这种说法简直就是糊弄事。

我来详细给LZ说下,
#include<stdio.h>
int main(void)
{
int i=3,j,k;
j=i++; // 先计算赋值运算符右边表达式的值,为3,故把3赋给j。由于副作用,i自增1,故此语句执行后i的值为4
k=++i; // ++i是先执行副作用,刚才i的值变为了4,此时副作用先产生,故i的值先自增1,之后i的值为5,此时赋值运算符后面的表达式的值为5,故把5赋给k
printf("i=%d,j=%d,k=%d\n",i,j,k); // 最后当然是i = 5, j = 3, k = 5
}

总结:
i++是先计算表达式的值,之后副作用才执行。
++i则是先执行副作用,后计算表达式的值。

另外:
如果一个变量在一个表达式中的值被更改多次,那么它的值是未知的(例如i+++(++i))。
上次由 宇智波殤 在 2009-08-02 14:49,总共编辑 2 次。
头像
BigSnake.NET
帖子: 12522
注册时间: 2006-07-02 11:16
来自: 廣州
联系:

Re: 一个关于i++和++i的初级问题……

#17

帖子 BigSnake.NET » 2009-08-01 20:33

宇智波殤 写了:什么叫i++先使用再加1,这种语言真是让人感到糊涂。
应该是先计算表达式的值i的值再自增一这样才说得过去。
而且这个问题应该从副作用的角度来说明,先使用再加1这种说法简直就是糊弄事。
15L所说的没有答案的应该是i+++++i。

我来详细给LZ说下,
#include<stdio.h>
int main(void)
{
int i=3,j,k;
j=i++; // 先计算赋值运算符右边表达式的值,为3,故把3赋给j。由于副作用,i自增1,故此语句执行后i的值为4
k=++i; // ++i是先执行副作用,刚才i的值变为了4,此时副作用先产生,故i的值先自增1,之后i的值为5,此时赋值运算符后面的表达式的值为5,故把5赋给k
printf("i=%d,j=%d,k=%d\n",i,j,k); // 最后当然是i = 5, j = 3, k = 5
}

总结:
i++是先计算表达式的值,之后副作用才执行。
++i则是先执行副作用,后计算表达式的值。

另外:
如果一个变量在一个表达式中的值被更改多次,那么它的值是未知的(例如i+++++i)。
15 楼的的确没答案

代码: 全选

int i = 1;
i = i ++;
第二行发生了三件事
1. 取出 i 的值
2. 自增
3. i 被赋值成第一步取出的值

++ 是后置的,所以 2 必定在 1 之后发生
由结合性, 3 在 1 之前发生。
那么 2 和 3 呢,不知道。所以至少有两种情况

case 1
取出 i 的值 1
i 自增,现在 i 是 2
i = 1, 现在 i 是 1

case 2
取出 i 的值 1
i = 1
i 自增,现在 i 是 2


至于 i+++++i ,编译器会解释成 ((i++)++) + i, 由于 i++ 不是一个左值,所以第二个 ++ 是不合法的,最后得到的是编译错误
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。
宇智波殤
帖子: 9
注册时间: 2009-07-29 18:14

Re: 一个关于i++和++i的初级问题……

#18

帖子 宇智波殤 » 2009-08-02 8:12

BigSnake.NET 写了:
宇智波殤 写了:什么叫i++先使用再加1,这种语言真是让人感到糊涂。
应该是先计算表达式的值i的值再自增一这样才说得过去。
而且这个问题应该从副作用的角度来说明,先使用再加1这种说法简直就是糊弄事。
15L所说的没有答案的应该是i+++++i。

我来详细给LZ说下,
#include<stdio.h>
int main(void)
{
int i=3,j,k;
j=i++; // 先计算赋值运算符右边表达式的值,为3,故把3赋给j。由于副作用,i自增1,故此语句执行后i的值为4
k=++i; // ++i是先执行副作用,刚才i的值变为了4,此时副作用先产生,故i的值先自增1,之后i的值为5,此时赋值运算符后面的表达式的值为5,故把5赋给k
printf("i=%d,j=%d,k=%d\n",i,j,k); // 最后当然是i = 5, j = 3, k = 5
}

总结:
i++是先计算表达式的值,之后副作用才执行。
++i则是先执行副作用,后计算表达式的值。

另外:
如果一个变量在一个表达式中的值被更改多次,那么它的值是未知的(例如i+++++i)。
15 楼的的确没答案

代码: 全选

int i = 1;
i = i ++;
第二行发生了三件事
1. 取出 i 的值
2. 自增
3. i 被赋值成第一步取出的值

++ 是后置的,所以 2 必定在 1 之后发生
由结合性, 3 在 1 之前发生。
那么 2 和 3 呢,不知道。所以至少有两种情况

case 1
取出 i 的值 1
i 自增,现在 i 是 2
i = 1, 现在 i 是 1

case 2
取出 i 的值 1
i = 1
i 自增,现在 i 是 2


至于 i+++++i ,编译器会解释成 ((i++)++) + i, 由于 i++ 不是一个左值,所以第二个 ++ 是不合法的,最后得到的是编译错误
他那个确实没答案,我看错了,以为他在说LZ的问题没答案,抱歉。
头像
wenstream
帖子: 186
注册时间: 2008-06-18 22:02

Re: 一个关于i++和++i的初级问题……

#19

帖子 wenstream » 2009-08-02 18:14

ttand 写了:int i=1;
i=i++;
然后i等于几???
可能为1,也可能为2,这个求值顺序取决于编译器实现。
但是我知道如果我写风格这么差的代码,会被团队踢出街上去。。。。。。 :em04
头像
jiefey
帖子: 144
注册时间: 2009-07-24 0:14

Re: 一个关于i++和++i的初级问题……

#20

帖子 jiefey » 2009-08-03 17:05

:em06 额……这问题我基本已经清楚了!呵呵,感谢大家的回帖阿,让我学到了不少~
- -我不是刻意的要去知道答案,只是突然看书看到,然后自己想不通,就来发帖问问咯…… :em11

代码: 全选

好东西>> http://yisnet.com/go/
头像
ttand
帖子: 1745
注册时间: 2005-08-22 14:05
来自: 离开北京

Re: 一个关于i++和++i的初级问题……

#21

帖子 ttand » 2009-08-06 12:24

cnkilior 写了:刻意去区分/使用i++,++i是属于没事找抽型!
不赞同。。。。。
适当的安排他们,可以让循环体统一化。减少代码量,也能提高程序效率。更有价值的是它可以提高代码可读性。

当然,前提是要理解它的作用咯。
错过好多好贴,没占到广告位后悔啊
回复