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 – 编译器不会添加任何进一步的指令。