一元加运算符的作用是什么?我已经找到了几个定义(在这里和这里),但是我仍然不知道它将用于什么目的。似乎它什么也没做,但是有一定理由,对吧?
Answers:
实际上,一元加号确实可以执行某些操作-即使在C语言中也是如此。它对操作数执行常规的算术转换,并返回一个新值,该值可以是更大宽度的整数。如果原始值是一个宽度小于的无符号整数int
,则它也将更改为一个signed
值。
通常,这并不重要,但是会产生影响,因此,使用一元加号作为表示整数为正数的“注释”并不是一个好主意。考虑以下C ++程序:
void foo(unsigned short x)
{
std::cout << "x is an unsigned short" << std::endl;
}
void foo(int x)
{
std::cout << "x is an int" << std::endl;
}
int main()
{
unsigned short x = 5;
foo(+x);
}
这将显示“ x是一个整数”。
因此,在此示例中,一元加号创建了具有不同类型和符号的新值。
an integer of greater width
?
如果出于调试或任何原因需要打印原始字节的数字值(例如,存储为char的小数字),则一元+可以简化打印代码。考虑
char c = 42;
cout << c << endl; // prints "*\n", not what you want in this case
cout << (int)c << endl; // prints "42\n", ok
cout << +c << endl; // prints "42\n", much easier to type
这只是一个简单的例子。我敢肯定,在其他情况下,一元+可以帮助您将字节更像数字而不是文本。
C语言中存在一元加号,它完全不执行任何操作(非常类似于auto
关键字)。为了没有它,Stroustrup将不得不引入与C的不必要的不兼容。
一旦用C ++编写,就很自然地允许重载函数,就像一元减号一样,并且Stroustrup可能由于这个原因而引入了它(如果还没有的话)。
因此,它没有任何意义。它可以用作装饰,使事物看起来更对称,例如,使用+1.5表示与-1.5相反。在C ++中,它可以被重载,但是如果operator+()
执行任何操作,将会造成混乱。记住标准规则:重载算术运算符时,请像int
s那样做。
如果您正在寻找它存在的原因,请找到有关C早期历史的一些信息。我怀疑没有充分的理由,因为C并不是真正设计出来的。考虑一下无用的auto
关键字(大概与相对static
,现在在C ++ 0x中被回收)和entry
没有做任何事情的关键字(后来在C90中被省略)。里奇(Ritchie)或克尼根(Kernighan)在一封著名的电子邮件中说,当他们意识到操作员优先级出现问题时,已经有三个安装了成千上万行代码的设备,他们不想破坏。
entry
:(stackoverflow.com/q/254395/153285)。如今,如果您想要多个入口点,只需使用尾部调用和配置文件引导的优化即可。
extern volatile int foo;
语句的编译器+foo;
也将需要在可能存在任何手段确定读取发生的任何平台上执行对指定地址的读取。我不确定如果语句只是“ foo”是否需要,尽管许多编译器会出于礼貌使用它。
#include <stdio.h>
int main()
{
unsigned short x = 5;
printf ("%d\n",sizeof(+x));
printf ("%d\n",sizeof(x));
return 0;
}
如上例所示,一元+确实分别更改了类型,大小4和2。很奇怪,表达式+ x的确是按sizeof计算的,我认为这是不应该的。可能是由于sizeof与一元+具有相同的优先级。
编辑完全重写,因为我原来的答案是waaaayyy。
这应该使您可以将类型的显式声明作为正值来处理(我认为在大多数非数学运算中)。似乎否定会更有用,但是我想这是一个可能会有所作为的示例:
public struct Acceleration
{
private readonly decimal rate;
private readonly Vector vector;
public Acceleration(decimal rate, Vector vector)
{
this.vector = vector;
this.rate = rate;
}
public static Acceleration operator +(Acceleration other)
{
if (other.Vector.Z >= 0)
{
return other;
}
return new Acceleration(other.Rate, new Vector(other.vector.X, other.Vector.Y, -other.vector.Z));
}
public static Acceleration operator -(Acceleration other)
{
if (other.Vector.Z <= 0)
{
return other;
}
return new Acceleration(other.Rate, new Vector(other.vector.X, other.Vector.Y, -other.vector.Z));
}
public decimal Rate
{
get { return rate; }
}
public Vector Vector
{
get { return vector; }
}
}
+
不是使值成为正数,而是使其符号保持不变。
只是用来说服哪些数字为正
例如;
int a=10;
System.out.println(+x);// prints 10(that means,that number 10 multiply by +1,{10*+1})
//if we use unary minus
int a=10;
System.out.println(-x);//prints -10(that means,that number 10 multiply by +1,{10*-1})