85

在 C 中,这样写是合法的:

int foo = +4;

但是,据我所知,一元加号 ( +) in+4是无操作的。是吗?

4

8 回答 8

79

您可以将其用作表达式具有算术类型的一种断言:

#define CHECK_ARITHMETIC(x) (+(x))

如果x评估为(比如说)一个指针,这将产生一个编译时错误。

这是我能想到的唯一实际用途。

于 2011-07-09T19:36:12.757 回答
36

我所知道的一元加号运算符有一个非常方便的用法:在宏中。假设你想做类似的事情

#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
于 2011-07-09T20:58:48.507 回答
36

根据 6.3.3.3 中的 C90 标准:

一元 + 运算符的结果是 其操作数的值。对操作数执行积分提升。并且结果具有提升的类型。

一元 + 或 - 运算符的操作数应具有 算术类型..

于 2011-07-09T19:38:57.437 回答
17

差不多。它主要是为了完整性,并使这样的结构看起来更干净:

int arr[] = {
    +4,
    -1,
    +1,
    -4,
};
于 2011-07-09T19:33:33.443 回答
17

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
于 2014-07-17T21:13:32.000 回答
14

不完全是无操作

一元运算+符只做一件事:它应用整数提升。由于如果在表达式中使用操作数,无论如何都会发生这些情况,因此可以想象 unary+在 C 中只是为了与 unary 对称-

很难在实际中看到这一点,因为促销活动非常普遍。

我想出了这个:

printf("%zd\n", sizeof( (char) 'x'));
printf("%zd\n", sizeof(+(char) 'x'));

哪个(在我的 Mac 上)打印

1
4
于 2011-07-11T17:23:12.133 回答
13

C中一元'+'运算符的目的是什么?

为了与一元减号对称,将一元加号添加到 C 中,来自国际标准的基本原理-编程语言-C

一元加号被 C89 委员会从几个实现中采用,以与一元减号对称。

它不是空操作,它对其操作数执行整数提升。引用我对Unary + 运算符是否进行类型转换的回答?

C99 标准草案6.5.3.3 一元算术运算符说:

一元 + 运算符的结果是其(提升的)操作数的值。整数提升在操作数上执行,结果具有提升的类型。

值得指出的是,带注释的 C++ 参考手册 ( ARM )提供了以下关于一元加的评论:

一元加号是历史性的意外,通常无用。

于 2015-06-11T20:42:59.153 回答
1

“无操作”是指汇编指令吗?
如果是这样,那绝对不是。

+4 只是 4 - 编译器不会添加任何进一步的指令。

于 2011-07-10T12:43:25.897 回答