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

时间:2011-07-09 19:30:56

标签: c

在C中,写下类似的内容是合法的:

int foo = +4;

但是,据我所知,+中的一元+4是无操作的。是吗?

8 个答案:

答案 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 - 编译器不会再添加任何指令。