今天看程式員面試寶典發現了一個問題。在P37的例子中,寶典認為>>比~的優先順序高。這是錯誤的。實際上~比>>的優先順序高。程式碼如下:
#include <iostream>
using namespace std;
int main()
{
unsigned char a=0xA5;
unsigned char b=~a>>4;
printf("b=%d\n",b);
system("PAUSE");
return 0;
}
解析:char signed char unsigned char和short int參與運算時會提升為類型int.
a=0XA5 提示為0X000000A5 然後進行求反得到0XFFFFFF5A 然後移位得到0X0FFFFFF5 最終轉化成u char 得到0XF5 ,既是輸出結果16*15+5=245.(當為char時那麼就是變數的最高位補齊,unsigned補位時用0補起 )
這是台網某CPU公司的面試題。程式輸出結果是245。雖然認為>>優先順序高於~能得出正確的結果,但是我們應該找到正確的原因。
因為unsigned char和char類型變數在參與運算的時候,會首先被提升為int類型,計算完畢再轉換成unsigned char 或char類型。從這個正確的角度,就可以得到正確的結果。
我們可以用以下代碼進行驗證。
char a=0x15;
int b=~a;
printf("b=%08x\n",b);
附錄c++運算子優先順序:http://www.cppreference.com/operator_precedence.html
| Precedence |
Operator |
Description |
Example |
Associativity |
| 1 |
() [] -> . :: ++ -- |
Grouping operator Array access Member access from a pointer Member access from an object Scoping operator Post-increment Post-decrement |
(a + b) / 4; array[4] = 2; ptr->age = 34; obj.age = 34; Class::age = 2; for( i = 0; i < 10; i++ ) ... for( i = 10; i > 0; i-- ) ... |
left to right |
| 2 |
! ~ ++ -- - + * & (type) sizeof |
Logical negation Bitwise complement Pre-increment Pre-decrement Unary minus Unary plus Dereference Address of Cast to a given type Return size in bytes |
if( !done ) ... flags = ~flags; for( i = 0; i < 10; ++i ) ... for( i = 10; i > 0; --i ) ... int i = -1; int i = +1; data = *ptr; address = &obj; int i = (int) floatNum; int size = sizeof(floatNum); |
right to left |
| 3 |
->* .* |
Member pointer selector Member pointer selector |
ptr->*var = 24; obj.*var = 24; |
left to right |
| 4 |
* / % |
Multiplication Division Modulus |
int i = 2 * 4; float f = 10 / 3; int rem = 4 % 3; |
left to right |
| 5 |
+ - |
Addition Subtraction |
int i = 2 + 3; int i = 5 - 1; |
left to right |
| 6 |
<< >> |
Bitwise shift left Bitwise shift right |
int flags = 33 << 1; int flags = 33 >> 1; |
left to right |
| 7 |
< <= > >= |
Comparison less-than Comparison less-than-or-equal-to Comparison greater-than Comparison geater-than-or-equal-to |
if( i < 42 ) ... if( i <= 42 ) ... if( i > 42 ) ... if( i >= 42 ) ... |
left to right |
| 8 |
== != |
Comparison equal-to Comparison not-equal-to |
if( i == 42 ) ... if( i != 42 ) ... |
left to right |
| 9 |
& |
Bitwise AND |
flags = flags & 42; |
left to right |
| 10 |
^ |
Bitwise exclusive OR |
flags = flags ^ 42; |
left to right |
| 11 |
| |
Bitwise inclusive (normal) OR |
flags = flags | 42; |
left to right |
| 12 |
&& |
Logical AND |
if( conditionA && conditionB ) ... |
left to right |
| 13 |
|| |
Logical OR |
if( conditionA || conditionB ) ... |
left to right |
| 14 |
? : |
Ternary conditional (if-then-else) |
int i = (a > b) ? a : b; |
right to left |
| 15 |
= += -= *= /= %= &= ^= |= <<= >>= |
Assignment operator Increment and assign Decrement and assign Multiply and assign Divide and assign Modulo and assign Bitwise AND and assign Bitwise exclusive OR and assign Bitwise inclusive (normal) OR and assign Bitwise shift left and assign Bitwise shift right and assign |
int a = b; a += 3; b -= 4; a *= 5; a /= 2; a %= 3; flags &= new_flags; flags ^= new_flags; flags |= new_flags; flags <<= 2; flags >>= 2; |
right to left |
| 16 |
, |
Sequential evaluation operator |
for( i = 0, j = 0; i < 10; i++, j++ ) ... |
left to right |
出處:http://hi.baidu.com/tju_jierry/blog/item/dfb25a0053c6c10f1c958361.html