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

What is the purpose of a unary "+" before a call to std::numeric_limits<unsigned char> members?

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

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

+ 可以将 unsigned char 变成 int+ 运算符是保值的,但它具有在其操作数上诱导整数提升的效果。这是为了确保您看到的是数值,而不是 operator << 在给定字符类型时会打印的一些(半)随机字符。

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

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

+ 运算符将由这些函数编辑的 unsigned char return 转换为 intinteger promotion。这意味着将打印整数值。

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

只是为了添加对已经给出的答案的引用。来自CPP标准工作草案N4713:

8.5.2.1 Unary operators
...

  1. The operand of the unary + operator shall have arithmetic, unscoped enumeration, or pointer type and the result is the value of the argument. Integral promotion is performed on integral or enumeration operands. The type of the result is the type of the promoted operand.

charshortintlong都是整型。

没有+结果会不同。以下代码片段输出 a 97 而不是 a a

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

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

Character and character string arguments (e.g., of type char or const char*) are handled by the non-member overloads of operator<<. Attempting to output a character using the member function call syntax (e.g., std::cout.operator<<('c');) will call one of overloads (2-4) and output the numerical value. Attempting to output a character string using the member function call syntax will call overload (7) and print the pointer value instead.

传递char变量时调用的non-member overload

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

打印代码点 ch

处的字符

所以基本上,如果您将 charsigned charunsigned char 直接传递给流,它会打印出字符。如果您尝试删除上面几行中的 +,您会看到它打印了一些 "strange" 或不可见的字符,这不是人们所期望的

如果您想要它们的数值,则必须为 shortintlonglong long 调用重载。最简单的方法是使用一元加 +char 提升到 int。那是 rare useful applications of the unary plus operator 之一。显式转换为 int 也可以工作

有很多人在 SO 上遇到过这个问题,喜欢

  • cout not printing unsigned char
  • uint8_t can't be printed with cout