这个结果为什么是201 ???int c 100c c + c++coutcendl显示结果是 201 我以为是200[解决办法]这
这个结果为什么是201 ???
int c = 100;
c = c + c++;
cout<<c<<endl;
显示结果是 201 我以为是200
[解决办法]
这个和编译器有关。。。
[解决办法]
楼主搜下“求值顺序”
这个结果和具体的编译器相关的
[解决办法]
1. 这个计算顺序依赖于编译器的具体实现,所以不同的编译器会有不同的结果。
2. 类似问题,不必深究。考试或者面试都不会出这样的题目,如果出了,你就回答:“结果和具体的编译器相关”, and this will never go wrong.
[解决办法]
这个代码就属于问题代码。所以没什么好解释的。去看看求值顺序方面的知识就知道了。
[解决办法]
出题的是老谭之流
[解决办法]
直接看汇编代码
[解决办法]
http://topic.csdn.net/t/20000908/23/29115.html
这个帖子说的比较详细
[解决办法]
在写结果的地方写上,“编译器决定”
[解决办法]
单目运算符++优先级高于双目运算符+
,先计算C++,++后置所以表达式C++值为100,
运算完C==101,最后运算+,所以就是101+100=201.
[解决办法]
编译器,颠覆了多少理论。
哎,泪奔呀。
代码还是不要用这样容易产生二义性的代码吧。
[解决办法]
按编译器入栈顺序解析(编译原理叫什么忘记了)
- C/C++ code
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 */
[解决办法]
[解决办法]
未定义行为,不去纠结了,记住不要这么写
[解决办法]
- C/C++ code
c = c + (c++);
[解决办法]
考这种题的公司不去也罢!
[解决办法]
[解决办法]
不知道楼主有没有学过汇编语言。如果学过的话就好办了。因为在汇编中,那个++操作符什么时候执行是很明确的。
下面是对应的汇编代码(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代码翻译成怎么样的汇编代码是由编译器决定的。
[解决办法]
[解决办法]
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!
------解决方案--------------------
和编译器与关系,一般不会这么写
[解决办法]
[解决办法]
如果楼主计算:
c = (c ++) + c;
c = (c++) + (c++);
楼主就会明白,如果有时间,一辈子你都搞不能真正得到一个准确的结论;
写代码,一般不能这么写
[解决办法]
跟编译器有关的
