C 为什么-(int)int是任何int值,一个r值? #包括 int main() { int i=10; printf(“%d”,++(-i)); 返回0; }

C 为什么-(int)int是任何int值,一个r值? #包括 int main() { int i=10; printf(“%d”,++(-i)); 返回0; },c,C,这显然是一个编译错误,因为后(前)增量/减量采用l值。因此,在本例中,-i是r值,但如何以及为什么?一元-运算符生成r值++无法对r值进行操作。很对 现在,为了回答“为什么”,让我引用第§6.5.3.3章C11 一元-运算符的结果是其(提升的)操作数的负数 这里的“结果”是一个计算值,它不由任何变量持有。换句话说,如注释中所述,-i不产生任何对象,因此它不是左值,被视为r值或非左值。预增量运算符++(和其他类似运算符)需要左值,左值是一个表达式,不仅具有类型/值,而且还引用对象。粗略地说,左值可

这显然是一个编译错误,因为后(前)增量/减量采用l值。因此,在本例中,
-i
是r值,但如何以及为什么?

一元
-
运算符生成r值<代码>++无法对r值进行操作。很对

现在,为了回答“为什么”,让我引用第§6.5.3.3章
C11

一元
-
运算符的结果是其(提升的)操作数的负数


这里的“结果”是一个计算值,它不由任何变量持有。换句话说,如注释中所述,
-i
不产生任何对象,因此它不是左值,被视为r值或非左值。

预增量运算符
++
(和其他类似运算符)需要左值,左值是一个表达式,不仅具有类型/值,而且还引用对象。粗略地说,左值可以放在
=
操作符的左侧(但也有一些例外),或者放在
&
(address of)操作符之后(这里也有一些例外)


术语
rvalue
是非左值表达式的俚语(未由语言标准定义)。在
-i
的情况下,
i
是一个对象,但是没有对象
-i
-i
只是对
i
的值求反的结果值。无法将某个内容分配给
-i
,因为它没有引用的对象/存储。

假设
+(-i)
将编译。你到底建议它应该做什么?还有什么可能?可能是-i的重复-那是什么样的地址?@CoryKramer:几乎没有。我认为使用的术语是“表达式的值”(见C11中的脚注64)。啊哈,我明白了-i被修改,它不存储在任何地方,因此成为r值,这进一步影响了++(增额后)代码的一部分。因此编译错误。我是否正确?@ abnavavra:基本上,YAU. RValk不是俚语,它在C++语言标准中使用,然后在C中有点滥用。discussions@BenVoigt嗯,这是俚语,C是有很多的术语,如果用C++来讨论,那么它是不精确的或是错误的。“俚语”似乎是这种用法的一个很好的表征。
#include<stdio.h>
int main()
{
   int i = 10;
   printf("%d", ++(-i));
   return 0;
}