C中一元运算符的目的是什么?
在C中,写下如下内容是合法的:
int foo = +4; 
 但是,据我所知, + +4的一元+是一个无操作。 是吗? 
根据6.3.3.3中的C90标准:
一元+运算符的结果是其操作数的值 。 整数提升在操作数上执行。 结果有促进型。
和
一元+或 – 运算符的操作数应具有算术types 。
你可以使用它作为一种expression式具有算术types的断言:
 #define CHECK_ARITHMETIC(x) (+(x)) 
 这会产生一个编译时错误,如果x评估(说)一个指针。 
这是我能想到的唯一的实际用途。
有一个非常方便的使用我知道的一元加运算符:在macros中。 假设你想做类似的事情
 #if FOO > 0 
 如果FOO未定义,则C语言要求在此情况下将其replace为0。 但是如果FOO被定义为一个空的定义,上面的指令会导致一个错误。 相反,您可以使用: 
 #if FOO+0 > 0 
 现在,指令在语法上是否正确无论FOO是未定义的,定义为空白还是定义为整数值。 
当然,这是否会产生所需的语义是一个完全独立的问题,但在一些有用的情况下,它会。
  编辑:请注意,你甚至可以用这个来区分被定义为零的FOO和定义为空白的情况,如下所示: 
 #if 2*FOO+1 == 1 /* FOO is 0 */ #else /* FOO is blank */ #endif 
很多。 这主要是为了完整性,并使这样的结构看起来更清洁:
 int arr[] = { +4, -1, +1, -4, }; 
不完全是一个没有操作
 一元+运算符只做一件事: 它应用整数提升 。 因为如果在expression式中使用操作数,那么就会发生这种情况,所以我们假设一元+只是用C来对称。 
很难看到这个行动,因为促销活动如此普遍适用。
我想出了这个:
 printf("%zd\n", sizeof( (char) 'x')); printf("%zd\n", sizeof(+(char) 'x')); 
(在我的Mac上)打印
 1 4 
 我发现了一元+运算符所做的两件事情 
-  
integer promotion -  
turning lvalue into rvalue 
整数提升示例:
 #include <stdio.h> int main(void) { char ch; short sh; int i; long l; printf("%d %d %d %d\n",sizeof(ch),sizeof(sh),sizeof(i),sizeof(l)); printf("%d %d %d %d\n",sizeof(+ch),sizeof(+sh),sizeof(+i),sizeof(+l)); return 0; } 
典型输出(在64位平台上):
 1 2 4 8 4 4 4 8 
把左值变成右值例子:
 int i=0,j; j=(+i)++; // error lvalue required 
C中一元运算符的目的是什么?
一元加号被添加到C对称性与一元减号,从国际标准编程语言的基本原理-C :
C89委员会从一些实现中采用了一元加法,以一元减去对称。
它不是一个无操作,它在其操作数上执行整数提升。 从我的答案引用是一元+运算符做types转换? :
 草案C99标准部分6.5.3.3 一元算术运算符说: 
一元+运算符的结果是其(提升的)操作数的值。 整数提升在操作数上执行 ,结果具有提升的types。
值得指出的是,带注释的C ++参考手册( ARM )提供了关于一元加号的以下注释:
一元加是一个历史的事故,通常是无用的。
 通过“无操作”,你的意思是汇编指令? 
 如果是的话,绝对不是。 
+4只是4 – 编译器不会添加任何进一步的指令。