什么叫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))。
一个关于i++和++i的初级问题……
-
- 帖子: 9
- 注册时间: 2009-07-29 18:14
Re: 一个关于i++和++i的初级问题……
上次由 宇智波殤 在 2009-08-02 14:49,总共编辑 2 次。
- BigSnake.NET
- 帖子: 12522
- 注册时间: 2006-07-02 11:16
- 来自: 廣州
- 联系:
Re: 一个关于i++和++i的初级问题……
15 楼的的确没答案宇智波殤 写了:什么叫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)。
代码: 全选
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的初级问题……
他那个确实没答案,我看错了,以为他在说LZ的问题没答案,抱歉。BigSnake.NET 写了:15 楼的的确没答案宇智波殤 写了:什么叫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)。
第二行发生了三件事代码: 全选
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++ 不是一个左值,所以第二个 ++ 是不合法的,最后得到的是编译错误
- wenstream
- 帖子: 186
- 注册时间: 2008-06-18 22:02
Re: 一个关于i++和++i的初级问题……
可能为1,也可能为2,这个求值顺序取决于编译器实现。ttand 写了:int i=1;
i=i++;
然后i等于几???
但是我知道如果我写风格这么差的代码,会被团队踢出街上去。。。。。。

- jiefey
- 帖子: 144
- 注册时间: 2009-07-24 0:14
Re: 一个关于i++和++i的初级问题……

- -我不是刻意的要去知道答案,只是突然看书看到,然后自己想不通,就来发帖问问咯……

代码: 全选
好东西>> http://yisnet.com/go/
- ttand
- 帖子: 1745
- 注册时间: 2005-08-22 14:05
- 来自: 离开北京
Re: 一个关于i++和++i的初级问题……
不赞同。。。。。cnkilior 写了:刻意去区分/使用i++,++i是属于没事找抽型!
适当的安排他们,可以让循环体统一化。减少代码量,也能提高程序效率。更有价值的是它可以提高代码可读性。
当然,前提是要理解它的作用咯。
错过好多好贴,没占到广告位后悔啊