在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计算到(比方说)指针,这将生成编译时错误.
这是我能想到的唯一实际用途.
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)
lcc*_*sco 32
根据6.3.3.3中的C90标准:
一元+运算符的结果是其操作数的 值.对操作数执行整数提升.结果是推广类型.
和
一元+或 - 运算符的操作数应具有 算术类型 ..
dus*_*uff 18
差不多.它主要用于完整性,并使这样的结构看起来更清洁:
int arr[] = {
+4,
-1,
+1,
-4,
};
Run Code Online (Sandbox Code Playgroud)
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)
A.s*_*lar 12
我找到了一元运算+符所做的两件事
integer promotionturning 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)
Sha*_*our 12
C中一元'+'运算符的目的是什么?
从国际标准程序设计语言的基本原理 - C中,将一元加号添加到C中,以确定对称性与一元减号:
C89委员会从几个实施中采用了一元加,用于对称与一元减.
并且它不是无操作,它在其操作数上执行整数提升.引用我对Unary +运算符的回答进行类型转换?:
C99标准部分草案6.5.3.3 一元算术运算符说:
一元+运算符的结果是其(提升的)操作数的值.整数提升在操作数上执行,结果具有提升类型.
值得指出的是,Annotated C++ Reference Manual(ARM)对unary plus提供了以下注释:
一元加上是一次历史性事故,一般都没用.
| 归档时间: |
|
| 查看次数: |
19601 次 |
| 最近记录: |