您好我正在学习 C 编程语言的基础知识,最近我研究了post 和 pre 递增/递减运算符以及lvalue 和 rvalue,以下程序显示错误,lvalue required,据我说它应该给出一个值6,谁能解释一下为什么?
int main(){
int x = 8, y;
y = --x--;
printf("y=%d",y);
return 0;
}
请解释一下,为什么会这样?
好吧,让我们看看发生了什么--x--
。首先,后减量执行:--(x--)
.
(x--) = 7
. 在此操作的结果被放置到原始结构之后:
--7
- 没有意义 - 因此你得到lvalue required
错误
该语句 y = --x--;
将在编译时为您提供以下错误C
。lvalue required
. 这是因为后减运算符 --rvalue
在对变量 x 进行操作后会返回一个。所以没有左值来执行预减运算符 - 之后。
但这是一个不同C
的地方C++
。在C
下面的语句中也会给你同样的错误lvalue required
。
y = (--x)--;
但是在C++
语句中y = (--x)--;
会编译得很好并且值为y
is 7
。因为与 C 不同,C++lvalue
在对变量 x 执行预减运算符后返回一个。
C 操作顺序指定后缀运算符优先于前缀运算符。后缀运算符返回操作数的--
当前值(右值),然后递减操作数。然后将应用前缀减量运算符......但减量/增量运算符需要左值操作数,因为它们根据定义修改其操作数。因此,正如编译器所说,需要一个左值。
你不应该一次使用它,因为你不会理解编译器的行为。因此,您需要指导您的代码,以便他们将被迫做您喜欢的事情。
现在来谈谈你的观点。如果您想将该值减一,您可以使用a--
或--a
。他们也会这样做。如果 a = 5 并且你使用b=a--
你会得到b = 5 and a = 4
where 如果你使用b=--a
你会得到立即分配的值,并且在b = 4 and a = 4
语句完成后分配值。希望你清楚。--a
a--
当找不到任何合适的变量可以分配时,会显示 L value required 错误。