(i++) + (++i) + (i++) 与 (i++) + (i++) + (++i) + (i++)问题

xiongxiao 2008-11-10 03:05:58
int a,b,i;
i = 0;
a = (i++) + (++i) + (i++);
i = 0;
b = (i++) + (i++) + (++i) + (i++)
请哪位指点一下这其中的不同,执行结果是相当诡异的,a是3,b是2,而且在B这个算式的基础上,不管在最前面加多少个i++,结果就都是2了,
另外还请说明一下,(++i) + (++i) = 4,而为啥 (++i) +(++i) +(++i) = 7呢?
...全文
365 48 打赏 收藏 转发到动态 举报
写回复
用AI写文章
48 条回复
切换为时间正序
请发表友善的回复…
发表回复
a5418ccc 2011-09-19
  • 打赏
  • 举报
回复
有收获
conghua19 2011-07-31
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 xiongxiao 的回复:]

不要动不动就说编译器有关,我还不知道呀,现在的问题是我所用的一些编译器都是编译出这种结果,我想知道的是为什么会编译出这种结果来,执行过程是怎样的,分别在VC与LINUX下的编译,运行结果一样仔细看清楚题目,后面三个((i++) + (++i) + (i++) )都是一样的,就只是在这前面加上(i++),为什么结果就不一样了,看了上面汇编,还是有推不出编译成这样的思路

更加BS那些不懂装懂的……
[/Quote]

说得好.,,有些人就总是自以为是..
天蛾糊 2011-05-06
  • 打赏
  • 举报
回复
[Quote=引用 45 楼 lyntion 的回复:]
引用 39 楼 xiongxiao 的回复:
引用 30 楼 jia_xiaoxin 的回复:
C++是二目运算,也就是说每次只能有两项参加运算。如果是多项时,每两项一组会分成多组。
而且C++的计算顺序是从右向左的。

a = (i++) + (++i) + (i++);
先计算后面两项 ++i先让i自加1变为1再返回1,i++返回的i此时为1.所以两项之和为2。
第一项中此时i已……
[/Quote]
就是这样的!顶!
  • 打赏
  • 举报
回复
[Quote=引用 39 楼 xiongxiao 的回复:]
引用 30 楼 jia_xiaoxin 的回复:
C++是二目运算,也就是说每次只能有两项参加运算。如果是多项时,每两项一组会分成多组。
而且C++的计算顺序是从右向左的。

a = (i++) + (++i) + (i++);
先计算后面两项 ++i先让i自加1变为1再返回1,i++返回的i此时为1.所以两项之和为2。
第一项中此时i已经为1,所以总和为3。

b = (i++)……
[/Quote]


#include<iostream>
using namespace std;
void main()
{

int a,b,c,d,i;
//两个操作数的情况

i = 0;
a = (i++) + (++i) ;//2
i = 0;
b = (++i) + (i++) ;//2
i=0;
c=(++i) + (++i);//4
i=0;
d=(i++) + (i++);//0
cout<<a<<" "<<b<<" "<<c<<" "<<d<<endl<<endl;

//三个操作数的情况
i = 0;
a = (i++) + (++i) + (++i);//4
i = 0;
b = (++i) + (i++) +(++i);//4
i=0;
c=(++i) + (++i) + (i++);//6
i=0;
d=(++i) + (++i) + (++i);//7
cout<<a<<" "<<b<<" "<<c<<" "<<d<<endl<<endl;

//三个以上操作数的情况
i = 0;
a = (i++) + (++i) + (++i)+(++i);//7
i = 0;
b = (++i) + (i++) +(++i)+(i++);//6
i=0;
c=(++i) + (++i) + (++i)+(i++);//10
i=0;
d=(++i) + (++i) + (++i)+ (++i);//11
cout<<a<<" "<<b<<" "<<c<<" "<<d<<endl<<endl;

i=0;
int sum=(i++)+(++i)+(++i)+(++i)+(i++)+(i++)+(++i);//17
cout<<sum<<endl;

}


/*
上述全部代码都在VC++6.0环境下编译通过,其他C++编译器,未曾调试,
JAVA编译器就不适用了,JAVA运算顺序有所不同。

总结,=右边的表达式都是从左到右进行运算的,按二目运算进行运算,
即每两个操作数进行运算返回一个结果,
才进行后面的运算。
当操作数少于等于三个,则有以下规则,按二目运算,将两操作数进行划分,i初始为0
(++i)+(++i),i加了两次,即此时i变为2,返回运算结果2+2
(i++)+(++i)或(++i)+(i++),i只加了一次,即此时i变为1,返回运算结果1+1

当操作数大于三个,从四个开始,规则有变化
(++i)+(++i),i加了两次,即此时i变为2,返回运算结果2+3 //感觉不是二目运算
(i++)+(++i),i加了一次,在后操作数才开始加的,所以此时i变1,返回运算结果0+1 //后操作数返回后,i才++
(++i)+(i++),i加了一次,在前操作数就开始加了,所以此时i变为1,返回运算价格1+1 //前操作数返回后,i才++

*/
  • 打赏
  • 举报
回复
[Quote=引用 39 楼 xiongxiao 的回复:]
引用 30 楼 jia_xiaoxin 的回复:
C++是二目运算,也就是说每次只能有两项参加运算。如果是多项时,每两项一组会分成多组。
而且C++的计算顺序是从右向左的。

a = (i++) + (++i) + (i++);
先计算后面两项 ++i先让i自加1变为1再返回1,i++返回的i此时为1.所以两项之和为2。
第一项中此时i已经为1,所以总和为3。

b = (i++)……
[/Quote]

