回复 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