c-L值到R值的转换



这里的网站说: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;

这里,*qint类型的左值,其不引用int类型的对象。

最新更新