楼主,还是有问题咧,如四个++i相加
i=0;
a = (++i)+(++i)+(++i)+(++i);
后两个i做二目运算,返回4,此时i为2,继续,前两个i做二目运算,返回8,此时i 为4,最后a=8+4=12,可VC6.0运行结果是11,
五个i相加
a = (++i)+(++i)+(++i)+(++i)+(++i);
a=5+8+4=17;,运行结果是16,

怎么按二目运算来算也不对啊

  • 打赏
  • 举报
回复
[Quote=引用 30 楼 jia_xiaoxin 的回复:]
C++是二目运算,也就是说每次只能有两项参加运算。如果是多项时,每两项一组会分成多组。
而且C++的计算顺序是从右向左的。

a = (i++) + (++i) + (i++);
先计算后面两项 ++i先让i自加1变为1再返回1,i++返回的i此时为1.所以两项之和为2。
第一项中此时i已经为1,所以总和为3。

b = (i++) + (i++) + (++i) + (i++) ……
[/Quote]

恩,顶30楼,正解,我也为这问题纠结
w147456 2008-11-12
  • 打赏
  • 举报
回复
up
wzfxyer 2008-11-12
  • 打赏
  • 举报
回复
难道这就是所谓的经典,看了半天才刚有点门道。
taodm 2008-11-11
  • 打赏
  • 举报
回复
哎,就算你真的懂了吧。等你再多用过几个编译器后,还会更懂一点的。
xiongxiao 2008-11-11
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 jia_xiaoxin 的回复:]
C++是二目运算,也就是说每次只能有两项参加运算。如果是多项时,每两项一组会分成多组。
而且C++的计算顺序是从右向左的。

a = (i++) + (++i) + (i++);
先计算后面两项 ++i先让i自加1变为1再返回1,i++返回的i此时为1.所以两项之和为2。
第一项中此时i已经为1,所以总和为3。

b = (i++) + (i++) + (++i) + (i++)
先分成独立的两组后一组的结果同上为2.
第一组都是先返回后加,所以为0,总和就为2.


[/Quote]

终于见在正确的解释了,谢谢,学习
不知那些总是说和编译器有关的老兄是否也脸红一下啊,我也是,开始也以为总有一个编译器不是这样编译的,看完jia_xiaoxin 的回复,才知道这就是C++的特性,只是平时大家都忽略了这两个关键字“二目运算”,“从右至左”,其实一般的入门书上都有说,可就是和这问题联系不起来,强汗一把;
另外再说两句,存在即是合理,既然C++提供了这么强大的灵活性,自然有它的道理,我们应该努力学习并去发现它的使用方法与好处,而不是一味的避免出现这样看不明白的问题。谢谢大家,加分结贴。
wzfxyer 2008-11-10
  • 打赏
  • 举报
回复
电脑执行速度太快了,建议用386试一下,可能就与我们想的差不多了。那没加完这已经加完了。
wzfxyer 2008-11-10
  • 打赏
  • 举报
回复
电脑所选速度太快了,建议用386试一下,可能就与我们想的差不多了。
dzc8866 2008-11-10
  • 打赏
  • 举报
回复
请教一下,看反汇编有什么工具?
xuetangxiaoqing 2008-11-10
  • 打赏
  • 举报
回复
真的很无聊啊,VC++和c中,
a=++i;
可理解为:
{
i=i+1;
a=i;
}

而a=i++;
为:
{
a=i;
i=i+1;
}
hackers007 2008-11-10
  • 打赏
  • 举报
回复
不清楚,不过谈下个人观点,与编译器有关或者其他原因我也搞不清楚,但我支持去跟踪看汇编代码,基本上就可以明确的知道是什么原因导致的。
问题很深奥!!呵呵。楼主专研精神值得我学习
tsoslience 2008-11-10
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 jia_xiaoxin 的回复:]
C++是二目运算,也就是说每次只能有两项参加运算。如果是多项时,每两项一组会分成多组。
而且C++的计算顺序是从右向左的。

a = (i++) + (++i) + (i++);
先计算后面两项 ++i先让i自加1变为1再返回1,i++返回的i此时为1.所以两项之和为2。
第一项中此时i已经为1,所以总和为3。

b = (i++) + (i++) + (++i) + (i++)
先分成独立的两组后一组的结果同上为2.
第一组都是先返回后加,所以为0,总和就为2.


[/Quote]
lzp765 2008-11-10
  • 打赏
  • 举报
回复
专牛角尖吧............
jeff_nie 2008-11-10
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 VBSpine 的回复:]
来人,上板砖。。。。。。。。。。。。
[/Quote]
.
jia_xiaoxin 2008-11-10
  • 打赏
  • 举报
回复
C++是二目运算,也就是说每次只能有两项参加运算。如果是多项时,每两项一组会分成多组。
而且C++的计算顺序是从右向左的。

a = (i++) + (++i) + (i++);
先计算后面两项 ++i先让i自加1变为1再返回1,i++返回的i此时为1.所以两项之和为2。
第一项中此时i已经为1,所以总和为3。

b = (i++) + (i++) + (++i) + (i++)
先分成独立的两组后一组的结果同上为2.
第一组都是先返回后加,所以为0,总和就为2.


(++i) + (++i) = 4
是因为两项同时参与运算,相当于自加了两次,所以都返回2结果就为4.

(++i) +(++i) +(++i) = 7
是因为后两项结果为4,此时i为2.第一项返回为3,总结果为7.
BaihowFF 2008-11-10
  • 打赏
  • 举报
回复
建议楼主不要挑战编译器了...
加载更多回复(28)

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