问一个老问题关于i++和++i,以前以为懂了

tigerbobo 2008-07-14 02:48:42
void CTest0Dlg::OnButton1()
{
// TODO: Add your control notification handler code here
int a=0,b=0;

b = (a++) + (a++) + (a++);//a=3,b=0;

a=0;b=0;

b = ++a + ++a + ++a;//a=3,b=7; 问题1:b为啥等于7?????我认为:b=1+2+3

a=0;b=0;

b = (++a) + (++a) + (++a);//a=3,b=7; 问题2:b为啥等于7?????我认为:b=1+2+3

a=0;b=0;

b = a++ + ++a;//a=2,b=2; 问题3:b为啥等于2?我认为是b=0+1

a=0;b=0;

b = ++a + a++;//a=2,b=2; 问题4:我认为是b=1+1,即后边的a++没变,可上边为啥变了?

a=0;b=0;

b = ++a + a++ + ++a;//a=3,b=4;问题5:这个好像又正常了,为认为是b=1+1+2,为啥上边的不是这样呢


a=0;b=0;

b = a++ + ++a + a++;//a=3,b=3;我彻底糊涂了,我认为是:b=0+1+1


}
...全文
407 55 打赏 收藏 转发到动态 举报
写回复
用AI写文章
55 条回复
切换为时间正序
请发表友善的回复…
发表回复
Dazzlingwinter 2008-07-14
  • 打赏
  • 举报
回复
41: a=0;b=0;
004010CA mov dword ptr [ebp-4],0
004010D1 mov dword ptr [ebp-8],0
42: b = ++a+ ++a + ++a;///a=3,b=7; 问题1:b为啥等于7?????我认为:b=1+2+3
004010D8 mov eax,dword ptr [ebp-4]
004010DB add eax,1
004010DE mov dword ptr [ebp-4],eax
004010E1 mov ecx,dword ptr [ebp-4]
004010E4 add ecx,1
004010E7 mov dword ptr [ebp-4],ecx
004010EA mov edx,dword ptr [ebp-4]
004010ED add edx,dword ptr [ebp-4]//此句纯属多余,有了它,结果是a=5,b=9;没它,a=3,b=7!
004010F0 mov eax,dword ptr [ebp-4]// ||但是电脑运行结果就是a=3,b=7!
004010F3 add eax,1
004010F6 mov dword ptr [ebp-4],eax
004010F9 add edx,dword ptr [ebp-4]
004010FC mov dword ptr [ebp-8],edx
照这个推下来,a=5,b=9的!
不信试试看,问了带我的作了好多年软件的刘师傅,他说这样的事情不用去钻,可以用来练一练脑子,没有多大的实际意义,另外他确实也说编译器不同,结果也会不一样!
arong1234 2008-07-14
  • 打赏
  • 举报
回复
你说的有道理,但是这个题目本身是错误的,是因为出题目的人自己不懂才瞎出的。毕竟你学习不是为了考试,而是为了谋生,所以遇到这个题目就不要计较分数了,一题得失算不了什么
[Quote=引用 4 楼 tigerbobo 的回复:]
谁也不这么写,可有些变态的面试题就考这些
[/Quote]
go_go_vip 2008-07-14
  • 打赏
  • 举报
回复
18楼的过程和17楼的程序结果与标准答案是一样的.面试出题不考虑编译器具体情况,照这个计算就可.过程具体如下,
每次初值 a=0,b=0;
b = (a++) + (a++) + (a++); //a=3,b=0; 先做b=a+a+a=0, a++; a++;a++;
b=0+0+0=0
b = ++a + ++a + ++a; //a=3,b=7; a++; a++;此时a=2; a+a=4;a++; a=3; b=4+3=7;
b=2+2+3=7
b = (++a) + (++a) + (++a); //a=3,b=7; a++; a++; a+a=4; a++; b=4+3=7;
b=2+2+3=7
b = a++ + ++a;//a=2,b=2; //a++; 此时a=1; b=a+a; a++;
b=1+1=2
b = ++a + a++;//a=2,b=2; //a++; b=a+a; a++;
b=1+1=2
b = ++a + a++ + ++a;//a=3,b=4; //a++; b=a+a; a++; b=2+a; a++;
b=1+1+2=4
b = a++ + ++a + a++;//a=3,b=3; //a++; b=a+a+a; a++; a++;
b=1+1+1=3

后面几个没具体写,前面3个弄明白了,后面是一样的算法
yjukh 2008-07-14
  • 打赏
  • 举报
回复
没有实战意义的问题~
kingstarer 2008-07-14
  • 打赏
  • 举报
回复
++a 返回a的左值(相当于引用)
a++ 返回a的值

这两个区别弄懂了一切都好解释(从左到右运算)

b = ++a + ++a + ++a;//a=3,b=7;

<=>
++a;
++a;
b = a + a;
++a;
b = b + a;
vcPlayer 2008-07-14
  • 打赏
  • 举报
回复
nop
nop
nill
nill
null
null
lzxhll 2008-07-14
  • 打赏
  • 举报
回复
不同编译器给不同的答案
实际上此问题无意义 谁在程序里写i++ + ++i +i 傻了~~~~~
qq506420634 2008-07-14
  • 打赏
  • 举报
回复
????
tigerbobo 2008-07-14
  • 打赏
  • 举报
回复
schlafenhamster说的这种方式在道理上不好理解,估计现在高级的编译器都不这样处理了
tigerbobo 2008-07-14
  • 打赏
  • 举报
回复
今天不结贴了,明天加了分再结
schlafenhamster 2008-07-14
  • 打赏
  • 举报
