最近碰见一道 c++ 面试题,具体记不太清了,大概是问:
(x, x+20), x+29
这个表达式的值,显然多数人会回答是 x+29 ,不过面试官给的答案是 x+20 。
呵呵,他给出了验证代码
int main()
{
int x = 1;
int y;
y = (x, x+20), x+29;
cout<<y<<endl;
system(“pause”);
return 0;
}
打印出的结果是 21 ,的确是 x+20 的取值。
验证的结果的确是我们错了,可是大家是不是觉得有些问题。
给大家看个东西,也许问题就有答案了。
Precedence | Operator | Description | Example | Associativity |
1 | () | Grouping operator | (a + b) / 4; | left to right |
2 | ! | Logical negation | if( !done ) ... | right to left |
3 | ->* | Member pointer selector | ptr->*var = 24; | left to right |
4 | * | Multiplication | int i = 2 * 4; | left to right |
5 | + | Addition | int i = 2 + 3; | left to right |
6 | << | Bitwise shift left | int flags = 33 << 1; | left to right |
7 | < | Comparison less-than | if( i < 42 ) ... | left to right |
8 | == | Comparison equal-to | 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 | int a = b; | right to left |
16 | , | Sequential evaluation operator | for( i = 0, j = 0; i < 10; i++, j++ ) ... | left to right |
呵呵,“ = ”“,”都是运算符,而且其优先级都很低,但是“ = ”还是比“,”高了一点点,那么上面的问题就好解决了。
y = (x, x+20), x+29;
上面这一行其实相当于
(y = (x, x+20)), x+29;
y 表示的只能是
x, x+20
这个表达式的值,考官的验证方法不对,应该写成
y =( (x, x+20), x+29);
再试一下,果然结果是 30 ,是 x+29 的值了。
其实大家在这个问题上的观点是对的,把问题做对了就完了吗,碰见新的问题还是要思考一下的。