C中左值和右值的条件

时间:2013-05-06 13:08:47

标签: c

以下是我读到的关于左轮手枪的几个定义

  1. 可用于&amp ;;的表达式运营商。即如果&(表达式)不是错误,则表达式为左值

  2. 导致非临时对象的表达式

  3. 左值表达式可用于RHS和LHS =运算符

  4. rvalue表达式只能用于RHS

  5. 如果错误请更正

    这是问题

    我读到++ x是左值,x ++是右值

    int i = 0;
    printf("%p",(void*)&++i);
    

    如果是这样,为什么这是一个错误?

    如果lvalue表达式可用于lhs

    int i = 0;
    ++i = 10;
    

    为什么我不能使用上面的语句?以上都导致错误

    更新:以上陈述在C ++中都很好

5 个答案:

答案 0 :(得分:4)

++ii++都不是左值。

您可能会考虑*x++*++x这两个都是左值(如果x有指针类型)。

答案 1 :(得分:3)

++i仅在{strong> C ++ 中为lvalue,在 C 中为rvalue(称为值为标准中的表达式),无法分配。

答案 2 :(得分:2)

我认为这个问题会被关闭,我只留下评论。真是个大错误;)

在C中(问题的标签是 C )++ i运算符会“返回”一个值,而不是变量本身。因此无法检索到它的地址。换句话说,++i不是左值。两者都不是i++

关于某些结构是l-和r-值,C ++可能与C不同。

http://eli.thegreenplace.net/2011/12/15/understanding-lvalues-and-rvalues-in-c-and-c/

对于C ++,这两个是左值。

这个简单的代码:

#include <stdio.h>

int main() {
  int i=0;
  ++i = 10;
  printf("\n%d\n", i);
  ++i = ++i;
  printf("%d\n", i);
}

使用gcc编译将给出:

lvalue.c:3: error: invalid lvalue in assignment
lvalue.c:4: warning: incompatible implicit declaration of built-in function ‘printf’
lvalue.c:5: error: invalid lvalue in assignment

并且正确编译g ++和yelds:

10
12

答案 3 :(得分:1)

来自C11的(相当含糊的)正式定义:

(强调粗体字体由我添加)

  

6.3.2.1左值,数组和函数指示符

     

左值是一个表达式(对象类型不是void)可能指定一个对象(64);如果左值在评估时未指定对象,则行为未定义。当一个对象被称为具有特定类型时,该类型由用于指定该对象的左值指定。可修改的左值是一个左值,它没有数组类型,没有不完整的类型,没有const限定类型,如果是结构或联合,则没有任何成员(包括,递归地,任何成员)或具有const限定类型的所有包含聚合或联合的元素。

脚注(非规范性)及进一步说明:

  

64)名称“左值”最初来自赋值表达式E1 = E2,其中左操作数E1需要是(可修改的)左值。它可能更好地被视为表示对象“定位器值”。有时被称为“rvalue”的内容在本国际标准中被描述为“表达的价值”。

因此,左值必须是“潜在地”指定对象的东西。无论“潜在”的意思是开放的个人解释......

尽管有上述脚注,但C标准缺乏正确的右值定义。具有讽刺意味的是,整个标准中提到右值的唯一地方是一脚注。

在你的情况下,++ i和i ++都没有指定一个实际的对象,所以它们都不是左值。它们相当于价值。

答案 4 :(得分:0)

通过将++i设为左值,假设您现在可以执行:

int i=2;
++i = ++i;

除了鼻守护进程之外,你希望i之后看起来像什么? 4? 3?