J'ai vu cet exemple dans la documentation de cppreference pourstd::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';
}
Je ne comprends pas l'opérateur "+" dans
<< +std::numeric_limits<unsigned char>::lowest()
Je l'ai testé, remplacé par "-", et cela a également fonctionné. A quoi sert un tel opérateur "+"?
c++
char
unary-operator
Zhang
la source
la source
+
?-
alors les sorties ne seront pas les valeurs correctes pour les limites+
. Dans ce cas, votre requête serait probablement "c ++ unaire plus". Ce n'est ... pas vraiment intuitif, et vous devez encore apprendre à lire la documentation que vous trouverez, mais IMO c'est une compétence utile à cultiver.Réponses:
L'opérateur de sortie
<<
lorsqu'il est passé unchar
(signé ou non signé) l'écrira sous forme de caractère .Ces fonctions renverront des valeurs de type
unsigned char
. Et comme indiqué ci-dessus, cela affichera les caractères que ces valeurs représentent dans l'encodage actuel, et non leurs valeurs entières.L'
+
opérateur convertit leunsigned char
retourné par ces fonctions en une promotionint
par nombre entier . Ce qui signifie que les valeurs entières seront imprimées à la place.Une expression comme
+std::numeric_limits<unsigned char>::lowest()
est essentiellement égale àstatic_cast<int>(std::numeric_limits<unsigned char>::lowest())
.la source
+
est là pour transformer leunsigned char
en unint
. L'+
opérateur préserve la valeur, mais il a pour effet d'induire une promotion intégrale sur son opérande. C'est pour vous assurer que vous voyez une valeur numérique au lieu d'un caractère (semi-) aléatoire quioperator <<
s'imprimerait avec un type de caractère.la source
Juste pour ajouter une référence aux réponses déjà données. À partir du projet de travail standard N4713 du CPP :
Et
char
,short
,int
etlong
sont des types intégrés.la source
Sans
+
le résultat sera différent. L'extrait de code suivant sorta 97
au lieu dea a
La raison en est que différentes surcharges impriment différents types de données . Il n'y a pas de
basic_ostream& operator<<( char value );
surcharge pourstd::basic_ostream
et c'est expliqué en fin de pageLa surcharge non-membre qui sera appelée lorsque vous passez une
char
variable estqui imprime le caractère au codet
ch
Donc, fondamentalement, si vous passez
char
,signed char
ouunsigned char
directement au flux, cela imprimera le personnage. Si vous essayez de supprimer le+
sur les lignes ci-dessus, vous verrez qu'il imprime des caractères "étranges" ou non visibles, ce qui n'est pas ce à quoi on pourrait s'attendreSi vous voulez à la place de leurs valeurs numériques , vous devez appeler la surcharge
short
,int
,long
oulong long
. Le moyen le plus simple de le faire est de promouvoir dechar
àint
avec plus unaire+
. C'est l'une des rares applications utiles de l' opérateur unaire plus . Un casting expliciteint
fonctionnera égalementIl y a beaucoup de gens qui ont fait face à ce problème sur SO comme
la source