一元加运算符有什么作用?我找到了几个定义(这里和这里),但我仍然不知道它将用于什么.它似乎没有做任何事情,但有理由,对吗?
实际上,一元加号确实做了一些事情 - 即使在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是一个int".
因此,在这个示例中,一元加上创建了一个具有不同类型和签名的新值.
如果你觉得有必要的话就会超载; 对于所有预定义类型,它基本上是一个无操作.
无操作一元算术运算符的实际用途非常有限,并且倾向于与在算术表达式中使用值的结果相关,而不是与运算符本身相关.例如,它可用于强制从较小的整数类型扩展到int
,或确保表达式的结果被视为rvalue,因此与非const
引用参数不兼容.但是,我提出,这些用途更适合编码高尔夫而不是可读性.:-)
来自K&R第二版:
一元+是ANSI标准的新功能.它被添加为与一元对称 - .
我已经看到它用于清晰,强调正值与负值不同:
shift(+1); shift(-1);
但这是一个非常弱的用途.答案肯定是超载.
内置一元组的一件事+
就是将左值变成右值.例如,您可以这样做
int x; &x;
但你不能这样做
&+x;
:)
PS"重载"绝对不是正确的答案.Unary +
继承自C,并且在C中没有用户级别的运算符重载.
一元+完成的主要内容是对小于int的数据类型的int类型的提升.如果您尝试使用std::cout
数字数据打印字符数据,这可能非常有用.
char x = 5; std::cout << +x << "\n";
与...非常不同
char x=5; std::cout << x << "\n";
它也可以用于重载,但实际上你的重载几乎应该是NOP.
如果您需要打印原始字节的数值(例如,存储为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
这只是一个简单的例子.我相信还有一些时候,一元+可以帮助处理你的字节更像数字而不是像文本.