在调用 std: : numeric_limit < unsignedchar > member 之前使用一元“ +”的目的是什么?

我看到了 这个示例位于 std::numeric_limits的 cpferences 文档中

#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()

我已经测试过了,用“-”代替它,这也奏效了。 这样的“ +”运算符有什么用?

4525 次浏览

+是用来把 unsigned char变成 int的。+算子是保值算子,但它对其操作数具有诱导积分提升的作用。这是为了确保您看到的是一个数值,而不是 operator <<在给定字符类型时打印的某个(半)随机字符。

输出操作符 <<在传递 char(有符号或无符号)时将其写为 性格

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

+操作符通过 整数推广将这些函数返回的 unsigned char转换为 int。这意味着将打印整数值。

+std::numeric_limits<unsigned char>::lowest()这样的表达式基本上等于 static_cast<int>(std::numeric_limits<unsigned char>::lowest())

只是为了补充一下已经给出的答案。 CPP 标准工作草案 N4713:

8.5.2.1一元运算符
...

  1. 一元 + 运算符的操作数应该具有算术、无作用域枚举或指针类型,其结果是参数的值。结果的类型是提升操作数的类型。

charshortintlong是不可分割的类型。

如果没有 +,结果将会不同

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

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

字符和字符串参数(例如,类型为 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 char或者 unsigned char传递给流,它就会把字符打印出来。如果您尝试删除上面几行中的 +,您会看到它打印出一些“奇怪”或不可见的字符,这不是人们所期望的

如果需要它们的数值,则必须调用 shortintlonglong long的重载。最简单的方法做到这一点是促进从 charint与一元加 +。这是 一元加运算符一元加运算符罕见的有用应用之一。对 int的显式强制转换也将起作用

有很多人都遇到过这样的问题