一道“简单”的笔试题 (c /c++ ,汇编)

来源:互联网 发布:led显示屏网络推广 编辑:程序博客网 时间:2024/05/16 11:03
bool z ;
    int a = 1;
    int b = 2;
    int c = 1;

    z = a && b || ++c;

    cout<<"z: c:"<<z<<c<<endl;


问输出z, c的值。 直接得到了 1, 2. 但是结果错了。 为什么, 自己以为答案给错了呢, 一直纠结了好几天了,决心用程序看看。


    bool z ;
    int a = 1;
004114DE C7 45 EC 01 00 00 00 mov         dword ptr [a],1
    int b = 2;
004114E5 C7 45 E0 02 00 00 00 mov         dword ptr [b],2
    int c = 1;
004114EC C7 45 D4 01 00 00 00 mov         dword ptr [c],1

    z = a && b || ++c;
004114F3 83 7D EC 00      cmp         dword ptr [a],0
004114F7 74 06            je          wmain+3Fh (4114FFh)
004114F9 83 7D E0 00      cmp         dword ptr [b],0
004114FD 75 17            jne         wmain+56h (411516h)
004114FF 8B 45 D4         mov         eax,dword ptr [c]
00411502 83 C0 01         add         eax,1
00411505 89 45 D4         mov         dword ptr [c],eax
00411508 75 0C            jne         wmain+56h (411516h)
0041150A C7 85 0C FF FF FF 00 00 00 00 mov         dword ptr [ebp-0F4h],0
00411514 EB 0A            jmp         wmain+60h (411520h)
00411516 C7 85 0C FF FF FF 01 00 00 00 mov         dword ptr [ebp-0F4h],1
00411520 8A 8D 0C FF FF FF mov         cl,byte ptr [ebp-0F4h]
00411526 88 4D FB         mov         byte ptr [z],cl

    cout<<"z: c:"<<z<<c<<endl;

。。。。。略

注意以上红色部分, 可以看到,生成的汇编语言很直白的告诉我们, 当a, b非0时, 直接将1给了z, 之后并没有再用到c,也就不可能c+1了。 这又让我想起, &&, || 的用法。 && 前边为真才去计算&&后边,否则不再计算机; || 当前边为真不再计算后边。

这脑子,不好使了。

0 0
原创粉丝点击