繁体   English   中英

使用左右移位运算符时的优先级

[英]Precedence while using right and left shift operators

我想知道以下C程序的输出是如何32的。请给我一步一步的指导。

main()
{
    int a=4,b=2;
    a=b<<a+b>>2;
    printf("%d",a);
}

询问优先级+具有比<<>>更高的优先级,所以表达式是

b << (a + b) >> 2

评估为

2 << (4 + 2) >> 2 = 2 << 6 >> 2

现在,再次确定哪个部分首先被评估 - <<>>具有相同的优先级 ,但是关联性来拯救,因为<<>>它是从左到右 ,所以这意味着最左边的运算符首先评估:

(2 << 6) >> 2 = 128 >> 2 = 32

编辑 :一步完成,尊重优先级关联性 ,原始表达式b<<a+b>>2读取以下完全括号:

((b << (a + b)) >> 2

对于未来的疑虑,有一个表格显示优先级和关联性是非常有帮助的。 或者只是使用一些“多余的”括号来使表达对人类更具可读性;)

int a=4,b=2;
a=b<<a+b>>2;

这里b是2 ==(0000 0000 0010)

a = 2<<(4+2)>>2; // as ADD(+) is having higher precedence so first we will solve addtion.
a = 2 << 6 >> 2;

a = ((2 << 6) >> 2); //<<  >>, Associativity (left-to-right) so first solve (2 << 6).

向左移6位

After solving 2<<6  (0000 1000 0000)  == 128  
                          ^^^^ ^^   <-- left  

向右移2位

Now 128>>2  (0000 0010 0000)  == 32.  
        Right -->  ^^

如果你看一下这段代码的反汇编:

    31:                 int a = 4, b = 2;
00007FFE91FC449C C7 45 24 04 00 00 00 mov         dword ptr [rbp+24h],4  
00007FFE91FC44A3 C7 45 20 02 00 00 00 mov         dword ptr [rbp+20h],2  
    32:                 a = b << a + b >> 2;
00007FFE91FC44AA 8B 4D 24             mov         ecx,dword ptr [rbp+24h]  
00007FFE91FC44AD 8B 45 20             mov         eax,dword ptr [rbp+20h]  
00007FFE91FC44B0 03 C8                add         ecx,eax  
00007FFE91FC44B2 83 E1 1F             and         ecx,1Fh  
00007FFE91FC44B5 8B 45 20             mov         eax,dword ptr [rbp+20h]  
00007FFE91FC44B8 D3 E0                shl         eax,cl  
00007FFE91FC44BA 8B C8                mov         ecx,eax  
00007FFE91FC44BC C1 F9 02             sar         ecx,2  
00007FFE91FC44BF 89 4D 24             mov         dword ptr [rbp+24h],ecx 

如您所见, +运算符首先完成, <<>>运算符具有相同的优先级并具有从左到右的相关性(因此从左到右执行),因此您的代码可以简化为:

main()
{
    int a = 4, b = 2;
    a = a + b; //6
    a = b << a; //128
    a = a >> 2; //32
    printf("%d", a);
}

请注意,除了最后一个赋值和去除之外,函数中没有实际的赋值。

你的代码就像把它写成a = b << (a + b) >> 2;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM