Ich habe dieses Beispiel in der Dokumentation von cppreference für gesehenstd::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';
}
Ich verstehe den Operator "+" in nicht
<< +std::numeric_limits<unsigned char>::lowest()
Ich habe es getestet, durch "-" ersetzt, und das hat auch funktioniert. Was nützt ein solcher "+" - Operator?
c++
char
unary-operator
Zhang
quelle
quelle
+
?-
die Ausgänge nicht die richtigen Werte für die Grenzwerte sein+
. In diesem Fall wäre Ihre Abfrage wahrscheinlich "c ++ unary plus". Es ist ... nicht gerade intuitiv und Sie müssen noch lernen, die Dokumentation zu lesen, die Sie finden, aber IMO ist es eine nützliche Fähigkeit, sich zu kultivieren.Antworten:
Der Ausgabeoperator schreibt
<<
einchar
(vorzeichenbehaftetes oder vorzeichenloses) Zeichen als Zeichen .Diese Funktion gibt Werte vom Typ zurück
unsigned char
. Und wie oben erwähnt, werden die Zeichen gedruckt, die diese Werte in der aktuellen Codierung darstellen, nicht ihre ganzzahligen Werte.Der
+
Operator konvertiert dieunsigned char
von diesen Funktionen zurückgegebenen in eineint
durchgehende Ganzzahl-Heraufstufung . Dies bedeutet, dass stattdessen die ganzzahligen Werte gedruckt werden.Ein Ausdruck wie
+std::numeric_limits<unsigned char>::lowest()
ist im Wesentlichen gleichstatic_cast<int>(std::numeric_limits<unsigned char>::lowest())
.quelle
+
ist da, um dasunsigned char
in ein zu verwandelnint
. Der+
Operator ist werterhaltend, bewirkt jedoch eine integrale Förderung seines Operanden. Stellen Sie sicher, dass Sie einen numerischen Wert anstelle eines (halb-) zufälligen Zeichens sehen,operator <<
das bei einem bestimmten Zeichentyp gedruckt wird.quelle
Nur um einen Verweis auf die bereits gegebenen Antworten hinzuzufügen. Aus dem CPP-Standardarbeitsentwurf N4713 :
Und
char
,short
,int
, undlong
sind integrale Typen.quelle
Ohne
+
das Ergebnis wird es anders sein. Die folgenden Snippet-Ausgabena 97
statta a
Der Grund dafür ist, dass unterschiedliche Überladungen unterschiedliche Datentypen drucken . Es gibt keine
basic_ostream& operator<<( char value );
Überlastung fürstd::basic_ostream
und es wird am Ende der Seite erklärtDie Nichtmitgliedsüberladung , die aufgerufen wird, wenn Sie eine
char
Variable übergeben, istDadurch wird das Zeichen am Codepunkt ausgedruckt
ch
Also im Grunde , wenn Sie passieren
char
,signed char
oderunsigned char
direkt in den Stream wird es den Charakter ausdrucken. Wenn Sie versuchen, die+
obigen Zeilen zu entfernen, werden Sie feststellen, dass einige "seltsame" oder nicht sichtbare Zeichen gedruckt werden, was nicht den Erwartungen entsprichtWenn Sie ihre numerische Werte wollen stattdessen müssen Sie die Überlastung für nennen
short
,int
,long
oderlong long
. Der einfachste Weg, dies zu tun, ist die Förderung vonchar
bisint
mit unary plus+
. Dies ist eine der seltenen nützlichen Anwendungen des unären Plus-Operators . Eine explizite Besetzung vonint
wird ebenfalls funktionierenEs gibt viele Leute, die dieses Problem auf SO mögen
quelle