|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
RT:
#include<stdio.h>
void main()
{
int a=0,b=2,c;
c=!a||++b&&a--;
printf("%d,%d,%d\n",a,b,c);
}
结果:0,2,1
上面是编译器运行的结果
但是 我觉得 结果应该是:a=-1,b=3,c=1
所以有点不明白 与运算和自增自减 在这里是怎么优化的
希望各位鱼油指教,谢谢!
//为了回答这道题,以下以C注释形式分析以下汇编代码
#include<stdio.h>
void main()
{
010F13C0 push ebp
010F13C1 mov ebp,esp
010F13C3 sub esp,0E8h
010F13C9 push ebx
010F13CA push esi
010F13CB push edi
010F13CC lea edi,[ebp-0E8h]
010F13D2 mov ecx,3Ah
010F13D7 mov eax,0CCCCCCCCh
010F13DC rep stos dword ptr es:[edi]
int a = 0, b = 2, c;
010F13DE mov dword ptr [a],0
010F13E5 mov dword ptr [b],2
//以上代码与问题无关不做解释
//------------------------------------------完美分割线--------------------------------------
c = !a || ++b && a--;
//以下两句为!a计算并实现||运算符的短路原则
010F13EC cmp dword ptr [a],0 //将a与0比较
010F13F0 je main+59h (010F1419h) //a为0则跳到地址010F1419h处,其实这里就直接跳转了,从这道010F1419h代码都没执行
//以下三句为++b实现代码
010F13F2 mov eax,dword ptr [b] //将b内存中的值移动到寄存器eax中
010F13F5 add eax,1 //eax寄存器自加1
010F13F8 mov dword ptr [b],eax //将eax的值移动回到b内存处
//当b为0则跳到010F140Dh处,不为0则继续
010F13FB je main+4Dh (010F140Dh)
//以下四句位为a--对应代码
010F13FD mov ecx,dword ptr [a] //a移动到ecx寄存器(备份a的值,以便后序判断使用)
010F1400 mov edx,dword ptr [a] //a移动到edx寄存器
010F1403 sub edx,1 //edx-1
010F1406 mov dword ptr [a],edx //将edx存会a
//ecx为刚才对a的备份,以下一句测试原来的a值是否为0,也就是实现后 -- 的先使用后自减的特性
010F1409 test ecx,ecx
010F140B jne main+59h (010F1419h) //原a不为0则表示逻辑与 && 成立, 跳到010F1419h
//原a为0则逻辑与表达式为假
010F140D mov dword ptr [ebp-0E8h],0 //用一个临时变量来存放记过(ebp-0E8h)
010F1417 jmp main+63h (010F1423h) //跳到010F1423h处
//原a不为0则表达式为真将1赋值到临时变量
010F1419 mov dword ptr [ebp-0E8h],1
//将临时变量赋值个c变量
010F1423 mov eax,dword ptr [ebp-0E8h]
010F1429 mov dword ptr [c],eax
//以下调用printf函数,不做解释
//---------------------------------------------完美分割线再现----------------------------------------
printf("%d,%d,%d\n", a, b, c);
010F142C mov esi,esp
010F142E mov eax,dword ptr [c]
010F1431 push eax
010F1432 mov ecx,dword ptr [b]
010F1435 push ecx
010F1436 mov edx,dword ptr [a]
010F1439 push edx
010F143A push 10F5858h
010F143F call dword ptr ds:[10F9114h]
010F1445 add esp,10h
010F1448 cmp esi,esp
010F144A call __RTC_CheckEsp (010F1136h) //堆栈平衡检测
}
|
|