位运算的一个坑

来看这段代码

#include <stdio.h>

int main() {
    int a = 1, b = 0;
    if (a|b == 0) {
        printf("1\n");
    } else {
        printf("2\n");
    }
    return 0;
}

这段代码想表达的意思是,如果两个 int 都为 0,那么走 if 分支,不然的话,走 else 分支,嗯,大家都是这么想的,实际上,他输出什么呢?

输出 1。

因为位运算的优先级比判等的优先级低。

http://en.cppreference.com/w/c…

Precedence Operator Description Associativity
1 :: Scope resolution Left-to-right
2 ++   -- Suffix/postfix increment and decrement
() Function call
[] Array subscripting
. Element selection by reference
-> Element selection through pointer
3 ++   -- Prefix increment and decrement Right-to-left
+   Unary plus and minus
!   ~ Logical NOT and bitwise NOT
(type) Type cast
* Indirection (dereference)
& Address-of
sizeof Size-of
new, new[] Dynamic memory allocation
delete, delete[] Dynamic memory deallocation
4 .*   ->* Pointer to member Left-to-right
5 *   /   % Multiplication, division, and remainder
6 +   Addition and subtraction
7 <<   >> Bitwise left shift and right shift
8 <   <= For relational operators < and ≤ respectively
>   >= For relational operators > and ≥ respectively
9 ==   != For relational = and ≠ respectively
10 & Bitwise AND
11 ^ Bitwise XOR (exclusive or)
12 | Bitwise OR (inclusive or)
13 && Logical AND
14 || Logical OR
15 ?: Ternary conditional Right-to-left
= Direct assignment (provided by default for C++ classes)
+=   −= Assignment by sum and difference
*=   /=   %= Assignment by product, quotient, and remainder
<<=   >>= Assignment by bitwise left shift and right shift
&=   ^=   |= Assignment by bitwise AND, XOR, and OR
16 throw Throw operator (for exceptions)
17 , Comma Left-to-right

Leave a Reply

Your email address will not be published. Required fields are marked *