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ć falseod var3 == 3000. mainFunkcja 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?
trueiw falseK&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.
_Booltypu 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).