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 & operatorEsta 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.
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