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