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

在不同的编译其中,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
danteago
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2007-2-9
收藏
得分:0 
别搞那么复杂,基本上现在每人用 ++i 和i++同时用,i++效率并不好,
2007-02-09 23:15
genie2014
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2006-6-21
收藏
得分:0 
没什么别的意思,只是最近在学Java,看到里面的i++和++i和C里面的不一样,所以就把三个语言的不同情况对比了一下.纯粹是没事研究研究.

2007-02-09 23:46
lihu_325
Rank: 1
等 级:新手上路
帖 子:26
专家分:0
注 册:2007-2-5
收藏
得分:0 

郁闷~~
i++ 的意思不是 先用后加吗?
比如 i = 3 ;j = i++ ; 此时j的值是不是 3;而 i 的值是不是 4 ?
再来一次:j = i++ ; 此时j的值是不是 4;而 i 的值是不是 5 ?
如果我说的没有错~那么:int i=3,count; //i = 3
count=(i++)+(i++)+(i++); //cout = 3 + 4 + 5 应该是12啊~~
cout<<i; //此时的确 i 的值是六啊~

#include <iostream.h>
void main()
{
int i=3;
int count = 0;
cout<<i++<<endl;
cout<<i++<<endl;
cout<<i++<<endl;
// count=(i++)+(i++);//+(i++)+(i++);
cout<<count<<endl;
cout<<i<<endl;
}

运行结果是:
3
4
5
0
6
为什么分开看三次 i++ 的值分别是 3 4 5 而,加起来就成了 9 ??

2007-02-10 00:41
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
lihu_325
Rank: 1
等 级:新手上路
帖 子:26
专家分:0
注 册:2007-2-5
收藏
得分:0 

我得问题谁来给我个答复啊~~
等待中~~

2007-02-10 18:49
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
lihu_325
Rank: 1
等 级:新手上路
帖 子:26
专家分:0
注 册:2007-2-5
收藏
得分:0 

哦~~原来如此,我明白了~
换句话说:++ 的优先级别高于 +

谢谢 楼主~~
你学的真仔细 我要向你学习~

2007-02-10 21:31
lihu_325
Rank: 1
等 级:新手上路
帖 子:26
专家分:0
注 册:2007-2-5
收藏
得分:0 
我又来了~
后面的 count=(++i)+(++i)+(++i); 又不明白了~~
先来算表达式右边(++i)+(++i)+(++i) 的值,由于++i是先自增1,然后参与运算.
第一个(++i)此时为 4,
第二个(++i)此时为 5,
第三个(++i)此时为 6,
结果为:4+5+6=15 而答案是 16
++i,重复2编是10; //4+5=9
++i,重复3编是16; //4+5+6=15
++i,重复4编是23; //4+5+6+7=22
++i,重复5编是31;
++i,重复6编是40;
.....
都于我的结果相差 1
请问这个1是什么地方的????
2007-02-10 22:19
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
快速回复:[讨论]关于++的问题!!
数据加载中...
 
   



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

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