C 需要作为增量操作数的左值-+;一元运算符

C 需要作为增量操作数的左值-+;一元运算符,c,operators,C,Operators,有人能解释一下吗: #include <stdio.h> #include <stdlib.h> int main (void) { int i = 0,j; j=(+i)++; return 0; } 有人能解释一下吗?摘自 一元+运算符的结果是其 (提升的)操作数。整数升级是在 操作数,并且结果具有提升的类型 因此,基本上,除了操作数的int类型提升之外,效果几乎总是一个no op。例如 char a = 6; size_t size_pr

有人能解释一下吗:

#include <stdio.h>
#include <stdlib.h>

int main (void) {

   int i = 0,j;
   j=(+i)++;

   return 0;
}
有人能解释一下吗?

摘自

一元
+
运算符的结果是其 (提升的)操作数。整数升级是在 操作数,并且结果具有提升的类型

因此,基本上,除了操作数的
int
类型提升之外,效果几乎总是一个no op。例如

char a = 6;

size_t size_pre_promotion = sizeof(a);
size_t size_post_promotion = sizeof(+a);
其中,由于
type
char
提升到
int
,操作数
a
的大小从
1
增加到
4
。操作数的值将原封不动地返回

来自评论:“将左值转换为右值”,这是我不理解的

(+1)

在此表达式
(+i)+
)中,括号
()
强制优先顺序执行
i
(从表达式
+i
)从
左值到
右值的转换,在词汇上后跟
++
运算符,试图增加
i
的值。(
在词汇上
,因为此表达式永远不会在编译时之后进入运行时。)此时,
i
不再是左值,因此它不再可赋值,因此无法接受通常在操作数仍然是左值时发生的递增操作

值得注意的是,通过举例说明,以下表述完全合法:

int j = (+i);//Not attempting to assign value (increment) the operand
             //so the _value_ returned from the operand is successfully assigned
             //to the lvalue `j`;


int j = +i++;//Assigns the i + 1 to j
        //in this case the `++` adds `1` to the operand, then the `+` unary operator returns the incremented value (essentially a no-op at this point),  which in turn is assigned to the _lvalue_ `j`.  
一元运算符
+
左值
转换为
右值

这些条款基本上可以分别视为可转让和不可转让

如以下表达式所示:

int j;
&j; //address of an lvalue
这是合法的。但是:

&(+j);//cannot _take_ the address of an rvalue
事实并非如此

+一元运算符是如何工作的

我相信一元
-
更容易理解,因为它实际上“做”了一些“可见”的事情。我的意思是,让
int k=5
然后
-k
很简单-它把正值
5
变成负值
-5
。一元
-
“计算”其操作数的负数

内置一元数
+
仅返回其操作数的值。结束。它什么也不做。但是,应用一元运算符将执行标准中指定的参数。发件人:

内置的一元加号运算符返回其操作数的值。这个 唯一不是无运算的情况是操作数具有 整数类型或非范围枚举类型,由更改 整数提升,例如,它将字符转换为int或如果操作数为 受制于左值到右值、数组到指针或函数到指针 转换

因此,
short
值被提升为
int
。左值更改为右值。数组类型衰减为指针。函数类型衰减为函数指针

左值(“left value”)是您可以指定的值。在您的代码中,
i
是一个变量,您可以
i=1
将值
1
赋给
i
2+2
是一个带有值
4
的右值(“右值”)-您不能将任何内容“分配”给
2+2
,它已经有一个值了。
+i
是应用于
i
-
i
的一元
+
经过整数提升和左值到右值转换的结果,一元
+
操作的结果在这些转换后具有与
i
相同的值和类型。

左值是一个可能指定对象(内存中的字节)。最常见的左值形式只是一个名称:给定的
int x
float y
char z[10]
,然后
x
y
z
都是左值。左值的另一种形式是一元
*
:给定
双*p
,则
*p
为左值。1

当我们使用左值来计算表达式时,它们被转换为对象的值:
x+3
产生的值比
x
中的任何值多三个。在此表达式中,
x
用于其值。相反,In
x=7
x
直接用作其左值;7被写入内存中的字节,而不管它们以前包含什么值

由于C标准必须在技术细节中指定编译器的行为方式,因此它规定,当在我们需要其值的地方的表达式中使用左值时,该左值将转换为值。为了强调这个结果只是一个数字或类似的东西,不再是对内存的引用,它可以称为右值

一元
+
是运算符。当应用于算术值时,它会生成相同的值。但是,它只产生一个值,而不是左值。因此,将
+
应用于左值会生成右值

脚注
1这就是左值可能指定对象的原因:
*p
是一个左值,在编译过程中被视为左值,但是,当程序执行时,
p
可能被设置为空指针,因此
*p
实际上不是一个对象。这将是程序中的一个错误,但它是一个运行时错误。

运算符希望其操作数是左值-基本上,是一个可以指定对象的表达式(在C意义上,是一个可以用来存储值的内存块)

但是,一元
+
运算符的结果不是左值。在这种情况下,
+i
的结果就是值
0
,因此表达式相当于写入
0++
。不能将
++
运算符应用于
0
相同的对象
int j;
&j; //address of an lvalue
&(+j);//cannot _take_ the address of an rvalue
j = +(i++); // or just +i++, precedence is the same