Dawno temu natknąłem się na interesujące pytanie na forum i chcę poznać odpowiedź.
Rozważ następującą funkcję C:
f1.c
#include <stdbool.h>
bool f1()
{
int var1 = 1000;
int var2 = 2000;
int var3 = var1 + var2;
return (var3 == 0) ? true : false;
}
Powinno to zawsze powrócić false
od var3 == 3000
. main
Funkcja wygląda tak:
main.c
#include <stdio.h>
#include <stdbool.h>
int main()
{
printf( f1() == true ? "true\n" : "false\n");
if( f1() )
{
printf("executed\n");
}
return 0;
}
Ponieważ f1()
zawsze powinien wracać false
, można by oczekiwać, że program wydrukuje tylko jeden fałsz na ekranie. Ale po skompilowaniu i uruchomieniu, wykonane jest również wyświetlane:
$ gcc main.c f1.c -o test
$ ./test
false
executed
Dlaczego? Czy ten kod ma jakieś niezdefiniowane zachowanie?
Uwaga: skompilowałem to gcc (Ubuntu 4.9.2-10ubuntu13) 4.9.2
.
main()
Można uprościć do int main() { puts(f1() == true ? "true" : "false"); puts(f1() ? "true" : "false"); return 0; }
- byłoby to pokazać różnicę lepiej.
void
?
true
iw false
K&R 1st ed., więc nie było takich problemów. To było tylko 0 i niezerowe dla prawdy i fałszu. Czyż nie Nie wiem, czy prototypy były w tym czasie dostępne.
_Bool
typu ani <stdbool.h>
nagłówka.
f1()
do tego samego plikumain()
, dostałbyś pewnej dziwności: Chociaż w C ++ poprawne jest używanie()
pustej listy parametrów, w C, która jest używana dla funkcji z nieokreśloną jeszcze listą parametrów ( w zasadzie oczekuje listy parametrów w stylu K&R po)
). Aby być poprawnym C, powinieneś zmienić swój kod nabool f1(void)
.