Я видел этот пример в документации cppreference для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()
Я протестировал его, заменил на «-», и это тоже сработало. Какая польза от такого оператора "+"?
c++
char
unary-operator
Zhang
источник
источник
+
?-
то выходные данные не будут соответствовать правильным значениям для пределов+
. В этом случае ваш запрос, вероятно, будет «c ++ unary plus». Это ... не совсем интуитивно понятно, и вам все равно придется научиться читать документацию, которую вы найдете, но, IMO, это полезный навык для развития.Ответы:
Оператор вывода
<<
при передачеchar
(со знаком или без знака) запишет его как символ .Эти функции будут возвращать значения типа
unsigned char
. И, как отмечалось выше, будут печататься символы, которые эти значения представляют в текущей кодировке, а не их целочисленные значения.В
+
операторе преобразуетunsigned char
возвращаемый эти функции кint
через продвижение целого . Это означает, что вместо этого будут напечатаны целые значения.Выражение like
+std::numeric_limits<unsigned char>::lowest()
по существу равноstatic_cast<int>(std::numeric_limits<unsigned char>::lowest())
.источник
+
есть, чтобы превратитьunsigned char
вint
.+
Оператор значение сохранения, но она имеет эффект индукции интегрального продвижения на операнде. Это необходимо для того, чтобы вы видели числовое значение вместо некоторого (полу) случайного символа, которыйoperator <<
будет печататься при заданном типе символа.источник
Просто чтобы добавить ссылку на уже данные ответы. Из стандартного рабочего проекта CPP N4713 :
И
char
,short
,int
иlong
являются неотъемлемыми типами.источник
Без
+
результата будет иначе. Следующий фрагмент выводитa 97
вместоa a
Причина в том, что разные перегрузки печатают разные типы данных . Нет
basic_ostream& operator<<( char value );
перегрузки для,std::basic_ostream
и это объясняется в конце страницыОт перегрузки , не являющийся членом , который будет вызываться при передаче
char
переменногокоторый печатает символ в кодовой точке
ch
Поэтому в основном , если вы передаете
char
,signed char
илиunsigned char
непосредственно в потоке он будет печатать персонаж. Если вы попытаетесь удалить в+
приведенных выше строках, вы увидите, что он печатает некоторые «странные» или невидимые символы, чего нельзя было ожидать.Если вы хотите их числовые значения вместо этого вы должны вызвать перегрузку для
short
,int
,long
илиlong long
. Самый простой способ сделать это -char
перейтиint
с на с унарным плюсом+
. Это один из редких полезных приложений в унарный плюс . Явное приведение кint
также будет работатьЕсть много людей, которые столкнулись с этой проблемой на SO like
источник