Molto tempo fa mi sono imbattuto in un'interessante domanda in un forum e voglio conoscere la risposta.
Considera la seguente funzione C:
f1.c
#include <stdbool.h>
bool f1()
{
int var1 = 1000;
int var2 = 2000;
int var3 = var1 + var2;
return (var3 == 0) ? true : false;
}
Questo dovrebbe sempre tornare da false
allora var3 == 3000
. La main
funzione è simile alla seguente:
main.c
#include <stdio.h>
#include <stdbool.h>
int main()
{
printf( f1() == true ? "true\n" : "false\n");
if( f1() )
{
printf("executed\n");
}
return 0;
}
Dato che f1()
dovrebbe sempre tornare false
, ci si aspetterebbe che il programma stampi solo uno falso sullo schermo. Ma dopo averlo compilato ed eseguito, viene visualizzato anche eseguito :
$ gcc main.c f1.c -o test
$ ./test
false
executed
Perché? Questo codice ha una sorta di comportamento indefinito?
Nota: l'ho compilato con gcc (Ubuntu 4.9.2-10ubuntu13) 4.9.2
.
main()
potrebbe essere semplificata a int main() { puts(f1() == true ? "true" : "false"); puts(f1() ? "true" : "false"); return 0; }
- questo avrebbe mostrato la discrepanza meglio.
void
?
true
e false
in K&R 1st ed., quindi non c'erano affatto problemi del genere. Era solo 0 e diverso da zero per vero e falso. No? Non so se i prototipi fossero disponibili in quel momento.
_Bool
tipo e nessuna <stdbool.h>
intestazione.
f1()
nello stesso file dimain()
, otterrai qualche stranezza: mentre è corretto in C ++ da usare()
per un elenco di parametri vuoto, in C che viene utilizzato per una funzione con un elenco di parametri non ancora definito ( fondamentalmente si aspetta un elenco di parametri in stile K e R dopo il)
). Per essere C corretto, dovresti cambiare il tuo codice inbool f1(void)
.