这里的网站说:http://publib.boulder.ibm.com/infocenter/macxhelp/v6v81/index.jsp?topic=%2Fcom.ibm.vacpp6m.doc%2Flanguage%2Fref%2Fclrc05lvalue.htm
If an lvalue appears in a situation in which the compiler expects an rvalue,
the compiler converts the lvalue to an rvalue.
An lvalue e of a type T can be converted to an rvalue if T is not a function or
array type. The type of e after conversion will be T.
Exceptions to this is:
Situation before conversion Resulting behavior
1) T is an incomplete type compile-time error
2) e refers to an uninitialized object undefined behavior
3) e refers to an object not of type T undefined behavior
问题1:
考虑以下程序,
int main()
{
char p[100]={0}; // p is lvalue
const int c=34; // c non modifiable lvalue
&p; &c; // no error fine beacuse & expects l-value
p++; // error lvalue required
return 0;
}
我的问题是,为什么在表达式(p++)
中++(postfix)
期望l-values
,而数组是l-value
,那么为什么会出现这种错误呢?gcc错误:增量操作数需要左值|
问题2:
用example
解释exception 3
?
数组确实是lvalue,但它们是不可修改的。标准上写着:
6.3.2.1
可修改左值是指没有数组类型的左值
问题2的答案。
假设您有一个类型为double
的对象。您获取一个指针并将其强制转换为不同的指针类型。然后使用新指针取消引用对象。这是未定义的行为。
double x = 42.0;
double *p = &x;
int *q = (int *) p;
*q;
这里,*q
是int
类型的左值,其不引用int
类型的对象。