您的位置:首页 > 其它

关于'a++'和'++a'和'a+5'是否能作左值的问题

2008-05-16 10:00 246 查看
在网络上看的几篇文章都说不的不太清楚。也之能做为参考!

定义:
凡是可以“被赋值”的表达式,就叫“左值”,左值总是直接的或间接的变量
凡是可以“赋值给”左值的,就叫“右值”,右值可以是变量、常量、函数调用等
左值定义很简单,只要是能被赋值的就是左值。

例子:
void main()
{
int a = 0;
a++ = 1;
++a = 1;
a+5 = 1;
a=6 = 1;
}
编译器会告诉你哪些不是左值。

解释:

1.什么是左值
int a = 2;
这句话里面2是一个"值",a是一个变量,它有一个4字节的内存区域,这个内存区域里面装着2,这就暗示这个内存区域可以被改写,可以被赋值,可以出现在=号的左边
a是一个"左值"
而2就仅仅是一个2,它是一个值,我看看到它,就认为它是一个2,只能把他赋给别人,不能被赋值
2是一个"右值",而且不能是"左值",而a可以赋值给别人,所以a即是一个"左值"又是一个"右值"

2.文字常量和变量都可以作右值

3.所有的左值都是右值,反之就不见得

<重要>4.并不是左值就是可以赋值的值
可以被赋值的左值称为modifiable l-values
不可赋值的左值(nonmodifiable l-value)大概有
a. 常量值,const int i;是一个左值,但是他是不可赋值的 (初始化不算)
b. 一个数组类型,它是左值,但是他是不能赋值的
c. 如果一个struct或union里面包含常量值,他就是不可赋值的

5.左值大概包括
a. An identifier of integral, floating, pointer, structure, or union type
b. A subscript ([ ]) expression that does not evaluate to an array
c. A member-selection expression (–> or .)
d. A unary-indirection (*) expression that does not refer to an array
e. An l-value expression in parentheses
f. A const object (a nonmodifiable l-value)

6.引用类型永远是左值 (这里因该说的是int a =q; int * b; b = &a ; &是引用吧,那就是右值的吧!)

7.左值通常是一个变量

8.举一个例子
void main()
{
int i, j, *p;
i = 7; // Correct. A variable name, i, is an l-value.
7 = i; // C2106. A constant, 7, is an r-value.
j * 4 = 7; // C2106. The expression j * 4 yields an r-value.
*p = i; // Correct. A dereferenced pointer is an l-value.
const int ci = 7; // Declare a const variable.
ci = 9; // C2166 ci is a nonmodifiable l-value, so the
// assignment causes an error message to
// be generated.
((i < 3) ? i : j) = 7; // Correct. Conditional operator (? :)
// returns an l-value.
}

8.现在来看++a,a++,a+5,a=6问题
++a = 22;里面先++a,返回的东西是 a, 而a是一个变量,显然是一个是一个左值,他可被程序寻址,可以改变它的值
a++呢?a++是什么东西?a++是一个引用了临时对象的表达式,用户不能寻址该对象,也不能改变它的值,所以它是右值,不是左值
a+5也是一个引用了临时对象的表达式,用户不能寻址该对象,也不能改变它的值,所以它是右值,不是左值
a=6显然是左值,就不用说了

我在linux下实验了下跟上面的解释有不同的地方就是(++a = 1)也是无效的。
void main()
{
int a = 0;
a++ = 1; 无效左值
++a = 1; 无效左值
a+5 = 1; 无效左值
a=6 = 1; 无效左值
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