Uzun zaman önce bir forumdaki ilginç bir soruyu tökezledim ve cevabı bilmek istiyorum.
Aşağıdaki C işlevini göz önünde bulundurun:
f1.c
#include <stdbool.h>
bool f1()
{
int var1 = 1000;
int var2 = 2000;
int var3 = var1 + var2;
return (var3 == 0) ? true : false;
}
O false
zamandan beri bu her zaman dönmelidir var3 == 3000
. main
Fonksiyonu aşağıdaki gibidir:
main.c
#include <stdio.h>
#include <stdbool.h>
int main()
{
printf( f1() == true ? "true\n" : "false\n");
if( f1() )
{
printf("executed\n");
}
return 0;
}
Yana f1()
hep dönmelidir false
, tek bir program yalnızca bir yazdırma beklenebilir false ekranına. Ancak derledikten ve çalıştırdıktan sonra, yürütüldü :
$ gcc main.c f1.c -o test
$ ./test
false
executed
Neden? Bu kod bir tür tanımsız davranışa sahip mi?
Not: ile derledim gcc (Ubuntu 4.9.2-10ubuntu13) 4.9.2
.
main()
Basitleştirilmiş olabilir int main() { puts(f1() == true ? "true" : "false"); puts(f1() ? "true" : "false"); return 0; }
bu daha iyi tutarsızlık gösterecektir -.
void
?
true
ve false
hiç böyle bir sorun yoktu. Doğru ve yanlış için sadece 0 ve sıfırdan farklıydı. Öyle değil mi? O zaman prototiplerin mevcut olup olmadığını bilmiyorum.
_Bool
tip ve <stdbool.h>
başlık yoktu .
f1()
, aynı dosyayamain()
kopyalasanız bile, biraz tuhaflık elde edersiniz: C ++ '()
da boş bir parametre listesi için kullanmak doğru olsa da, C henüz tanımlanmamış bir parametre listesine sahip bir işlev için kullanılır ( temelde)
) sonrasında bir K & R stili parametre listesi bekler . Doğru C olması için kodunuzu olarak değiştirmelisinizbool f1(void)
.