这个结果为什么是201 ???

yuchonghuang 2012-02-10 01:27:06
int c = 100;
c = c + c++;
cout<<c<<endl;

显示结果是 201 我以为是200
...全文
340 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
Eleven 2012-02-11
  • 打赏
  • 举报
回复
和编译器与关系,一般不会这么写
机智的呆呆 2012-02-11
  • 打赏
  • 举报
回复
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!
quwei197874 2012-02-11
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 pathuang68 的回复:]

1. 这个计算顺序依赖于编译器的具体实现,所以不同的编译器会有不同的结果。
2. 类似问题,不必深究。考试或者面试都不会出这样的题目,如果出了,你就回答:“结果和具体的编译器相关”, and this will never go wrong.
[/Quote]++
luotuo44 2012-02-11
  • 打赏
  • 举报
回复
不知道楼主有没有学过汇编语言。如果学过的话就好办了。因为在汇编中,那个++操作符什么时候执行是很明确的。
下面是对应的汇编代码(VC6.0编译器的)

11: int c = 100;
00401578 mov dword ptr [ebp-4],64h
12: c = c + c++;
0040157F mov eax,dword ptr [ebp-4]
00401582 add eax,dword ptr [ebp-4]
00401585 mov dword ptr [ebp-4],eax
00401588 mov ecx,dword ptr [ebp-4]
0040158B add ecx,1
0040158E mov dword ptr [ebp-4],ecx

可以看到++操作符是最后一步执行的。所以在VC6.0下的答案是201.
最后要说的是,把C代码翻译成怎么样的汇编代码是由编译器决定的。
帅得不敢出门 2012-02-11
  • 打赏
  • 举报
回复
题目本身有问题。
不二Se 2012-02-11
  • 打赏
  • 举报
回复
跟编译器有关的
程序员小迷 2012-02-11
  • 打赏
  • 举报
回复
如果楼主计算:

c = (c ++) + c;
c = (c++) + (c++);

楼主就会明白,如果有时间,一辈子你都搞不能真正得到一个准确的结论;
写代码,一般不能这么写
iamnobody 2012-02-11
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 demon__hunter 的回复:]
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!
[/Quote]
。。
丰清云淡 2012-02-10
  • 打赏
  • 举报
回复
[Quote=引用楼主 yuchonghuang 的回复:]
int c = 100;
c = c + c++;
cout<<c<<endl;

显示结果是 201 我以为是200
[/Quote]
代码解析为:
c.operator=(c.operator+(c.operator++(int)))
你的编译器大概做如下的事情:
c++结果为临时值(100)但c的值变为了101,101+100结果存放于c中,就出现你所见的201,这与编译器对变量的压栈顺序(参数从左至右还是从右至做)有关,还与编译器是进行压栈后计算或者压栈的同时计算有关。
总之,你只要知道这与编译器有关就行了,不必纠结与题目本身。
Saleayas 2012-02-10
  • 打赏
  • 举报
回复
考这种题的公司不去也罢!
Binzo 2012-02-10
  • 打赏
  • 举报
回复
c = c + (c++);

右----〉左。
c(100) -> c = c + 1 -> c(101) -> c(201)
+ 右边加了100,左边加了101。
AndyZhang 2012-02-10
  • 打赏
  • 举报
回复
未定义行为,不去纠结了,记住不要这么写
赵4老师 2012-02-10
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 luciferisnotsatan 的回复:]
在写结果的地方写上,“编译器决定”
[/Quote]
凡是这种++、--类;指针、引用、参数和局部变量类的问题都可以在写结果的地方写:
“VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!
——zhao4zhong1@163.com”
(^_^)
yuchonghuang 2012-02-10
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 cobra_chen 的回复:]

编译器,颠覆了多少理论。
哎,泪奔呀。
代码还是不要用这样容易产生二义性的代码吧。
[/Quote]

平时的代码一般都不会写这样难懂的代码,只是在笔试的时候有人会考,都是码农,码农何必为难码弄呢??
孤独小剑 2012-02-10
  • 打赏
  • 举报
回复
按编译器入栈顺序解析(编译原理叫什么忘记了)
int c = 100;
c = c + c++;
cout<<c<<endl;
/* 输出201 */

c = 100;
c += ++c;
cout<<c<<endl;
/* 输出202 */
c = 100;
++c += (c++);
cout<<c<<endl;
/* 输出203 */

c = 100;
++c += ++c;
cout<<c<<endl;
/* 输出204 */
注:这类结果未定义的题考了没意义,实践中是不允许写这样的代码的。
cobra_chen 2012-02-10
  • 打赏
  • 举报
回复
编译器,颠覆了多少理论。
哎,泪奔呀。
代码还是不要用这样容易产生二义性的代码吧。
jxnuzhouguohong 2012-02-10
  • 打赏
  • 举报
回复
单目运算符++优先级高于双目运算符+
,先计算C++,++后置所以表达式C++值为100,
运算完C==101,最后运算+,所以就是101+100=201.
luciferisnotsatan 2012-02-10
  • 打赏
  • 举报
回复
在写结果的地方写上,“编译器决定”
面包大师 2012-02-10
  • 打赏
  • 举报
回复
http://topic.csdn.net/t/20000908/23/29115.html
这个帖子说的比较详细
yuchonghuang 2012-02-10
  • 打赏
  • 举报
回复
没遇到过,第一次遇到肯定会栽~~~
加载更多回复(9)

64,642

社区成员

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

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