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 falseallora var3 == 3000. La mainfunzione è 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?
truee falsein 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.
_Booltipo 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).