首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

左值和右值的有关问题,不是很清楚

2012-02-14 
左值和右值的问题,不是很清楚C/C++ code#include cstdioint main(){int a4,b4(++a) + a//A(b++) +

左值和右值的问题,不是很清楚

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++第一个对
[解决办法]
探讨
C99标准好象是规定++i只类的返回的是左值吧...难道我记错了?

[解决办法]
探讨
具有编译器相关性
也这么觉得,但没有十足的把我,我在vc6.0下和codeblocks下输出a都是10

热点排行