[C/C++]c++运算符优先级和运算中类型转换问题!
今天看程序员面试宝典发现了一个问题。在P37的例子中,宝典认为>>比~的优先级高。这是错误的。实际上~比>>的优先级高。程序代码如下:
出处:http://hi.baidu.com/tju_jierry/blog/item/dfb25a0053c6c10f1c958361.html
#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