Imprimindo um ponteiro de função sem invocação: entendendo a saída misteriosa de 1
Em um trecho de código intrigante, uma função é "chamada" sem invocando seus parênteses ("pr;") e depois impresso usando std::cout. Surpreendentemente, o resultado produz consistentemente 1, desafiando as expectativas.
O enigma dos 1s constantes
O código chama a função de três maneiras diferentes:
cout A intuição sugere que um ponteiro de função deve ser impresso em vez dos enigmáticos 1s. No entanto, entender esse comportamento requer um aprofundamento nos mecanismos de conversão de tipo de C.
Conversão de tipo e valores bool
Quando passado como um argumento para cout, pr é implicitamente convertido em um bool. Essa conversão ocorre porque bool é um tipo fundamental e cout requer um tipo fundamental como entrada. Em C , um valor bool convertido é verdadeiro se o valor original for diferente de zero e falso se for zero.
Como pr é um ponteiro de função, seu valor é um endereço de memória diferente de zero. Conseqüentemente, quando convertido para bool, ele é avaliado como verdadeiro, que é gerado como 1 por cout.
Personalizando a impressão do ponteiro de função (C 11 em diante)
C 11 apresenta uma sobrecarga personalizável que permite a impressão mais informativa de ponteiros de função:
template
std::ostream & operatorEssa sobrecarga imprime o endereço do ponteiro de função e o número de argumentos necessários. Pode ser usado para imprimir pr da seguinte forma:
cout Essa abordagem fornece uma saída mais descritiva, facilitando a compreensão das propriedades do ponteiro de função.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3