| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1086 人关注过本帖
标题:[讨论]关于++的问题!!
取消只看楼主 加入收藏
genie2014
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2006-6-21
收藏
 问题点数:0 回复次数:6 
[讨论]关于++的问题!!

在不同的编译其中,i++和++i有着不同的解释,可是为什么在同一个编译器里,利用不同的语句会有不同的解释呢?
(由于我在整理的时候数据有些乱,所以可能一些结果会有问题,但是只要大家明白我的意思就可以了.)
(以下,左边均为第一中情况,右边为相应的第二中情况):

注意:有我希望易于比较,所以分成两边来写,可是好象在排版上有些问题,所以建议大家把下面的内容复制到记事本里,然后把记事本最大化,这样比较清楚!!!!!!!

1.在VC++6.0里:
一:
#include <iostream.h> #include <iostream.h>
void main() void main()
{ {
int i=3,count; int i=3;

count=(i++)+(i++)+(i++); ----------------------> cout<<(i++)+(i++)+(i++)<<endl;
cout<<count<<endl; cout<<i<<endl;
cout<<i<<endl; }
}

这时:i=6;count=9 这时:i=6; (i++)+(i++)+(i++)=9
"左边的结果和右边的相等"

二:
#include <iostream.h> #include <iostream.h>
void main() void main()
{ {
int i=3,count; int i=3;

count=(++i)+(++i)+(++i); ----------------------> cout<<(++i)+(++i)+(++i)<<endl;
cout<<count<<endl; cout<<i<<endl;
cout<<i<<endl; }
}

这时:i=6;count=16 这时:i=6; (++i)+(++i)+(++i)=25
"现在注意:左边的结果和右边的不一样了"

2.在TC2.0中:这种情况依然
一:
#include <stdio.h> #include <stdio.h>
void main() void main()
{ {
int i=3,count; int i=3;

count=(i++)+(i++)+(i++); -----------------------------> printf("%d\n",(i++)+(i++)+(i++));
printf("%d\n",count); printf("%d\n",i);
printf("%d\n",i); }
}

这时:i=6; count=9 这时:i=6; (i++)+(i++)+(i++)=12
"这是候左右就不同了!!"


二:
#include <stdio.h> #include <stdio.h>
void main() void main()
{ {
int i=3,count; int i=3;

count=(++i)+(++i)+(++i); -----------------------------> printf("%d\n",(++i)+(++i)+(++i));
printf("%d\n",count); printf("%d\n",i);
printf("%d\n",i); }
}

这时: i=6; count=18 这时:i=6; (++i)+(++i)+(++i)=15
"这时候两边也不一样"

3.在Jdk6中:由于好奇心,我把相同的概念拿到Java的编译器Jdk6中调试
不过和VC++6.0和TC2.0不同,在两中情况下,输出结果均为:i=6; (i++)+(i++)+(i++)=12; (++i)+(++i)+(++i)=15

我想:在VC++6.0和TC2.0下,按道理来说两中情况结果应该是一样的,因为这两种情况只是用不同的语句完成相同的效果,可是他们的结果为什么不一样????

对于以上的论述,希望大家可以谈出自己的观点!!!!

搜索更多相关主题的帖子: 记事本 include 编译器 
2007-02-09 22:37
genie2014
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2006-6-21
收藏
得分:0 
没什么别的意思,只是最近在学Java,看到里面的i++和++i和C里面的不一样,所以就把三个语言的不同情况对比了一下.纯粹是没事研究研究.

2007-02-09 23:46
genie2014
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2006-6-21
收藏
得分:0 
终于明白了TC里面的运行结果.
第一种情况:count=(++i)+(++i)+(++i),这里面的3个(++i)其实是同一个变量,也就是说每个(++i)相当于自增3次,原来i为3,现在i就为6,所以count=6+6+6=18
第二中情况:printf("%d\n",(++i)+(++i)+(++i)),这时和上面的运算步骤不同,上面是将后面的(++i)算完后赋值给count,而这里的步骤是逐个求(++i)的值,也就是说(++i)+(++i)+(++i)=4+5+6=15,而此时的i值因为每次自增1所以就为6
(i++)的情况类似.
其他的两种语言还没弄明白,不过可能也和这种原因相关!

2007-02-10 12:25
genie2014
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2006-6-21
收藏
得分:0 
我来回答吧,之所以count=(i++)+(i++)+(i++)的值会等于9是因为赋值号"="的原因:
因为在赋值表达式中,先算表达式右边的,然后再将右边表达式中的值赋给表达式左边的变量.明白了这个,那我们来看看count=(i++)+(i++)+(i++),先来算表达式右边(i++)+(i++)+(i++)的值,由于i++是先参与运算,然后再自增1,所以自增表达式(i++)的值就是原来的3,同理后面的两个(i++)值都为3,那么3个(i++)相加自然得到9,而如果此时输出i的值,由于运算已经结束i自增了3次,所以是6.
与之不同:cout<<i++<<endl;
cout<<i++<<endl;
cout<<i++<<endl;
第一个i自增一次为4,第二个i在4的基础上再自增一次就变成了5,第三个同理就成了6.
不知道上面的答案能否说的明白.好好想想吧.

2007-02-10 19:03
genie2014
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2006-6-21
收藏
得分:0 
你的算法不对,count=(++i)+(++i)+(++i),这里面的3个(++i)其实是同一个变量,也就是说每个(++i)相当于自增3次,原来i为3,现在i就为6,所以count=6+6+6=18
我不知道你的16是怎么来的,结果应该是18.
你算的15其实应该是printf("%d\n",(++i)+(++i)+(++i)),这里的步骤是逐个求(++i)的值,也就是说(++i)+(++i)+(++i)=4+5+6=15
于是可以得知:当count=(++i)+(++i)是,这里就是你所说的重复两遍,它的值应该是i自增两次,原来为3,所以现在为5,这样以来,count=5+5=10,下面的重复3次等等都是这个道理.
其实你算的都没有错,只是你算的情况是属于printf("%d\n",(++i)+(++i)+(++i))这种,而不是count=(++i)+(++i)+(++i)这种.再仔细想想,哈哈

2007-02-10 22:58
genie2014
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2006-6-21
收藏
得分:0 

还有,我在这里再说明一下,我用的是TC2.0编译的,用的是C语言.这种i++和++i的问题在不同的编译系统和语言中或多或好都有些不一样,我现在也只能解释TC里面的情况,而VC++6.0和Java我现在还没想通,哈哈,看来路还很长呀,哈哈.
注意一下编译系统


2007-02-10 23:02
genie2014
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2006-6-21
收藏
得分:0 

你没看仔细,我上面所说的解释全部属于TC2.0部分,其他的两种语言我还没弄明白呢!!!!!!看看我在5楼发的帖子的第一句话,要细心呀!!!!!


2007-02-11 10:49
快速回复:[讨论]关于++的问题!!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.032338 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved