你好我正在学习C编程语言的基础知识,最近我研究过 post和pre increment / decrement 运算符以及 lvalue和rvalue ,以下程序显示一个错误,需要左值,据我说它应该给出 6 的值,有人可以解释一下原因吗?
int main(){
int x = 8, y;
y = --x--;
printf("y=%d",y);
return 0;
}
请解释,为什么会这样?
答案 0 :(得分:5)
好吧,让我们看看--x--
中发生了什么。
首先,后递减执行:--(x--)
。
(x--) = 7
。
之后,将此操作的结果放置到原始结构:
--7
- 没有意义 - 因此您会收到lvalue required
错误
答案 1 :(得分:4)
语句y = --x--;
将在C
中编译时出现以下错误。 lvalue required
。这是因为后递减运算符 - 在对变量x进行操作后将返回rvalue
。因此,没有左值来执行预减量运算符 - 之后。
但这是C
和C++
不同的一点。在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值必需错误。