Je suis tombé sur une question intéressante dans un forum il y a longtemps et je veux connaître la réponse.
Considérez la fonction C suivante:
f1.c
#include <stdbool.h>
bool f1()
{
int var1 = 1000;
int var2 = 2000;
int var3 = var1 + var2;
return (var3 == 0) ? true : false;
}
Cela devrait toujours revenir false
depuis var3 == 3000
. La main
fonction ressemble à ceci:
principal c
#include <stdio.h>
#include <stdbool.h>
int main()
{
printf( f1() == true ? "true\n" : "false\n");
if( f1() )
{
printf("executed\n");
}
return 0;
}
Puisque f1()
devrait toujours revenir false
, on s'attendrait à ce que le programme n'imprime qu'un seul faux à l'écran. Mais après l'avoir compilé et exécuté, exécuté est également affiché:
$ gcc main.c f1.c -o test
$ ./test
false
executed
Pourquoi donc? Ce code a-t-il une sorte de comportement non défini?
Remarque: je l'ai compilé avec gcc (Ubuntu 4.9.2-10ubuntu13) 4.9.2
.
main()
pourrait être simplifié en int main() { puts(f1() == true ? "true" : "false"); puts(f1() ? "true" : "false"); return 0; }
- cela montrerait mieux l'écart.
void
?
true
et false
dans K&R 1st ed., il n'y avait donc pas du tout de tels problèmes. C'était juste 0 et non nul pour vrai et faux. N'est-ce pas? Je ne sais pas si des prototypes étaient disponibles à l'époque.
_Bool
type ni en- <stdbool.h>
tête.
f1()
dans le même fichier quemain()
, vous obtiendrez une certaine bizarrerie: bien qu'il soit correct en C ++ à utiliser()
pour une liste de paramètres vide, en C qui est utilisé pour une fonction avec une liste de paramètres non encore définie ( il attend essentiellement une liste de paramètres de style K & R après le)
). Pour être correct C, vous devez changer votre code enbool f1(void)
.