90分解决一个i++和++i有关问题
90分解决一个i++和++i问题。
#include <stdio.h>
int main()
{
int i=1,res;double d=1.0;
d++;
printf("d=%lf\n",d);
printf("i++=%d\n",i++);
printf("i=%d\n",i);
printf("++i=%d\n",++i);
printf("i=%d\n",i);
res=i++ + ++i;
printf("res=%d,i=%d\n",res,i);
return 0;
}
当程序运行到:printf("i=%d\n",i);时,i=3; 那么继续运行至:res=i++ + ++i;结果为8,是:3+5=8,还是4+4=8 ?
运行到这一句语句时,不懂, 因为,根据i++语法定义“先运算后自增,用++之前的数参与运算”;那么res=i++ + ++i;中的i++应该是3,++i应该是4,加起来整个等式应该是:7,但是结果是8。请各位大牛麻烦解答,不胜感激,最好把整个运算过程详细下一下好理解,本人初学不是很懂。
------解决方案--------------------
不要在一个表达式里面对同一个变量修改2次以上。这个是有副作用的
------解决方案--------------------
res=i++ + ++i
i=3
i++ 此时i=3,运行此句之后i=4
++i 还没执行++i时i=4. ++i应该是自加在参与+运算吧,所以i=5之后参与+运算
3+5=8
不知道是不是如此,求真相。。。
新手啊,我也要学习
------解决方案--------------------
++i
i++
这玩意只要记住
前者返回是加1后的值,是一个左值
后者返回的是原来的值,是一个右值
就够了,其他那些复杂的表达式都是拿来忽悠人的
------解决方案--------------------
res=i++ + ++i具有副作用的表达式就要分开写,像这样有歧义的表达式尽量不要在程序中出现。
------解决方案--------------------
在+是从左往右运算,而=号是从右往左运算运算(应该所有的c++书上都有的),编译器自己把式子理解成了(i++)+(++i),先计算第一个++则返回了3,但i已经成了4,而后计算第二个++,先+1然后返回了5,然后进行了+运算,然后进行=赋值运算。
接着你想想res=++i,i++后会出现什么?
------解决方案--------------------
应该是3+5等于8
分解步骤(a,b是中间变量):
1. a = i
2. i = i + 1
3. i = i + 1
4. b = i
5. res = a + b
------解决方案--------------------
res=i++ + ++i:
我的理解是4+4
运行到这一句时 首先执行++i 此时 i=4
在进行i+i=8
所以res=8 最后再将i++为5
不知道是否正确
------解决方案--------------------
自增(++)和自减(--)的运算顺序是从右到左的;
过多的使用自增自减符号会出现歧义,建议少用。
------解决方案--------------------
不能按照我们数学算式中从左到右的习惯来看,也并非从右至左
其实非常简单
举例 ++i + ++i
如果初始赋值i=3, 从左至右运算应为 4 + 5,从右至左应为5 + 4, 可实际运行结果等于 10
这说明i值,是在本行算式中所有"++i"(即“自增”)操作过完成后,才进行取值、计算的。
所以 i++ + ++i 应理解为:
所有"++i"自增操作完成后,再把i值代入算式相加,则为 4 + 4
运算结束后,由于式中有"i++",i最后再进行1次增1操作,值为5,
同理延伸,如果算式为 i++ + i++ + ++i + ++i 应为:
所有"++i"优先操作完成后,再把i值代入算式相加,则为 5 + 5 + 5 + 5 = 20
运算结束后,由于还有2个"i++", i必须在5的基础上再进行2次增1操作,值为7;
以上结论建立在TC2.0编译运行的结果上,其它编译器可自行测试。
楼主90分拿来
#include <stdio.h>
int main()
{
int i=1,res;double d=1.0;
d++;
printf("d=%lf\n",d);
printf("i++=%d\n",i++);
printf("i=%d\n",i);
printf("++i=%d\n",++i);
printf("i=%d\n",i);
res=i++ + ++i;
printf("res=%d,i=%d\n",res,i);
return 0;
}
当程序运行到:printf("i=%d\n",i);时,i=3; 那么继续运行至:res=i++ + ++i;结果为8,是:3+5=8,还是4+4=8 ?
运行到这一句语句时,不懂, 因为,根据i++语法定义“先运算后自增,用++之前的数参与运算”;那么res=i++ + ++i;中的i++应该是3,++i应该是4,加起来整个等式应该是:7,但是结果是8。请各位大牛麻烦解答,不胜感激,最好把整个运算过程详细下一下好理解,本人初学不是很懂。
------解决方案--------------------
不要在一个表达式里面对同一个变量修改2次以上。这个是有副作用的
------解决方案--------------------
res=i++ + ++i
i=3
i++ 此时i=3,运行此句之后i=4
++i 还没执行++i时i=4. ++i应该是自加在参与+运算吧,所以i=5之后参与+运算
3+5=8
不知道是不是如此,求真相。。。
新手啊,我也要学习
------解决方案--------------------
++i
i++
这玩意只要记住
前者返回是加1后的值,是一个左值
后者返回的是原来的值,是一个右值
就够了,其他那些复杂的表达式都是拿来忽悠人的
------解决方案--------------------
res=i++ + ++i具有副作用的表达式就要分开写,像这样有歧义的表达式尽量不要在程序中出现。
------解决方案--------------------
在+是从左往右运算,而=号是从右往左运算运算(应该所有的c++书上都有的),编译器自己把式子理解成了(i++)+(++i),先计算第一个++则返回了3,但i已经成了4,而后计算第二个++,先+1然后返回了5,然后进行了+运算,然后进行=赋值运算。
接着你想想res=++i,i++后会出现什么?
------解决方案--------------------
应该是3+5等于8
分解步骤(a,b是中间变量):
1. a = i
2. i = i + 1
3. i = i + 1
4. b = i
5. res = a + b
------解决方案--------------------
res=i++ + ++i:
我的理解是4+4
运行到这一句时 首先执行++i 此时 i=4
在进行i+i=8
所以res=8 最后再将i++为5
不知道是否正确
------解决方案--------------------
自增(++)和自减(--)的运算顺序是从右到左的;
过多的使用自增自减符号会出现歧义,建议少用。
------解决方案--------------------
不能按照我们数学算式中从左到右的习惯来看,也并非从右至左
其实非常简单
举例 ++i + ++i
如果初始赋值i=3, 从左至右运算应为 4 + 5,从右至左应为5 + 4, 可实际运行结果等于 10
这说明i值,是在本行算式中所有"++i"(即“自增”)操作过完成后,才进行取值、计算的。
所以 i++ + ++i 应理解为:
所有"++i"自增操作完成后,再把i值代入算式相加,则为 4 + 4
运算结束后,由于式中有"i++",i最后再进行1次增1操作,值为5,
同理延伸,如果算式为 i++ + i++ + ++i + ++i 应为:
所有"++i"优先操作完成后,再把i值代入算式相加,则为 5 + 5 + 5 + 5 = 20
运算结束后,由于还有2个"i++", i必须在5的基础上再进行2次增1操作,值为7;
以上结论建立在TC2.0编译运行的结果上,其它编译器可自行测试。
楼主90分拿来