Rvalue或Lvalue?

时间:2014-06-06 14:16:30

标签: c expression lvalue rvalue

给出两个变量:

int x
int* p

和这些表达:

  1. *(&x+*p)+x

  2. &p+x

  3. *(&p-(int**)&x)+x

  4. *(&x+*(p+7))

  5. 对于每个表达式,找出它是否有效,如果它是Rvalue表达式或Lvalue表达式以及它代表什么类型。

    1. 我认为第一个无效。

    2. 应该是int类型的R值,我是对吗?

    3. 其他人怎么样?谢谢你的帮助!

1 个答案:

答案 0 :(得分:4)

我认为最好的回答方法是解释会发生什么,并提出一些问题"并将决定留给您。

  
      
  1. *(&x+*p)+x
  2.   
  3. &p+x
  4.   
  5. *(&p-(int**)&x)+x
  6.   
  7. *(&x+*(p+7))
  8.   
  1.   

    我认为第一个无效。

    你为什么这么认为?这完全是关于指针算术的。

    但是你到目前为止是正确的,因为访问可能是未定义的。但是这并没有改变任何关于资格的东西,如Lvalue或Rvalue。

    请注意,*(a+b)a[b]相同,因此可以写为(&x)[*p] + x,i。即int + int。是否可以为其分配任何内容?

  2.   

    应该是int类型的R值,我是对的吗?

    不,你不是。它是pointer + integer,结果是指针。

  3. *(&p-(int**)&x)+x

    这基本上是*(pointer-pointer) + integer。由于pointer-pointer是整数,因此无法解除引用,...

  4. *(&x+*(p+7))

    这是*(pointer + *(pointer+integer)),所以*(pointer + integer)。可以分配给?