Me tropecé con una pregunta interesante en un foro hace mucho tiempo y quiero saber la respuesta.
Considere la siguiente función C:
f1.c
#include <stdbool.h>
bool f1()
{
int var1 = 1000;
int var2 = 2000;
int var3 = var1 + var2;
return (var3 == 0) ? true : false;
}
Esto siempre debe volver false
desde entonces var3 == 3000
. La main
función se ve así:
C Principal
#include <stdio.h>
#include <stdbool.h>
int main()
{
printf( f1() == true ? "true\n" : "false\n");
if( f1() )
{
printf("executed\n");
}
return 0;
}
Como f1()
siempre debe regresar false
, uno esperaría que el programa imprima solo uno falso en la pantalla. Pero después de compilarlo y ejecutarlo, también se muestra ejecutado :
$ gcc main.c f1.c -o test
$ ./test
false
executed
¿Porqué es eso? ¿Este código tiene algún tipo de comportamiento indefinido?
Nota: lo compilé con gcc (Ubuntu 4.9.2-10ubuntu13) 4.9.2
.
main()
podría simplificarse int main() { puts(f1() == true ? "true" : "false"); puts(f1() ? "true" : "false"); return 0; }
: esto mostraría mejor la discrepancia.
void
?
true
y false
en K&R 1st ed., por lo que no hubo tales problemas en absoluto. Era solo 0 y no cero para verdadero y falso. ¿No es así? No sé si los prototipos estaban disponibles en ese momento.
_Bool
tipo ni <stdbool.h>
encabezado.
f1()
en el mismo archivo quemain()
, obtendría algunas rarezas: si bien es correcto en C ++ usar()
para una lista de parámetros vacía, en C que se usa para una función con una lista de parámetros aún no definida ( básicamente espera una lista de parámetros de estilo K&R después de)
). Para ser C correcto, debe cambiar su código abool f1(void)
.