在C语言中,编写类似以下内容是合法的:
int foo = +4;
但是,据我所知,一元加号(+
)+4
是禁止操作的。是吗?
在C语言中,编写类似以下内容是合法的:
int foo = +4;
但是,据我所知,一元加号(+
)+4
是禁止操作的。是吗?
+short(1)
有类型int
,没有short
。
+
强制分组的是括号而不是。
Answers:
根据6.3.3.3中的C90标准:
一元+运算符的结果是其操作数的 值。整数提升是在操作数上执行的。结果为提升类型。
和
一元+或-运算符的操作数应具有 算术类型..
+x
除非这样,否则没有人sizeof x < sizeof(int)
吗?
sizeof(short) == sizeof(int)
但从short
理论上讲,在这样的系统上,填充可能需要清零或扩展符号。从理论上讲。
float
或double
所有,不是吗?
您可以将其用作一种表达式具有算术类型的断言:
#define CHECK_ARITHMETIC(x) (+(x))
如果x
计算(例如)一个指针,将产生一个编译时错误。
那是我能想到的唯一实际用途。
(-(-(x)))
?
int
为32位并且x
恰好int
等于-2^31
,-x
则将溢出一个有符号整数,这在技术上是未定义行为。:-)
INT_MIN
。(嗯,从理论上讲,无论如何。实际上,它在任何现实的机器上都可以正常工作。)不过,严格阅读该标准后,他们会有所不同。
-x
何时x
是INT_MIN
调用未定义的行为。
我知道一元加运算符非常方便使用:在宏中。假设您想做类似的事情
#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
FOO
,表达式将是无效C.
- -
(必不可少的空间!)等同于+
,使它们变得+
相当多余...不,这是错误的,当操作数为INT_MIN
... :-)
FOO
定义方式。
C语言中一元“ +”运算符的目的是什么?
从国际标准原理(编程语言,C)中,一元加号被添加到C中以实现一元减号的对称性:
C89委员会从几种实现中采用了一元加号,以与一元减号对称。
它不是空操作,而是对其操作数执行整数提升。引用我对一元+运算符是否进行类型转换的回答 :
C99标准草稿6.5.3.3
一元算术运算符说:
一元+运算符的结果是其(提升的)操作数的值。对操作数执行整数提升,并且结果具有提升的类型。
值得指出的是,《带注释的C ++参考手册》(ARM)对一元加号提供了以下注释:
一元加号是历史性事故,通常无用。
static_cast
会更清楚地显示意图时,它也被“滥用” ,例如,使用+
我发现一元运算+
符要做的两件事是
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
sizeof(int)
。我不知道何时使用它。但是很好。注:编辑答案表明,并非一切去4
“无操作”是指汇编指令吗?
如果是这样,那绝对不是。
+4只是4-编译器不会添加任何其他指令。
+(char)4
不一样(char)4
。