左值和右值的问题,不是很清楚
- C/C++ code
#include <cstdio>int main(){ int a=4,b=4; (++a) += a;//A (b++) += b;//B printf("%d,%d",a,b); return 0;}
A句和B句有一个是错误的,我也是运行后才知道的。
尽量不运行,大家分析下,哪个对,哪个错;对的那个输出多少,错的那个为什么错?
[解决办法]
我感觉两条都不行……不必纠结左值右值,一般一旦涉及到左右值,就会出现这种搅在一起非常规的代码。
你在面试的时候一旦写这种代码,不管对不对,直接被刷
[解决办法]
倒是有一种说法,++a不产生临时变量。
但我感觉从简化编译器实现的角度,从防止这种代码风格的角度,两条要么都对要么都错
[解决办法]
B不对~
[解决办法]
(++a) += a;//A这个是对的吧,
(b++) += b;//B b++会生成临时变量,临时变量无法赋值
[解决办法]
(b++) += b;//B
错误.b++返回右值,即一个临时对象,C中不能修改这个临时对象,所以:临时对象+=xxx是错误的.
(++a) += a;//A
编译正确,因为++a返回左值(就是a本身),所以可以对左值进行修改.至于这句结果是怎么,具有编译器相关性,如果先计算+=右边表达式a的值,再计算左边表达式++a的值;或者反过来,结果是不一样的.如果面试,建议直接列举出所有可能的结果,让主考官自行选择.
[解决办法]
得出测试结论了……C语言都错,C++第一个对
[解决办法]
[解决办法]