论坛: 编程破解 标题: ??为什么是12(VC++) 复制本贴地址    
作者: 八路军撇石头 [anfer]    论坛用户   登录
#include<iostream.h>
int  main()
{
int n=3;
int s;
s=(n++)+(++n)+(n++);
cout<<s;
return 0;
}

地主 发表时间: 04-09-26 18:12

回复: 腾焰凝冰 [burningice]   论坛用户   登录
在c语言中 ++的优先级比+高,所以先算三个括号,在算三个括号的结果4+4+4=12


B1层 发表时间: 04-09-26 18:40

回复: 烟雨平生 [lida1818]   论坛用户   登录
1,并不是"++的优先级比+高,所以先算三个括号",这里的优先级()最高,一定是先计算()内的
2,在一个表达式中对同一变量连续进行自增减,不同的编译器,结果是不一样的


B2层 发表时间: 04-09-26 20:07

回复: 愿雨听风 [ziaichen]   论坛用户   登录
i=n++ 是i的值等于n的值加1,n的值不变
i=++n 是i的值和n的值都等于原来n的值加1
所以答案是12拉

B3层 发表时间: 04-09-26 22:50

回复: 寒枫 [bug_me]   论坛用户   登录
支持烟雨平生的回复,不同的编译器是不一样的
在这里可以理解为:先进行++,所以是4+4+4=12
如果加个cout<<n<<endl;
应该就是6了

B4层 发表时间: 04-09-26 23:07

回复: 极地风暴 [qiezic]      登录
建议你多看点书

B5层 发表时间: 04-09-27 13:50

回复: ltiao9600 [ltiao9600]   论坛用户   登录
同意!

B6层 发表时间: 04-09-27 16:16

回复: f [yifanernei]   论坛用户   登录
这里有一个后坠延迟的问题
n++要到见到‘;’,‘&&',....等才加1
所以,上面的代码应该等同于
n +=1 ;
s = n + n + n;
n +=1;
n +=1;

B7层 发表时间: 04-09-27 22:03

回复: 烟雨平生 [lida1818]   论坛用户   登录
楼上的解释有些牵强,你解释一下下面的:
main()
{
int a=5,a1=5;
int s,d;
s=(a++) + (a++) + (++a) + (--a);
d=a1++ + a1++ + ++a1 + --a1;
printf("%d  %d  %d  %d",s,d,a,a1);
}

B8层 发表时间: 04-09-27 23:09

回复: 凝结 [yixiaolei]   论坛用户   登录
难道++在前跟++在后一样么?

B9层 发表时间: 04-09-28 02:37

回复: 极地风暴 [qiezic]      登录
没错,是不一样的!

B10层 发表时间: 04-09-29 09:09

回复: 憨狗 [hackgou]   论坛用户   登录
谈谈个人看法:我认为第一个括号返回3,但是n等于4;第二个括号返回5,而且n等于5;第三个括号和第一个类似,返回5但是n对于6,那么三个括号的返回值相加,按照我的理解是3+5+5=13,但是cl和gcc下却是12,I don‘t why?

但是我对下面几位兄弟的解释有点疑问:

愿雨听风 认为:
引用:

i=n++ 是i的值等于n的值加1,n的值不变
i=++n 是i的值和n的值都等于原来n的值加1
所以答案是12拉 "

那你试试
代码:

……
int n=3;
int s;
int t=n++;
cout<< n<<t ;
……


看t是多少?n是多少?我在cl和gcc下的结果为:n是4,t是3。


基于同样的原因,对于寒枫兄的4+4+4=12不敢苟同。


而f兄的关于”‘;’,‘&&',....“的后缀延迟的解释,也许:
int n=3;
cout<<n++<< ++n<< n++ ;
对你说法提出了挑战,因为:
同样在cl和gcc下的结果为:3,5,5

最后倒是佩服烟雨平生 兄的说法:
讲了讲C++的计算原理,但是如果仔细分析分析就会发现有点问题。


[此贴被 憨狗(hackgou) 在 09月29日15时38分 编辑过]


[此贴被 憨狗(hackgou) 在 10月08日11时29分 编辑过]


[此贴被 憨狗(hackgou) 在 10月08日11时30分 编辑过]

B11层 发表时间: 04-09-29 15:34

回复: 八路军撇石头 [anfer]   论坛用户   登录
谢谢各位了!!!!!

要看编译原理吗???

B12层 发表时间: 04-09-29 19:36

回复: f [yifanernei]   论坛用户   登录
晕,没想到会有这么多问题。这下我也不明白了,为什么那个
s = c++ + c++ + c++ + c--; 会等于21了,真郁闷~~~!!!!!

B13层 发表时间: 04-10-01 00:57

回复: f [yifanernei]   论坛用户   登录
8:    s=(a++) + (a++) + (++a) + (--a);
0040F1CF  mov        ecx,dword ptr [ebp-4]
0040F1D2  add        ecx,dword ptr [ebp-4]
0040F1D5  mov        edx,dword ptr [ebp-4]
0040F1D8  add        edx,1
0040F1DB  mov        dword ptr [ebp-4],edx
0040F1DE  add        ecx,dword ptr [ebp-4]
0040F1E1  mov        eax,dword ptr [ebp-4]
0040F1E4  sub        eax,1
0040F1E7  mov        dword ptr [ebp-4],eax
0040F1EA  add        ecx,dword ptr [ebp-4]
0040F1ED  mov        dword ptr [ebp-0Ch],ecx
0040F1F0  mov        ecx,dword ptr [ebp-4]
0040F1F3  add        ecx,1
0040F1F6  mov        dword ptr [ebp-4],ecx
0040F1F9  mov        edx,dword ptr [ebp-4]
0040F1FC  add        edx,1
0040F1FF  mov        dword ptr [ebp-4],edx
这是我在VC下拷的汇编代码,谁来给指点一下呀!!!
怎么看也应该是等于20呀!!!!!!

