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 chardevuelto por esas funciones en una promoción de entero ainttravé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 charen 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, ylongson tipos integrales.fuente
Sin
+el resultado será diferente. Las siguientes salidas de fragmentos ena 97lugar dea aLa razón es porque diferentes sobrecargas imprimen diferentes tipos de datos . No hay
basic_ostream& operator<<( char value );sobrecargastd::basic_ostreamy se explica al final de la página.La sobrecarga de no miembros que se llamará cuando pase una
charvariable esque imprime el personaje en el punto de código
chBásicamente, si pasa
char,signed charounsigned chardirectamente 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,longolong long. La forma más fácil de hacer esto es promocionar decharaintcon unary plus+. Esa es una de las raras aplicaciones útiles del operador unario plus . Un elenco explícito parainttambién funcionaráHay muchas personas que enfrentaron ese problema en SO como
fuente