3

这是我读到的关于左值的几个定义

  1. 可与 & 运算符一起使用的表达式。即如果 &(expression) 不是错误,则表达式是左值

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

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

  4. 右值表达式只能在 RHS 上使用

如有错误请指正

这是问题

我读到 ++x 是一个左值,而 x++ 是一个右值

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

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

如果左值表达式可以在 lhs 上使用

int i = 0;
++i = 10;

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

更新:上述两个语句在 C++ 中都很好

4

5 回答 5

4

左值也不++ii++

您可能正在考虑哪些都是左值(如果 x 具有指针类型)*x++*++x

于 2013-05-06T13:23:00.053 回答
3

++ilvalueC++中,在C中它是一个rvalue(在 C 标准中称为表达式的值),不能赋值。

于 2013-05-06T13:21:54.313 回答
2

我以为这个问题会被关闭,我只留下了评论。多么大的错误;)

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

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++ 正确编译并产生:

10
12
于 2013-05-06T13:32:17.403 回答
1

C11 中的(相当模糊的)正式定义:

粗体字的重点是我添加的)

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

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

脚注(非规范)及进一步解释:

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

所以左值必须是“可能”指定一个对象的东西。无论“潜在”意味着什么,都可以进行个人解释......

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

在您的情况下, ++i 和 i++ 都没有指定实际对象,因此它们都不是左值。它们是右值。

于 2013-05-06T13:40:35.987 回答
0

通过创建++i一个左值,想象你现在可以这样做:

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

除了鼻部守护进程,你希望i之后的样子是什么?4?3?

于 2013-05-06T13:14:20.067 回答