多说则错,小菜鸡粗略总结一下:
单目运算符的操作数大部分是左值,如&,sizeof。
赋值运算符的左边是左值,右边是右值。
左值是变量,但不是临时变量(应该讲临时对象,如a+b不需要一个变量名表示他),左值既能知道它的地址,也能改变它的值。已经声明的变量都是左值
int a=3,b=4;
5=a; //常量不行
a+b=5; //临时变量不行
&和*:
int a=3,b=4;
int *c=&a;
&(&c); //error:'&' requires l-value 说明&输入左值返回右值
*(&c); //可以 说明*接受右值输入
&(*c); //可以 说明*返回左值输出
数组名:
数组名在3种情况下是左值,
1.初始化的时候,如in a[5];
2.sizeof 的时候,就像伪代码sizeof(数组)一样,得到的是数组大小20个字节
3.&的时候,得到一个指向数组的指针
其他时候数组名退化成指针常量,指向数组的第一个元素。指针常量是右值,所以a++等操作是不行的。
常量一定不是左值吗:
按照我上面的说法是的,因为常量就算知道地址,也无法改变它的值。可惜我上面说的话有瑕疵。看代码:
int a=3;
const int d=9;
int f[4]={1,2,3,4};
d=5;
3=4;
f=&a;
d=5;
3=4;
f=&a;这3行都会报错,d、3、f他们也都是常量,但是报错的内容不一样