我看到了this example in cppreference's documentation for 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()
我已经对其进行了测试,将其替换为“-”,并且也可行。 这样的“ +”运算符有什么用?
答案 0 :(得分:135)
输出运算符<<
在传递给char
(有符号或无符号)时将写为字符。
这些函数将返回unsigned char
类型的值。如上所述,它将打印这些值在当前编码中表示的字符,而不是其整数值。
+
运算符将这些函数返回的unsigned char
转换为integer promotion到int
。这意味着将打印整数值。
类似+std::numeric_limits<unsigned char>::lowest()
的表达式基本上等于static_cast<int>(std::numeric_limits<unsigned char>::lowest())
。
答案 1 :(得分:37)
+
可以将unsigned char
变成int
。 +
运算符是保值的,但具有在其操作数上引发整数提升的作用。这是为了确保您看到的是数字值,而不是给定字符类型时operator <<
将打印的某些(半)随机字符。
答案 2 :(得分:18)
只需添加对已经给出答案的参考即可。来自CPP标准工作草案N4713:
8.5.2.1一元运算符
...
- 一元+运算符的操作数应具有算术,无作用域枚举或指针类型,并且结果是自变量的值。 对整数或枚举操作数执行整数提升。结果的类型是提升的操作数的类型。
char
,short
,int
和long
是整数类型。
答案 3 :(得分:12)
如果没有+
,结果将有所不同。以下代码段输出a 97
而不是a a
char ch = 'a';
std::cout << ch << ' ' << +ch << '\n';
原因是因为不同的重载会打印不同类型的数据。
std::basic_ostream
没有basic_ostream& operator<<( char value );
重载,这在页面结尾处进行了解释
字符和字符串参数(例如,类型为
char
或const char*
)由operator<<
的{{3}}处理。尝试使用成员函数调用语法(例如std::cout.operator<<('c');
)输出字符将调用重载(2-4)之一并输出数值。尝试使用成员函数调用语法输出字符串将调用重载(7)并打印指针值。
传递char
变量时将调用的non-member overloads是
template< class CharT, class Traits> basic_ostream<CharT,Traits>& operator<<(
basic_ostream<CharT,Traits>& os, char ch );
会在代码点ch
上打印出字符
因此,基本上,如果直接将char
,signed char
或unsigned char
传递到流,它将打印出字符。如果您尝试删除上述各行中的+
,您会发现它会打印一些“奇怪”或不可见的字符,这不是您期望的
如果要使用它们的数值,则必须为short
,int
,long
或long long
调用重载。最简单的方法是使用一元加char
从int
升级到+
。这是non-member overload中的rare useful applications之一。显式强制转换为int
也可以
有很多人都这样面对这个问题