Widziałem ten przykład w dokumentacji cppreference dlastd::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';
}
Nie rozumiem operatora „+” w
<< +std::numeric_limits<unsigned char>::lowest()
Przetestowałem to, zamieniłem na „-” i to też zadziałało. Jaki jest pożytek z takiego operatora „+”?
c++
char
unary-operator
Zhang
źródło
źródło
+
?-
na, wyjścia nie będą miały prawidłowych wartości dla limitów+
. W takim przypadku Twoje zapytanie będzie prawdopodobnie brzmiało „c ++ jednoargumentowy plus”. To ... nie jest do końca intuicyjne i nadal musisz nauczyć się czytać dokumentację, którą znajdziesz, ale IMO to przydatna umiejętność do kultywowania.Odpowiedzi:
Operator wyjściowy
<<
po przekazaniu achar
(ze znakiem lub bez znaku) zapisze go jako znak .Te funkcje będą zwracać wartości typu
unsigned char
. Jak wspomniano powyżej, wypisze znaki, które te wartości reprezentują w bieżącym kodowaniu, a nie ich wartości całkowite.W
+
przekształca operatorskiegounsigned char
zwrócone w tych funkcji naint
poprzez promowanie całkowitej . Co oznacza, że zamiast tego zostaną wydrukowane wartości całkowite.Wyrażenie takie jak
+std::numeric_limits<unsigned char>::lowest()
jest zasadniczo równestatic_cast<int>(std::numeric_limits<unsigned char>::lowest())
.źródło
+
jest po to, aby zmienićunsigned char
wint
.+
Operator jest wartość zachowania, ale ma wpływ na indukowanie dowartościowania swojego argumentu. Ma to na celu upewnienie się, że widzisz wartość liczbową zamiast jakiegoś (pół) losowego znaku, któryoperator <<
zostałby wydrukowany, gdy podano typ znaku.źródło
Wystarczy dodać odniesienie do już udzielonych odpowiedzi. Ze standardowego projektu roboczego CPP N4713 :
I
char
,short
,int
, ilong
są integralne typy.źródło
Bez
+
rezultatu będzie inaczej. Następujące fragmenty kodu wyjściowegoa 97
zamiasta a
char ch = 'a'; std::cout << ch << ' ' << +ch << '\n';
Powodem jest to, że różne przeciążenia powodują drukowanie różnych typów danych . Nie ma
basic_ostream& operator<<( char value );
przeciążeniastd::basic_ostream
i jest wyjaśnione na końcu stronyPrzeciążenie non-member która zostanie wywołana gdy mijamy
char
zmienna jesttemplate< class CharT, class Traits> basic_ostream<CharT,Traits>& operator<<( basic_ostream<CharT,Traits>& os, char ch );
która wypisuje znak w punkcie kodowym
ch
Więc w zasadzie, jeśli przejdzie
char
,signed char
albounsigned char
bezpośrednio do strumienia będzie to wydrukować znak na zewnątrz. Jeśli spróbujesz usunąć z+
powyższych wierszy, zobaczysz że drukuje jakieś "dziwne" lub niewidoczne znaki, co nie jest tym czego można by się spodziewaćJeśli chcesz ich wartości liczbowych zamiast należy wywołać przeciążenie na
short
,int
,long
lublong long
. Najłatwiejszym sposobem jest promowanie odchar
doint
z jednoargumentowym plusem+
. To jeden z tych rzadkich przydatnych aplikacji na jednoargumentowego operatora powiększonej .int
Będzie również działać wyraźna obsada doJest wielu ludzi, którzy napotkali ten problem na SO
źródło