在C中,写下类似的内容是合法的:
int foo = +4;
但是,据我所知,+
中的一元+4
是无操作的。是吗?
答案 0 :(得分:75)
您可以将它用作表达式具有算术类型的断言:
#define CHECK_ARITHMETIC(x) (+(x))
如果x
计算到(比方说)指针,这将生成编译时错误。
这是我能想到的唯一实际用途。
答案 1 :(得分:33)
我非常方便地使用我所知道的一元加运算符:在宏中。假设您想要执行类似
的操作#if FOO > 0
如果FOO
未定义,则C语言要求在这种情况下将其替换为0。但是如果使用空定义定义FOO
,则上述指令将导致错误。相反,您可以使用:
#if FOO+0 > 0
现在,无论FOO
是未定义,定义为空白还是定义为整数值,该指令在语法上都是正确的。
当然这是否会产生所需的语义是一个完全独立的问题,但在一些有用的情况下它会。
修改请注意,您甚至可以使用此区分 FOO
被定义为零而非定义为空白的情况,如:
#if 2*FOO+1 == 1
/* FOO is 0 */
#else
/* FOO is blank */
#endif
答案 2 :(得分:32)
根据6.3.3.3中的C90标准:
一元+运算符的结果是其操作数的值。整体推广是 在操作数上执行。结果是推广类型。
和
一元+或 - 运算符的操作数应具有算术类型 ..
答案 3 :(得分:19)
差不多。它主要用于完整性,并使这样的结构看起来更清洁:
int arr[] = {
+4,
-1,
+1,
-4,
};
答案 4 :(得分:12)
一元+
运算符只做一件事:它应用整数提升。因为如果在表达式中使用操作数,那么无论如何都会发生这种情况,人们会想到一元+
在C中只是为了与一元-
对称。
很难看到这一点在行动,因为促销活动如此普遍适用。
我想出了这个:
printf("%zd\n", sizeof( (char) 'x'));
printf("%zd\n", sizeof(+(char) 'x'));
(在我的Mac上)打印
1
4
答案 5 :(得分:12)
一元' +'的目的是什么? C中的运算符?
从 Rationale for International Standard—Programming Languages—C开始,将一元加号添加到C中以获得一元减号的对称性:
一元加上被C89委员会从几个实施中采用,用于对称与一元减去。
并且它不是无操作,它在其操作数上执行整数提升。引用我对Does Unary + operator do type conversions?的回答:
草案C99标准部分6.5.3.3
一元算术运算符说:
一元+运算符的结果是它的值(提升) 操作数。 整数提升是在操作数上执行的 结果具有提升类型。
值得指出Annotated C++ Reference Manual(ARM)提供了关于一元加号的以下评论:
一元加上是一次历史性事故,通常没用。
答案 6 :(得分:11)
我发现一元+
操作员做的两件事是
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
答案 7 :(得分:2)
通过'no-op',你的意思是汇编指令吗? 如果是这样,那绝对不是。
+4只是4 - 编译器不会再添加任何指令。