在C语言中,以下语句是合法的:
int foo = +4;
然而,就我所知,+4
中的一元加号 (+
) 是一个无操作(no-op)。是这样吗?
在C语言中,以下语句是合法的:
int foo = +4;
然而,就我所知,+4
中的一元加号 (+
) 是一个无操作(no-op)。是这样吗?
你可以将其用作表达式拥有算术类型的一种断言:
#define CHECK_ARITHMETIC(x) (+(x))
如果x
的值为指针(例如),则这将生成编译时错误。
这是我能想到的唯一实际用途。
(-(-(x)))
做同样的事情? - Aaron YodaikenINT_MIN
的算术表达式来说除外。(理论上是如此,在实践中它可能在任何现实机器上都能正常工作。)尽管如此,标准的严格解读是这些情况是不同的。 - Nemox
为 INT_MIN
时评估 -x
就属于调用未定义行为,我相信。 - Nemo根据C90标准6.3.3.3的规定:
一元操作符+的结果是其操作数的值。对操作数执行整数提升,并且结果具有提升后的类型。
以及
一元操作符+或-的操作数必须具有算术类型。
x
的大小小于 int
的大小,否则 +x
是无操作的? - zneaksizeof(short) == sizeof(int)
是可能的,但是 short
有填充位,在这样的系统上,填充位可能需要被清零或者符号扩展。理论上而已。 - Dietrich Eppfloat
或double
没有任何影响,对吗? - S.S. Anne我知道一种非常有用的一元加运算符用法:在宏中使用。假设你想要执行以下操作:
#if FOO > 0
如果FOO
未定义,C语言要求在这种情况下将其替换为0。但是,如果FOO
被定义为空定义,则上述指令将导致错误。您可以使用以下方式代替:#if defined(FOO) && FOO == 1
#if FOO+0 > 0
现在,该指令在 FOO
未定义、定义为空或定义为整数值的情况下语法上都是正确的。
当然,这是否会产生所需的语义是一个完全不同的问题,在某些有用的情况下可能会产生所需的结果。
编辑:请注意,您甚至可以使用此方法来区分 FOO
定义为零与定义为空的情况,例如:
#if 2*FOO+1 == 1
/* FOO is 0 */
#else
/* FOO is blank */
#endif
FOO
为空白,那么表达式将不是有效的C语言。 - zneakFOO
的定义方式。 - R.. GitHub STOP HELPING ICE我发现一元运算符+
的两个作用是:
整数提升
将左值转换为右值
整数提升示例:
#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
sizeof(int)
。我不知道什么时候会用到它。但还是很好的。注意:编辑答案以显示并非所有内容都转换为 4。 - Persixtyint arr[] = {
+4,
-1,
+1,
-4,
};
+
更干净的替代方法。 - ruohola一元运算符+
只做了一件事:应用了整型提升。由于如果操作数在表达式中使用时本来就会发生这种提升,因此人们认为C语言中的一元+
仅仅是为了和一元-
保持对称。
由于整型提升通常被广泛应用,很难看到它的作用。
我想出了这个例子:
printf("%zd\n", sizeof( (char) 'x'));
printf("%zd\n", sizeof(+(char) 'x'));
在我的Mac上,这个命令会打印出
1
4
std::cout
在C++中打印char
很有用。 - S.S. Anne值得指出的是带注释的C++参考手册(ARM)对一元加号提供了以下评论:
一元加号是一个历史意外,通常没有用。
+(char)4
和 (char)4
不是相同的。 - DigitalRoss
+short(1)
的类型为int
而不是short
。 - MSalters+short(1)
是语法错误。你是不是想要+(short)1
? - Keith Thompson