Eu vi esse exemplo na documentação da 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';
}
Eu não entendo o operador "+" em
<< +std::numeric_limits<unsigned char>::lowest()
Eu testei, substituí-o por "-", e isso também funcionou. Para que serve um operador "+"?
c++
char
unary-operator
Zhang
fonte
fonte
+
?-
, em seguida, as saídas não serão os valores corretos para os limites+
. Nesse caso, sua consulta provavelmente seria "c ++ unary plus". É ... não exatamente intuitivo, e você ainda precisa aprender a ler a documentação que encontrará, mas na IMO é uma habilidade útil de cultivar.Respostas:
O operador de saída
<<
ao receber umchar
sinal (assinado ou não) o escreverá como um caractere .Aqueles função retornará valores do tipo
unsigned char
. E, como observado acima, isso imprimirá os caracteres que esses valores representam na codificação atual, não seus valores inteiros.Os
+
convertidos operador aunsigned char
retornado por essas funções de umint
meio de promoção inteiro . O que significa que os valores inteiros serão impressos.Uma expressão como
+std::numeric_limits<unsigned char>::lowest()
é essencialmente igual astatic_cast<int>(std::numeric_limits<unsigned char>::lowest())
.fonte
+
existe para transformar ounsigned char
em umint
. O+
operador preserva o valor, mas tem o efeito de induzir promoção integral em seu operando. É para garantir que você veja um valor numérico em vez de algum caractere (semi-) aleatório queoperator <<
seria impresso quando receber um tipo de caractere.fonte
Apenas para adicionar uma referência às respostas já dadas. A partir do esboço de trabalho padrão do CPP N4713 :
E
char
,short
,int
, elong
são tipos integrais.fonte
Sem
+
o resultado será diferente. O seguinte fragmento gera ema 97
vez dea a
O motivo é que diferentes sobrecargas imprimem diferentes tipos de dados . Não há
basic_ostream& operator<<( char value );
sobrecargastd::basic_ostream
e é explicado no final da páginaA sobrecarga de não membro que será chamada quando você passar uma
char
variável éque imprime o caractere no ponto de código
ch
Então, basicamente, se você passar
char
,signed char
ouunsigned char
diretamente para o fluxo, o personagem será impresso. Se você tentar remover as+
linhas acima, verá que ele imprime alguns caracteres "estranhos" ou não visíveis, o que não é o que se esperaSe você quiser seus valores numéricos, em vez você deve chamar a sobrecarga para
short
,int
,long
oulong long
. A maneira mais fácil de fazer isso é promovendo dechar
paraint
com mais unário+
. Essa é uma das raras aplicações úteis do operador unary plus . Um elenco explícito paraint
também funcionaráMuitas pessoas enfrentaram esse problema no SO, como
fonte