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
用于其值。相反,Inx=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