| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1120 人关注过本帖
标题:两道题怎么理解不了了呢
只看楼主 加入收藏
xiawengxing
Rank: 2
来 自:内蒙古
等 级:论坛游民
帖 子:33
专家分:42
注 册:2010-4-2
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:10 
两道题怎么理解不了了呢
1 假设有int i=2,k;则执行k=(i++)+(++i)+(i++);语句后i和k的值分别是_______.       答案:5和9
2 假设有int i=2,k;则执行k=(i++)+(++i)+(++i);语句后i和k的值分别是
_______.       答案:5和10

2010-04-05 13:43
编程小呆
Rank: 2
来 自:西电
等 级:论坛游民
帖 子:31
专家分:23
注 册:2010-3-20
收藏
得分:3 
程序代码:
file "tes.c"

 .def ___main; .scl 2; .type 32; .endef

 .section .rdata,"dr"
LC0:

 .ascii "%d\12\0"

 .text
.globl _main

 .def _main; .scl 2; .type 32; .endef
_main:

 pushl %ebp

 movl %esp, %ebp

 subl $24, %esp

 andl $-16, %esp

 movl $0, %eax

 addl $15, %eax

 addl $15, %eax

 shrl $4, %eax

 sall $4, %eax

 movl %eax, -12(%ebp)

 movl -12(%ebp), %eax

 call __alloca

 call ___main       ;从这里开始看起

 movl $2, -4(%ebp)  ;为局部变量i分配空间并赋初值2

 leal -4(%ebp), %eax

 incl (%eax)        ;i++

 leal -4(%ebp), %eax

 incl (%eax)        ;i++  可以看出首先i自增两次变为4

 movl -4(%ebp), %eax

 movl -4(%ebp), %edx

 addl %eax, %edx   ;2+4=6 保存在eax中

 leal -4(%ebp), %eax

 incl (%eax)       ;i++ 这时候i自增为5

 movl %edx, %eax

 addl -4(%ebp), %eax ;6+3=9 保存在eax中

 movl %eax, -8(%ebp) ;给变量j赋值,也即此时eax中的9

 movl -8(%ebp), %eax

 movl %eax, 4(%esp)

 movl $LC0, (%esp)

 call _printf

 leave

 ret

 .def _printf; .scl 3; .type 32; .endef
2010-04-05 15:35
编程小呆
Rank: 2
来 自:西电
等 级:论坛游民
帖 子:31
专家分:23
注 册:2010-3-20
收藏
得分:0 
这种代码,只为在考试或者应聘时遇到,平时写代码肯定不会这么写,读这种代码也会晕死~~
2010-04-05 15:36
许苏娟
Rank: 1
等 级:新手上路
威 望:1
帖 子:40
专家分:9
注 册:2010-4-3
收藏
得分:0 
i++:a=i,i=i+1;
++i:i=i+1,a=i
2010-04-06 12:56
许苏娟
Rank: 1
等 级:新手上路
威 望:1
帖 子:40
专家分:9
注 册:2010-4-3
收藏
得分:1 
我觉得答案该是[5,10]和[5,11]!
2010-04-06 12:57
xiawengxing
Rank: 2
来 自:内蒙古
等 级:论坛游民
帖 子:33
专家分:42
注 册:2010-4-2
收藏
得分:0 
回复 5楼 许苏娟
我做的和你的一样。  答案看不懂!
2010-04-06 19:38
草狼
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:577
专家分:1040
注 册:2010-4-6
收藏
得分:0 
我也觉的是【5,10】和【5,11】;你那答案错了吧
2010-04-07 16:14
玩出来的代码
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:河南新乡
等 级:贵宾
威 望:11
帖 子:742
专家分:2989
注 册:2009-10-12
收藏
得分:5 
i=2;
k=(i++)+(++i)+(++i);
这中题确实没意思。
在不同的编译器中,得到的答案或许不同。
标准规定符号按优先级计算,但在优先级相同的情况下并没有规定谁先执行。
其实看下反汇编就明白了。
看下面的再VC6和VS2005下的反汇编代码就清楚了。、
程序代码:
VC6
5:        int h=(i++)+(++i)+(++i);
0040D74F   mov         eax,dword ptr [ebp-4]   i的值2放入eax
0040D752   add         eax,1                    //eax+1 
0040D755   mov         dword ptr [ebp-4],eax      // eax的值赋值给i,此时i=3
0040D758   mov         ecx,dword ptr [ebp-4]       
0040D75B   add         ecx,dword ptr [ebp-4]    // eax中的值与i相加 此时 eax的值为 6
0040D75E   mov         edx,dword ptr [ebp-4]    //将i的值(i=3)放入edx
0040D761   add         edx,1                     
0040D764   mov         dword ptr [ebp-4],edx     //edx加1后 赋值给i,此时i=4
0040D767   add         ecx,dword ptr [ebp-4]      ecx与i相加  此时ecx为10
0040D76A   mov         dword ptr [ebp-8],ecx      //将ecx的值赋值给 k,k=10
0040D76D   mov         eax,dword ptr [ebp-4]      //再取得i的值放入eax ,此时i=4
0040D770   add         eax,1                        //eax+1
0040D773   mov         dword ptr [ebp-4],eax       //eax赋值给i ,此时i=5;
6:        printf("%d",h);
0040D776   mov         ecx,dword ptr [ebp-8]    //k的值为10
0040D779   push        ecx
0040D77A   push        offset string "%d" (00422fa4)
0040D77F   call        printf (004010a0)

VS2005
    int h=(i++)+(++i)+(++i);
004113B5  mov         eax,dword ptr [i]
004113B8  add         eax,1
004113BB  mov         dword ptr [i],eax
004113BE  mov         ecx,dword ptr [i]
004113C1  add         ecx,1                //上面和VC下的相同,看后面就不一样了
004113C4  mov         dword ptr [i],ecx    //先计算了两次++i,此时i=4  
004113C7  mov         edx,dword ptr [i]
004113CA  add         edx,dword ptr [i]
004113CD  add         edx,dword ptr [i]       
004113D0  mov         dword ptr [h],edx    //到这里三个i相加结果存入h,此时h=12,i=4
004113D3  mov         eax,dword ptr [i]
004113D6  add         eax,1
004113D9  mov         dword ptr [i],eax     //i再次加1;

离恨恰如春草,更行更远还生。
2010-04-07 21:03
恋辰
Rank: 1
等 级:新手上路
帖 子:3
专家分:1
注 册:2010-4-7
收藏
得分:1 
这个题目在不同的编译环境下的结果是不同的  
在 turbo c 2.0(win-tc)z中的结果是:
1 假设有int i=2,k;则执行k=(i++)+(++i)+(i++);语句后i和k的值分别是_______。      答案:5和9
2 假设有int i=2,k;则执行k=(i++)+(++i)+(++i);语句后i和k的值分别是_______。      答案:5和12
2010-04-07 23:07
asdjc
Rank: 6Rank: 6
来 自:武汉
等 级:侠之大者
威 望:7
帖 子:98
专家分:487
注 册:2010-1-22
收藏
得分:0 
答案应该是5,10和5,11.
其实很简单:
++i的意思是增加后赋值,即i增加1,并且++i的值是原i值加一。
而i++的意思是赋值后自增,即i先赋值,i++的值是原i值,但赋值完后,i=i+1.
2010-04-09 14:08
快速回复:两道题怎么理解不了了呢
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025369 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved