[英]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.