在调用std :: numeric_limits <unsigned char>成员之前,一元“ +”的作用是什么?


130

在cppreference的文档中看到了以下示例std::numeric_limits

#include <limits>
#include <iostream>

int main() 
{
    std::cout << "type\tlowest()\tmin()\t\tmax()\n\n";

    std::cout << "uchar\t"
              << +std::numeric_limits<unsigned char>::lowest() << '\t' << '\t'
              << +std::numeric_limits<unsigned char>::min() << '\t' << '\t'
              << +std::numeric_limits<unsigned char>::max() << '\n';
    std::cout << "int\t"
              << std::numeric_limits<int>::lowest() << '\t'
              << std::numeric_limits<int>::min() << '\t'
              << std::numeric_limits<int>::max() << '\n';
    std::cout << "float\t"
              << std::numeric_limits<float>::lowest() << '\t'
              << std::numeric_limits<float>::min() << '\t'
              << std::numeric_limits<float>::max() << '\n';
    std::cout << "double\t"
              << std::numeric_limits<double>::lowest() << '\t'
              << std::numeric_limits<double>::min() << '\t'
              << std::numeric_limits<double>::max() << '\n';
}

我不明白其中的“ +”运算符

<< +std::numeric_limits<unsigned char>::lowest()

我已经对其进行了测试,将其替换为“-”,并且该方法也有效。这样的“ +”运算符有什么用?


3
试试吧。如果不注意,您会得到什么+
皮特·贝克尔

4
如果代码的编写者在乎解释它的意思或使用显式的
强制转换,

如果替换为,-则输出将不是极限值的正确值
phuclv

1
作为记录,如果您想自己使用Google进行此类操作,则称为“一元加”运算符-这是一元的,因为它采用单个值(在这种情况下为紧随其后的事物),然后加上“ ”是Google友好的说法+。在这种情况下,您的查询可能是“ c ++一元加”。它不是很直观,您仍然必须学习阅读将找到的文档,但是IMO是一项非常有用的技能。
基金莫妮卡的诉讼

Answers:


137

输出运算符<<在传递一个char(有符号或无符号)时将其写为一个字符

这些函数将返回type的值unsigned char。并且如上所述,它将打印那些值在当前编码中表示的字符,而不是它们的整数值。

+运营商转换unsigned char这些函数返回一个int通过整型提升。这意味着将改为打印整数值。

类似的表达式+std::numeric_limits<unsigned char>::lowest()本质上等于static_cast<int>(std::numeric_limits<unsigned char>::lowest())


37

+有把它unsigned char变成一个int。该+运营商是保值的,但它有它的操作诱导积分促销的效果。这是为了确保您看到的是数字值,而不是operator <<给定字符类型时会打印的某些(半)随机字符。


18

只是为已经给出的答案添加参考。根据CPP标准工作草案N4713

8.5.2.1一元运算符
...

  1. 一元+运算符的操作数应具有算术,无作用域枚举或指针类型,并且结果是自变量的值。整数提升是对整数或枚举操作数执行的。结果的类型是提升操作数的类型。

而且charshortintlong都是整数类型。


12

没有+结果会有所不同。以下代码段输出a 97代替a a

char ch = 'a';
std::cout << ch << ' ' << +ch << '\n';

原因是因为不同的重载将打印不同类型的数据。没有basic_ostream& operator<<( char value );重载std::basic_ostream,在页面末尾有解释

字符和字符串参数(例如类型charconst char*)由的非成员重载处理operator<<。尝试使用成员函数调用语法(例如std::cout.operator<<('c');)输出字符将调用重载(2-4)之一并输出数值。尝试使用成员函数调用语法输出字符串将调用重载(7)并打印指针值。

传递变量时将调用的非成员重载char

template< class CharT, class Traits> basic_ostream<CharT,Traits>& operator<<(
    basic_ostream<CharT,Traits>& os, char ch );

在代码点输出字符 ch

所以基本上,如果你通过charsigned charunsigned char直接到流,它会打印的性格。如果您尝试删除+上述各行中的,则会看到它会打印一些“奇怪”或不可见的字符,这不是您期望的

如果你希望自己的数值,而不是必须调用过载shortintlonglong long。最简单的方法是charint一元加从升级为+。这是一元plus运算符罕见的有用应用程序之一。明确的强制转换也将起作用int

有很多人面对这样的问题


1
您的意思是一元加号,不是减号吗?
罗斯兰
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.