在 C 中,这样写是合法的:
int foo = +4;
但是,据我所知,一元加号 ( +
) in+4
是无操作的。是吗?
在 C 中,这样写是合法的:
int foo = +4;
但是,据我所知,一元加号 ( +
) in+4
是无操作的。是吗?
您可以将其用作表达式具有算术类型的一种断言:
#define CHECK_ARITHMETIC(x) (+(x))
如果x
评估为(比如说)一个指针,这将产生一个编译时错误。
这是我能想到的唯一实际用途。
我所知道的一元加号运算符有一个非常方便的用法:在宏中。假设你想做类似的事情
#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
根据 6.3.3.3 中的 C90 标准:
一元 + 运算符的结果是 其操作数的值。对操作数执行积分提升。并且结果具有提升的类型。
和
一元 + 或 - 运算符的操作数应具有 算术类型..
差不多。它主要是为了完整性,并使这样的结构看起来更干净:
int arr[] = {
+4,
-1,
+1,
-4,
};
I found two things that unary +
operator do is
integer promotion
turning lvalue into rvalue
integer promotion example:
#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;
}
Typical output (on 64-bit platform):
1 2 4 8
4 4 4 8
turning lvalue into rvalue example:
int i=0,j;
j=(+i)++; // error lvalue required
一元运算+
符只做一件事:它应用整数提升。由于如果在表达式中使用操作数,无论如何都会发生这些情况,因此可以想象 unary+
在 C 中只是为了与 unary 对称-
。
很难在实际中看到这一点,因为促销活动非常普遍。
我想出了这个:
printf("%zd\n", sizeof( (char) 'x'));
printf("%zd\n", sizeof(+(char) 'x'));
哪个(在我的 Mac 上)打印
1
4
C中一元'+'运算符的目的是什么?
为了与一元减号对称,将一元加号添加到 C 中,来自国际标准的基本原理-编程语言-C:
一元加号被 C89 委员会从几个实现中采用,以与一元减号对称。
它不是空操作,它对其操作数执行整数提升。引用我对Unary + 运算符是否进行类型转换的回答?:
C99 标准草案6.5.3.3
一元算术运算符说:
一元 + 运算符的结果是其(提升的)操作数的值。整数提升在操作数上执行,结果具有提升的类型。
值得指出的是,带注释的 C++ 参考手册 ( ARM )提供了以下关于一元加的评论:
一元加号是历史性的意外,通常无用。
“无操作”是指汇编指令吗?
如果是这样,那绝对不是。
+4 只是 4 - 编译器不会添加任何进一步的指令。