Vi este ejemplo en la documentación de cppreference parastd::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';
}
No entiendo el operador "+" en
<< +std::numeric_limits<unsigned char>::lowest()
Lo probé, lo reemplacé con "-", y eso también funcionó. ¿De qué sirve ese operador "+"?
c++
char
unary-operator
Zhang
fuente
fuente
+
?-
entonces las salidas no serán los valores correctos para los límites+
. En este caso, su consulta probablemente sería "c ++ unary plus". No es ... exactamente intuitivo, y aún tiene que aprender a leer la documentación que encontrará, pero IMO es una habilidad útil para cultivar.Respuestas:
El operador de salida
<<
al pasar unchar
(con o sin signo) lo escribirá como un carácter .Esas funciones devolverán valores de tipo
unsigned char
. Y como se señaló anteriormente, imprimirá los caracteres que esos valores representan en la codificación actual, no sus valores enteros.El
+
operador convierte lounsigned char
devuelto por esas funciones en una promoción de entero aint
través . Lo que significa que los valores enteros se imprimirán en su lugar.Una expresión como
+std::numeric_limits<unsigned char>::lowest()
es esencialmente igual astatic_cast<int>(std::numeric_limits<unsigned char>::lowest())
.fuente
+
está ahí para convertir elunsigned char
en unint
. El+
operador preserva el valor, pero tiene el efecto de inducir una promoción integral en su operando. Es para asegurarse de ver un valor numérico en lugar de algún carácter (semi) aleatorio queoperator <<
se imprima cuando se le da un tipo de carácter.fuente
Solo para agregar una referencia a las respuestas ya dadas. Del borrador de trabajo estándar de CPP N4713 :
Y
char
,short
,int
, ylong
son tipos integrales.fuente
Sin
+
el resultado será diferente. Las siguientes salidas de fragmentos ena 97
lugar dea a
La razón es porque diferentes sobrecargas imprimen diferentes tipos de datos . No hay
basic_ostream& operator<<( char value );
sobrecargastd::basic_ostream
y se explica al final de la página.La sobrecarga de no miembros que se llamará cuando pase una
char
variable esque imprime el personaje en el punto de código
ch
Básicamente, si pasa
char
,signed char
ounsigned char
directamente a la transmisión, imprimirá el personaje. Si intenta eliminar el+
en las líneas anteriores, verá que imprime algunos caracteres "extraños" o no visibles, que no es lo que cabría esperarSi desea que sus valores numéricos en lugar usted debe llamar a la sobrecarga de
short
,int
,long
olong long
. La forma más fácil de hacer esto es promocionar dechar
aint
con unary plus+
. Esa es una de las raras aplicaciones útiles del operador unario plus . Un elenco explícito paraint
también funcionaráHay muchas personas que enfrentaron ese problema en SO como
fuente