Какова цель унарного " + " перед вызовом членов std::numeric limits?
Я видел этот пример в документации cppreference на std::numeric_limits
#include <limits>
#include <iostream>
int main()
{
std::cout << "typetlowest()tmin()ttmax()nn";
std::cout << "uchart"
<< +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 << "intt"
<< std::numeric_limits<int>::lowest() << 't'
<< std::numeric_limits<int>::min() << 't'
<< std::numeric_limits<int>::max() << 'n';
std::cout << "floatt"
<< std::numeric_limits<float>::lowest() << 't'
<< std::numeric_limits<float>::min() << 't'
<< std::numeric_limits<float>::max() << 'n';
std::cout << "doublet"
<< 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 ответов
оператор вывода <<
при передаче char
(signed или unsigned) буду писать как символ.
эти функции будут возвращать значения типа unsigned char
. И, как отмечалось выше, это будет печатать символы, которые эти значения представляют в текущей кодировке, а не их целочисленные значения.
The +
оператор преобразует unsigned char
возвращены те функции int
через продвижение целого числа. Это означает, что вместо этого будут напечатаны целочисленные значения.
выражение типа +std::numeric_limits<unsigned char>::lowest()
по сути равна static_cast<int>(std::numeric_limits<unsigned char>::lowest())
.
+
есть, чтобы повернуть unsigned char
на int
. The +
оператор сохраняет значение, но он оказывает влияние на индуцирование интегрального продвижения на его операнд. Это чтобы убедиться, что вы видите числовое значение вместо некоторого (полу-)случайного символа, который operator <<
будет печатать, когда задан тип символа.
просто, чтобы добавить ссылку на уже приведенные ответы. Из стандартного рабочего проекта CPP N4713:
8.5.2.1 унарные операторы
...
- операнд унарного оператора + должен иметь арифметическое, неназванное перечисление или тип указателя, и результатом является значение аргумента. интегральное продвижение выполняется на интегральных или перечислительных операндах. тип результатом является тип повышенного операнда.
и char
, short
, int
и long
являются интегральными типами.
без +
результат будет разным. Следующий фрагмент выводит a 97
вместо a a
char ch = 'a';
std::cout << ch << ' ' << +ch << '\n';
причина в том, что различные перегрузки печатает различные типы.
Нет basic_ostream& operator<<( char value );
перегрузка std::basic_ostream
и это объясняется в конце страницы
символьные и символьные строковые аргументы (например, типа
char
илиconst char*
) обрабатываются нечлен перегрузки ofoperator<<
. Попытка вывода символа с помощью синтаксиса вызова функции-члена (например,std::cout.operator<<('c');
) вызовет одну из перегрузок (2-4) и выведет числовое значение. Попытка вывода символьной строки с помощью синтаксиса вызова функции-члена вызовет перегрузку (7) и вместо этого выведет значение указателя.
на не-член перегрузки это будет называться, когда вы проходите char
переменной is
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
to int
С унарный плюс +
. Это один из редкие полезные приложения на унарный плюс оператор. Явное приведение к int
также будет работать
есть много людей, которые столкнулись с этой проблемой на так, как