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

han*_*ish 3 c bit-shift operator-precedence

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

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

小智 5

询问优先级,+优先级高于<<>>,所以表达式是

b << (a + b) >> 2
Run Code Online (Sandbox Code Playgroud)

评估为

2 << (4 + 2) >> 2 = 2 << 6 >> 2
Run Code Online (Sandbox Code Playgroud)

现在,有再决定哪一部分首先计算- <<>>具有相同的优先级,但关联性就派上用场了,对于<<>>左到右,所以这意味着最左边的操作者首先计算:

(2 << 6) >> 2 = 128 >> 2 = 32
Run Code Online (Sandbox Code Playgroud)

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

((b << (a + b)) >> 2
Run Code Online (Sandbox Code Playgroud)

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