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

zne*_*eak 74 c

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

int foo = +4;
Run Code Online (Sandbox Code Playgroud)

然而,据我所知道的,一元++4是一个空操作.是吗?

Nem*_*emo 75

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

#define CHECK_ARITHMETIC(x) (+(x))
Run Code Online (Sandbox Code Playgroud)

如果x计算到(比方说)指针,这将生成编译时错误.

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

  • @luxun @zneak:有趣的想法......让我看看......好吧,这个怎么样.如果`int`是32位且`x`碰巧是`int`等于`-2 ^ 31`,那么`-x`将溢出一个有符号整数,这在技术上是未定义的行为.:-) (8认同)
  • 您也可以通过这种方式将枚举值强制转换为整数值. (7认同)
  • @zneak:如果表达式具有指针类型,则触发编译时错误,但如果它具有算术类型则为无操作.你的版本没问题,除了恰好评估为'INT_MIN`的算术表达式.(好吧,从理论上讲,无论如何.在实践中,它可能在任何真实的机器上都能正常工作.)但是,严格阅读标准说这些是不同的. (4认同)
  • 为什么你不能做同样的事情,例如,`( - ( - (x)))`? (2认同)

R..*_*R.. 34

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

#if FOO > 0
Run Code Online (Sandbox Code Playgroud)

如果FOO未定义,则C语言要求在这种情况下将其替换为0.但如果FOO使用空定义定义,则上述指令将导致错误.相反,你可以使用:

#if FOO+0 > 0
Run Code Online (Sandbox Code Playgroud)

现在,无论FOO是未定义,定义为空白还是定义为整数值,该指令在语法上都是正确的.

当然,这是否会产生所需的语义是一个完全独立的问题,但在一些有用的情况下它会.

编辑:请注意,你甚至可以用它来区分的情况下,FOO被定义为与零定义为空白,如:

#if 2*FOO+1 == 1
/* FOO is 0 */
#else
/* FOO is blank */
#endif
Run Code Online (Sandbox Code Playgroud)

  • 但是,我相信`-0`同样适用. (3认同)
  • 确实如此.在任何情况下,操作符对 - - -`(空间必不可少!)相当于`+`,据我所知,使`+`相当冗余......不,这是错误的,当操作数不相等时是'INT_MIN` ...... :-) (2认同)
  • 很抱歉碰到这么旧的答案,但这不是二进制加号而不是一元加号的示例吗? (2认同)
  • @AuroraVollvik:如果宏恰好被定义但定义为空,则是一元加号。 (2认同)
  • @UndefinedBehavior:是一元还是二进制取决于“ FOO”的定义方式。 (2认同)

lcc*_*sco 32

根据6.3.3.3中的C90标准:

一元+运算符的结果是其操作数.对操作数执行整数提升.结果是推广类型.

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

  • 标准中的这些引用表明,一元+不仅仅是一个无操作.它确实对操作数执行整体提升.并且,可能更重要的是,它确实将左值变为右值. (29认同)
  • 那么除非 `sizeof x < sizeof(int)`,否则 `+x` 就是一个 noop? (2认同)

dus*_*uff 18

差不多.它主要用于完整性,并使这样的结构看起来更清洁:

int arr[] = {
    +4,
    -1,
    +1,
    -4,
};
Run Code Online (Sandbox Code Playgroud)

  • 没有办法比没有一元`+`的替代方案更干净。 (2认同)

Dig*_*oss 13

不完全是无操作

一元运算+符只做一件事:它应用整数提升.因为如果在表达式中使用操作数,那么无论如何都会发生这种情况,人们会想到一元+在C中只是为了与一元对称-.

很难看到这一点在行动,因为促销活动如此普遍适用.

我想出了这个:

printf("%zd\n", sizeof( (char) 'x'));
printf("%zd\n", sizeof(+(char) 'x'));
Run Code Online (Sandbox Code Playgroud)

哪个(在我的Mac上)打印

1
4
Run Code Online (Sandbox Code Playgroud)

  • 这对于使用“std::cout”在 C++ 中打印“char”非常有用。 (2认同)

A.s*_*lar 12

我找到了一元运算+符所做的两件事

  • 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;
}
Run Code Online (Sandbox Code Playgroud)

典型输出(在64位平台上):

1 2 4 8
4 4 4 8
Run Code Online (Sandbox Code Playgroud)

将左值转换为右值示例:

int i=0,j;

j=(+i)++; // error lvalue required
Run Code Online (Sandbox Code Playgroud)

  • sizeof必须使用[`%zu`](/sf/ask/65806121/)打印 (2认同)

Sha*_*our 12

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

国际标准程序设计语言的基本原理 - C中,将一元加号添加到C中,以确定对称性与一元减号:

C89委员会从几个实施中采用了一元加,用于对称与一元减.

并且它不是无操作,它在其操作数上执行整数提升.引用我对Unary +运算符的回答进行类型转换?:

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

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

值得指出的是,Annotated C++ Reference Manual(ARM)对unary plus提供了以下注释:

一元加上是一次历史性事故,一般都没用.

  • imho这应该是公认的答案:对于一元加运算符(整数提升)有效果,但我不认为这可以被认为是语言中运算符的**目的**.这个答案确实提供了一个很好的参考,这个操作员没有任何目的,它通常是无用的. (3认同)