"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Por qué la impresión de un puntero de función sin invocación produce \"1\" en C++?

¿Por qué la impresión de un puntero de función sin invocación produce \"1\" en C++?

Publicado el 2024-11-14
Navegar:932

Why Does Printing a Function Pointer Without Invocation Yield \

Imprimir un puntero de función sin invocación: comprender la misteriosa salida de 1

En un fragmento de código intrigante, se "llama" una función sin invocando sus paréntesis ("pr;") y luego impreso usando std::cout. Sorprendentemente, el resultado arroja consistentemente 1, desafiando las expectativas.

El enigma de las constantes 1

El código llama a la función pr de tres maneras diferentes:

cout 

La intuición sugiere que se debe imprimir un puntero de función en lugar de los enigmáticos 1. Sin embargo, comprender este comportamiento requiere profundizar en los mecanismos de conversión de tipos de C.

Conversión de tipos y valores booleanos

Cuando se pasa como argumento a cout, pr está implícitamente convertido a bool. Esta conversión se produce porque bool es un tipo fundamental y cout requiere un tipo fundamental como entrada. En C, un valor bool convertido es verdadero si el valor original es distinto de cero y falso si es cero.

Dado que pr es un puntero de función, su valor es una dirección de memoria distinta de cero. En consecuencia, cuando se convierte a bool, se evalúa como verdadero, que cout genera como 1.

Personalizar la impresión del puntero de función (C 11 en adelante)

C 11 presenta una sobrecarga personalizable que permite una impresión más informativa de punteros de función:

template 
std::ostream & operator

Esta sobrecarga imprime la dirección del puntero de función y el número de argumentos que toma. Se puede utilizar para imprimir pr de la siguiente manera:

cout 

Este enfoque proporciona una salida más descriptiva, lo que facilita la comprensión de las propiedades del puntero de función.

Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3