回复
不客气,懂了就好
tigerbobo 2008-07-14
  • 打赏
  • 举报
回复
明白了,谢谢大家,特别感谢 schlafenhamster

benjiam 2008-07-14
  • 打赏
  • 举报
回复
有空

还不如去读读编译原理,
schlafenhamster 2008-07-14
  • 打赏
  • 举报
回复
正数第二个
b = ++a + ++a + ++a;//a=3,b=7; 问题1:b为啥等于7?????我认为:b=1+2+3
第一个++a先做,于是a=1,
第二个++a执行, a=2,
此时弹出堆栈进行相加a+a=4,4压入栈等待最后一个参数操作
第三个++a,此时a=3
于是3+4=7最后b值为7.


倒数第二个
b = ++a + a++ + ++a;//a=3,b=4; //a++; b=a+a; a++; b=2+a; a++;
b=1+1+2=4

++a先做, a=1
a++不做,直接做++a+a++,这样就是1+1=2,入栈
做最后一个++a,a=2.最后2+2=4.

编译器无非是用Pre-Order, In-Oder和Post-Order的方式区分模糊语义,在语义不模糊的结果应该是一样的.所以此处不用考虑编译器的问题,只要按照a++和++a在c语言里的基本操作定义去做就可以了.
shizhusz110 2008-07-14
  • 打赏
  • 举报
回复
哈哈!顶学习!
琅琊榜 2008-07-14
  • 打赏
  • 举报
回复
2005和6.0的结果不一样的
2005是先取得所有操作数的结果,然后运算
6.0是分步骤的,一般是一个符号两边的操作数先运算出来,然后生成中间结果然后再取第三个操作数,依次类推
其实自己看一下disassembly就知道了
  • 打赏
  • 举报
回复
void CTest0Dlg::OnButton1()
{
// TODO: Add your control notification handler code here
int a=0,b=0;

b = (a++) + (a++) + (a++);//a=3,b=0;

a=0;b=0;

b = ++a + ++a + ++a;//a=3,b=7; 问题1:b为啥等于7?????我认为:b=1+2+3

a=0;b=0;

b = (++a) + (++a) + (++a);//a=3,b=7; 问题2:b为啥等于7?????我认为:b=1+2+3

a=0;b=0;

b = a++ + ++a;//a=2,b=2; 问题3:b为啥等于2?我认为是b=0+1

a=0;b=0;

b = ++a + a++;//a=2,b=2; 问题4:我认为是b=1+1,即后边的a++没变,可上边为啥变了?

a=0;b=0;

b = ++a + a++ + ++a;//a=3,b=4;问题5:这个好像又正常了,为认为是b=1+1+2,为啥上边的不是这样呢


a=0;b=0;

b = a++ + ++a + a++;//a=3,b=3;我彻底糊涂了,我认为是:b=0+1+1


}

编译器不同结果不同
Dazzlingwinter 2008-07-14
  • 打赏
  • 举报
回复
37: int a=0,b=0; 41: a=0;b=0;
00401058 mov dword ptr [ebp-4],0 004010CA mov dword ptr [ebp-4],0
0040105F mov dword ptr [ebp-8],0 004010D1 mov dword ptr [ebp-8],0
38: b = (a++) + (a++) + (a++); 42: b = ++a+ ++a + ++a;
问题1:b为啥等于7?????
我认为:b=1+2+3
00401066 mov eax,dword ptr [ebp-4] 004010D8 mov eax,dword ptr [ebp-4]
00401069 add eax,dword ptr [ebp-4] 004010DB add eax,1
0040106C add eax,dword ptr [ebp-4] 004010DE mov dword ptr [ebp-4],eax
0040106F mov dword ptr [ebp-8],eax 004010E1 mov ecx,dword ptr [ebp-4]
00401072 mov ecx,dword ptr [ebp-4] 004010E4 add ecx,1
00401075 add ecx,1 004010E7 mov dword ptr [ebp-4],ecx
00401078 mov dword ptr [ebp-4],ecx 004010EA mov edx,dword ptr [ebp-4]
0040107B mov edx,dword ptr [ebp-4] 004010ED add edx,dword ptr [ebp-4]
0040107E add edx,1 004010F0 mov eax,dword ptr [ebp-4]
00401081 mov dword ptr [ebp-4],edx 004010F3 add eax,1
00401084 mov eax,dword ptr [ebp-4] 004010F6 mov dword ptr [ebp-4],eax
00401087 add eax,1 004010F9 add edx,dword ptr [ebp-4]
0040108A mov dword ptr [ebp-4],eax 004010FC mov dword ptr [ebp-8],edx
这两个对比来看,明白了,问题就解决了!
schlafenhamster 2008-07-14
  • 打赏
  • 举报
回复
我回来了,你等一下,我写一下过程
tigerbobo 2008-07-14
  • 打赏
  • 举报
回复
[Quote=引用 34 楼 schlafenhamster 的回复:]
现在你先自己看看倒数第二个怎么算的,我要出去一下,如果你还不明白,我回来再写给你.
[/Quote]
倒数第一个:
b = a++ + ++a + a++;//a=3,b=3; //a++; b=a+a+a; a++; a++;
b=1+1+1=3
这个我能理解,以勤也是这么理解的。

倒数第二和正数第二,就理解不了了。
b = ++a + a++ + ++a;//a=3,b=4; //a++; b=a+a; a++; b=2+a; a++;
b=1+1+2=4

我认为:先算第一个++a,此时a=1,再算第二个++a,此时a=2,然后中间的a++不计算,应该是
b=2+2+2=6
加载更多回复(34)

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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