与前后增量运算符混淆

时间:2013-07-03 05:10:45

标签: c operators lvalue

你好我正在学习C编程语言的基础知识,最近我研究过 post和pre increment / decrement 运算符以及 lvalue和rvalue ,以下程序显示一个错误,需要左值,据我说它应该给出 6 的值,有人可以解释一下原因吗?

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

请解释,为什么会这样?

5 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:4)

语句y = --x--;将在C中编译时出现以下错误。 lvalue required。这是因为后递减运算符 - 在对变量x进行操作后将返回rvalue。因此,没有左值来执行预减量运算符 - 之后。

但这是CC++不同的一点。在C中,以下语句也会为您提供相同的错误lvalue required

y = (--x)--;

但在C++中,语句y = (--x)--;将正常编译,y的值为7。因为与C不同,C ++在对变量x执行预递减运算符后返回lvalue

答案 2 :(得分:2)

L Value是赋值运算符的操作数,它应该引用内存位置。正如@Pavel所解释的那样,你的Lvalue变成了一个非对象的值,所以你会收到错误。

--x表示x = x-1,但在您的情况下,它变为--7,相当于7 =7-1,这绝对不是有效的表达。

除了同一个变量上的多个操作之外,其间没有任何sequence point,结果为undefined behaviour

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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

当找不到可以分配的任何合适变量时,显示L值必需错误。