B14层 发表时间: 04-10-01 01:08

回复: 憨狗 [hackgou]   论坛用户   登录

f兄够有耐性的,呵呵,向你致敬!
来分析分析这段代码吧:
8:        s=(a++) + (a++) + (++a) + (--a); ;a的初始值为5
0040107A  mov        eax,dword ptr [ebp-4] ;ebp-4 指向a,eax=a=5
0040107D  add        eax,dword ptr [ebp-4] ;eax=eax+a=10,
;直接以a的值求取两个前(a++)的和(5+5=10),编译器和我们的差别就在这一句了,
;按照我们的本意应该是:a先++,再求和即5+6=11
00401080  mov        ecx,dword ptr [ebp-4] 
00401083  add        ecx,1  ;a++ ;ecx =a+1=6
00401086  mov        dword ptr [ebp-4],ecx ;a=ecx=6
00401089  add        eax,dword ptr [ebp-4] ;eax=eax+a=10+6=16,
0040108C  mov        edx,dword ptr [ebp-4] ;edx=a=6
0040108F  sub        edx,1 ;edx=edx-1=6-1=5
00401092  mov        dword ptr [ebp-4],edx ;a=edx=5
00401095  add        eax,dword ptr [ebp-4] ;eax=eax+a=16+5=21
00401098  mov        dword ptr [ebp-8],eax ;s=eax=21,
;到这步为止:s=5+5+6+5=21,所以s等于21就这么来的,而对a的运算则只完成了
;最后面的++a和--a,
;前面两个的a++还没有执行。
0040109B  mov        eax,dword ptr [ebp-4] ;eax=a=5
0040109E  add        eax,1 ;eax=eax+1=6
004010A1  mov        dword ptr [ebp-4],eax ;a=eax=6
004010A4  mov        ecx,dword ptr [ebp-4] ;ecx=a=6
004010A7  add        ecx,1 ;ecx=ecx+1=6+1=7
004010AA  mov        dword ptr [ebp-4],ecx ;a=ecx=7
;基于以上分析,我对cl的编译过程是这么考虑的:这种运算过程中,
;后置++的优先级低于连加时+的优先级(甚至设置了括号时也没有起到作用)。
;显然这和标准的c/c++优先级规则是有出入的.


[此贴被 憨狗(hackgou) 在 10月02日19时32分 编辑过]

B15层 发表时间: 04-10-02 19:31

回复: f [yifanernei]   论坛用户   登录
OK,这应该是正解了!!!!
也就是说在机器中是以一个中间变量存放和值的
temp=0; temp +=a; temp +=a;
a +=1; temp +=a;  a -=1;
temp +=a;
sum = temp;
a +=1;
a+=1;
我想这样的解释应该没有什么问题了吧!!!!1

B16层 发表时间: 04-10-07 10:40

回复: 憨狗 [hackgou]   论坛用户   登录
就这么理解吧,容易理解些。

B17层 发表时间: 04-10-08 08:01

回复: 林中鸟 [autosee]   论坛用户   登录
真不知编译器在处理多重++、——运算的时候是怎么计算的,以下是就弟对书本上讲的原理进行验证的程序计算方式,跟顶楼的同出一个列子。
#include<iostream>
#include<conio.h>
using std :: cout;
using std :: endl;
int  main()
{
int n=3;
int s;
s=n++ ;
cout << "S= " << s << endl ;
cout << "n= " << n << endl ;
s=s+(++n);
cout << "S= " << s << endl ;
cout << "n= " << n << endl ;
s=s+(n++) ;
cout << "S= " << s << endl ;
cout << "n= " << n << endl ;
cout<<s;
getch();
return 0;
}
跟踪的最后S结果为13,
但是如果合并成顶楼的就不一样了。
s=(n++)+(++n)+(n++);
跟踪的结果值是13。
看来还是用汇编写算了。

[此贴被 林中鸟(autosee) 在 10月08日09时52分 编辑过]

B18层 发表时间: 04-10-08 09:50

回复: advote [advote]   论坛用户   登录
对于(hackguo)的解释中,说  “而对a的运算则只完成了
最后面的++a和--a,”
我认为是不正确的,实际上前面a++也进行了运算,只是值没有变而已。

B19层 发表时间: 04-10-09 18:59

回复: 憨狗 [hackgou]   论坛用户   登录
谢谢advote兄的指点,我的那句注释:“前面两个的a++还没有执行。“的本意是说前面两个++没有执行(让a自增一的操作)。表述未清,抱歉。而且从汇编的代码来看,到我写注释处,也确实没有执行,不过肯定的是后面才对a++进行了运算。你认为到我写注释处就已经进行了运算的,为什么呢?说说你的看法?

B20层 发表时间: 04-10-10 00:07

回复: 乐乐 [lelecool]   论坛用户   登录
d=a1++ + a1++ + ++a1 + --a1;
这条应该这样理解<5+5+6+5>



B21层 发表时间: 04-10-16 04:30

论坛: 编程破解

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号