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

时间:2018-09-03 08:43:11

标签: c++ char unary-operator

我看到了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()

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

4 个答案:

答案 0 :(得分:135)

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

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

+运算符将这些函数返回的unsigned char转换为integer promotionint。这意味着将打印整数值。

类似+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一元运算符
  ...

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

charshortintlong是整数类型。

答案 3 :(得分:12)

如果没有+,结果将有所不同。以下代码段输出a 97而不是a a

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

原因是因为不同的重载会打印不同类型的数据std::basic_ostream没有basic_ostream& operator<<( char value );重载,这在页面结尾处进行了解释

  

字符和字符串参数(例如,类型为charconst 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上打印出字符

因此,基本上,如果直接将charsigned charunsigned char传递到流,它将打印出字符。如果您尝试删除上述各行中的+,您会发现它会打印一些“奇怪”或不可见的字符,这不是您期望的

如果要使用它们的数值,则必须为shortintlonglong long调用重载。最简单的方法是使用一元加charint升级到+。这是non-member overload中的rare useful applications之一。显式强制转换为int也可以

有很多人都这样面对这个问题