|
![]() | 作者: anfer [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 [burningice] ![]() |
登录 |
在c语言中 ++的优先级比+高,所以先算三个括号,在算三个括号的结果4+4+4=12 |
B1层 发表时间: 04-09-26 18:40 |
![]() | 回复: lida1818 [lida1818] ![]() |
登录 |
1,并不是"++的优先级比+高,所以先算三个括号",这里的优先级()最高,一定是先计算()内的 2,在一个表达式中对同一变量连续进行自增减,不同的编译器,结果是不一样的 |
B2层 发表时间: 04-09-26 20:07 |
![]() | 回复: ziaichen [ziaichen] ![]() |
登录 |
i=n++ 是i的值等于n的值加1,n的值不变 i=++n 是i的值和n的值都等于原来n的值加1 所以答案是12拉 |
B3层 发表时间: 04-09-26 22:50 |
![]() | 回复: bug_me [bug_me] ![]() |
登录 |
支持烟雨平生的回复,不同的编译器是不一样的 在这里可以理解为:先进行++,所以是4+4+4=12 如果加个cout<<n<<endl; 应该就是6了 |
B4层 发表时间: 04-09-26 23:07 |
![]() | 回复: qiezic [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 [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 [yixiaolei] ![]() |
登录 |
难道++在前跟++在后一样么? |
B9层 发表时间: 04-09-28 02:37 |
![]() | 回复: qiezic [qiezic] ![]() |
登录 |
没错,是不一样的! |
B10层 发表时间: 04-09-29 09:09 |
![]() | 回复: hackgou [hackgou] ![]() |
登录 |
谈谈个人看法:我认为第一个括号返回3,但是n等于4;第二个括号返回5,而且n等于5;第三个括号和第一个类似,返回5但是n对于6,那么三个括号的返回值相加,按照我的理解是3+5+5=13,但是cl和gcc下却是12,I don‘t why? 但是我对下面几位兄弟的解释有点疑问: 愿雨听风 认为: 引用: 那你试试 代码: 看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 [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 [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 [hackgou] ![]() |
登录 |
就这么理解吧,容易理解些。 |
B17层 发表时间: 04-10-08 08:01 |
![]() | 回复: autosee [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 [hackgou] ![]() |
登录 |
谢谢advote兄的指点,我的那句注释:“前面两个的a++还没有执行。“的本意是说前面两个++没有执行(让a自增一的操作)。表述未清,抱歉。而且从汇编的代码来看,到我写注释处,也确实没有执行,不过肯定的是后面才对a++进行了运算。你认为到我写注释处就已经进行了运算的,为什么呢?说说你的看法? |
B20层 发表时间: 04-10-10 00:07 |
![]() | 回复: lelecool [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号