一元加运算符有什么作用?

vri*_*h88 75 c c# c++ unary-operator

一元加运算符有什么作用?我找到了几个定义(这里这里),但我仍然不知道它将用于什么.它似乎没有做任何事情,但有理由,对吗?

Cha*_*via 106

实际上,一元加号确实做了一些事情 - 即使在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);
}
Run Code Online (Sandbox Code Playgroud)

这将显示"x是一个int".

因此,在这个示例中,一元加上创建了一个具有不同类型签名的新值.

  • 如果你编写的代码在给定short和int比较相等的情况下产生给定的结果,那么你可能有不同的问题 (4认同)
  • 谢谢,这很清楚(旁注:在 C 中,我无法使示例工作,因为我无法重载 foo 函数) (2认同)

Jef*_*tin 55

如果你觉得有必要的话就会超载; 对于所有预定义类型,它基本上是一个无操作.

无操作一元算术运算符的实际用途非常有限,并且倾向于与在算术表达式中使用值的结果相关,而不是与运算符本身相关.例如,它可用于强制从较小的整数类型扩展到int,或确保表达式的结果被视为rvalue,因此与非const引用参数不兼容.但是,我提出,这些用途更适合编码高尔夫而不是可读性.:-)

  • 事实并非如此,如下面的几个例子所示. (4认同)
  • 好的,我会买它有一些用途,但下面讨论的大多数用法都涉及这是一个使用no-op运算符构建的数值表达式:例如,提升为`int`并导致rvalue是表达式的效果,而不是+运算符本身的效果. (3认同)

Cla*_*diu 34

来自K&R第二版:

一元+是ANSI标准的新功能.它被添加为与一元对称 - .

  • 绝对。***这是历史原因。** C ++必须对其进行适应,因此它必须处理重载。 (3认同)

bbr*_*own 32

我已经看到它用于清晰,强调正值与负值不同:

shift(+1);
shift(-1);
Run Code Online (Sandbox Code Playgroud)

但这是一个非常弱的用途.答案肯定是超载.

  • 我也是这样做的,特别是在处理像'vec3(+ 1,-1,-1)`这样的向量时 (7认同)

AnT*_*AnT 24

内置一元组的一件事+就是将左值变成右值.例如,您可以这样做

int x;
&x;
Run Code Online (Sandbox Code Playgroud)

但你不能这样做

&+x;
Run Code Online (Sandbox Code Playgroud)

:)

PS"重载"绝对不是正确的答案.Unary +继承自C,并且在C中没有用户级别的运算符重载.


jke*_*ian 14

一元+完成的主要内容是对小于int的数据类型的int类型的提升.如果您尝试使用std::cout数字数据打印字符数据,这可能非常有用.

char x = 5;
std::cout << +x << "\n";
Run Code Online (Sandbox Code Playgroud)

与...非常不同

char x=5;
std::cout << x << "\n";
Run Code Online (Sandbox Code Playgroud)

它也可以用于重载,但实际上你的重载几乎应该是NOP.


Nic*_*rca 11

如果您需要打印原始字节的数值(例如,存储为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
Run Code Online (Sandbox Code Playgroud)

这只是一个简单的例子.我相信还有一些时候,一元+可以帮助处理你的字节更像数字而不是像文本.