2

您好我正在学习 C 编程语言的基础知识,最近我研究了post 和 pre 递增/递减运算符以及lvalue 和 rvalue,以下程序显示错误,lvalue required,据我说它应该给出一个值6,谁能解释一下为什么?

int main(){
  int x = 8, y;
  y = --x--;
  printf("y=%d",y);
  return 0;
}

请解释一下,为什么会这样?

4

5 回答 5

6

好吧,让我们看看发生了什么--x--。首先,后减量执行:--(x--). (x--) = 7. 在此操作的结果被放置到原始结构之后: --7- 没有意义 - 因此你得到lvalue required错误

于 2013-07-03T05:16:31.290 回答
5

该语句 y = --x--;将在编译时为您提供以下错误Clvalue required. 这是因为后减运算符 --rvalue在对变量 x 进行操作后会返回一个。所以没有左值来执行预减运算符 - 之后。

但这是一个不同C的地方C++。在C下面的语句中也会给你同样的错误lvalue required

y = (--x)--;

但是在C++语句中y = (--x)--;会编译得很好并且值为yis 7。因为与 C 不同,C++lvalue在对变量 x 执行预减运算符后返回一个。

于 2013-07-03T05:17:27.767 回答
3

L Value是赋值运算符的左操作数,它应该引用内存位置。正如@Pavel 所解释的,您的 Lvalue 正在成为一个值而不是对象,因此您会遇到错误。

--x意味着x = x-1,但在你的情况下,它正在成为--7which 将等同于7 =7-1which 绝对不是有效的表达。

除了对同一变量进行多个操作之外,中间没有任何序列点,会导致未定义的行为

于 2013-07-03T05:20:50.280 回答
1

C 操作顺序指定后缀运算符优先于前缀运算符。后缀运算符返回操作数的--当前值(右值),然后递减操作数。然后将应用前缀减量运算符......但减量/增量运算符需要左值操作数,因为它们根据定义修改其操作数。因此,正如编译器所说,需要一个左值。

于 2013-07-03T05:20:09.150 回答
1

你不应该一次使用它,因为你不会理解编译器的行为。因此,您需要指导您的代码,以便他们将被迫做您喜欢的事情。

现在来谈谈你的观点。如果您想将该值减一,您可以使用a----a。他们也会这样做。如果 a = 5 并且你使用b=a--你会得到b = 5 and a = 4where 如果你使用b=--a你会得到立即分配的值,并且在b = 4 and a = 4语句完成后分配值。希望你清楚。--aa--

当找不到任何合适的变量可以分配时,会显示 L value required 错误。

于 2013-07-03T06:23:48.817 回答