回复 1# 清水河鱼 的帖子
这样的题其实挺难的,涉及到编译过程的编译器处理方式,在实际应用中我想任何程序员估计都不会故意写出这种代码。括号这个题的上下文里表示的是需要打印输出()内这个表达式的值,(x++, y)的值为当前的y值。
另外一点注意的是,函数调用时,参数从右向左被入栈,所以先执行的是最右侧的参数(y++)。所以打印的第二个数是当前的y,然后y被++,这时候第一个%d相当于是(y++)执行后的y值。
所以答案可能是A。
#include "stdafx.h" #include <stdio.h> int main(int argc, char* argv[]) { int x = 11; int y = 10; printf("%d,%d",(x++ , y), y++); return 0; }
.text:00401010 main proc near ; CODE XREF: j_mainj .text:00401010 .text:00401010 var_4C = dword ptr -4Ch .text:00401010 var_C = dword ptr -0Ch .text:00401010 var_8 = dword ptr -8 .text:00401010 var_4 = dword ptr -4 .text:00401010 .text:00401010 push ebp ; 保护EBP .text:00401011 mov ebp, esp ; 把堆栈指针复制到EBP .text:00401013 sub esp, 4Ch ; .text:00401016 push ebx ; 保护EBX,ESI,EDI .text:00401017 push esi .text:00401018 push edi .text:00401019 lea edi, [ebp+var_4C] .text:0040101C mov ecx, 13h .text:00401021 mov eax, 0CCCCCCCCh .text:00401026 rep stosd .text:00401028 mov [ebp+var_4], 0Bh ; 在栈上设置第一个临时变量x=11,地址是[sp-4] .text:0040102F mov [ebp+var_8], 0Ah ; 在栈上设置第二个临时变量y=10,地址是[sp-8] .text:00401036 mov eax, [ebp+var_4] ; 下面三句:执行x=x+1; .text:00401039 add eax, 1 .text:0040103C mov [ebp+var_4], eax .text:0040103F mov ecx, [ebp+var_8] ; 在栈上设置第三个临时变量temp,并执行temp=y; 地址是[sp-12] .text:00401042 mov [ebp+var_C], ecx .text:00401045 mov edx, [ebp+var_C] ; 以下两句:push temp; 此时首个进入栈中的参数=10 .text:00401048 push edx .text:00401049 mov eax, [ebp+var_8] ; 以下两句:push y; 此时第二个栈中的参数=10 .text:0040104C push eax .text:0040104D push offset ??_C@_05BBIB@?$CFd?0?$CFd?$AA@ ; 入栈第三个参数是"%d,%d"字符串的地址 .text:00401052 mov ecx, [ebp+var_8] ; 以下三句:执行y=y+1; 执行后y=11; .text:00401055 add ecx, 1 .text:00401058 mov [ebp+var_8], ecx .text:0040105B call printf ; 调用printf函数,相当于printf("%d,%d",10,10); .text:00401060 add esp, 0Ch .text:00401063 xor eax, eax .text:00401065 pop edi ; 恢复EDI,ESI,EBX .text:00401066 pop esi .text:00401067 pop ebx .text:00401068 add esp, 4Ch ; 复原 栈指针 .text:0040106B cmp ebp, esp .text:0040106D call __chkesp .text:00401072 mov esp, ebp .text:00401074 pop ebp .text:00401075 retn ; Main函数结束 .text:00401075 main endp