注册 登录
编程论坛 数据结构与算法

两道题怎么理解不了了呢

xiawengxing 发布于 2010-04-05 13:43, 1120 次点击
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

10 回复
#2
编程小呆2010-04-05 15:35
程序代码:
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
#3
编程小呆2010-04-05 15:36
这种代码,只为在考试或者应聘时遇到,平时写代码肯定不会这么写,读这种代码也会晕死~~
#4
许苏娟2010-04-06 12:56
i++:a=i,i=i+1;
++i:i=i+1,a=i
#5
许苏娟2010-04-06 12:57
我觉得答案该是[5,10]和[5,11]!
#6
xiawengxing2010-04-06 19:38
回复 5楼 许苏娟
我做的和你的一样。  答案看不懂!
#7
草狼2010-04-07 16:14
我也觉的是【5,10】和【5,11】;你那答案错了吧
#8
玩出来的代码2010-04-07 21:03
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;
#9
恋辰2010-04-07 23:07
这个题目在不同的编译环境下的结果是不同的  
在 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
#10
asdjc2010-04-09 14:08
答案应该是5,10和5,11.
其实很简单:
++i的意思是增加后赋值,即i增加1,并且++i的值是原i值加一。
而i++的意思是赋值后自增,即i先赋值,i++的值是原i值,但赋值完后,i=i+1.
#11
xiawengxing2010-04-24 18:12
回复 9楼 恋辰
答案是5 9和5 10 vc6.0运行的结果
1