Saya menemukan sebuah pertanyaan yang menarik di sebuah forum sejak lama dan saya ingin tahu jawabannya.
Pertimbangkan fungsi C berikut:
f1.c
#include <stdbool.h>
bool f1()
{
int var1 = 1000;
int var2 = 2000;
int var3 = var1 + var2;
return (var3 == 0) ? true : false;
}
Ini harus selalu kembali false
sejak itu var3 == 3000
. The main
Fungsi terlihat seperti ini:
main.c
#include <stdio.h>
#include <stdbool.h>
int main()
{
printf( f1() == true ? "true\n" : "false\n");
if( f1() )
{
printf("executed\n");
}
return 0;
}
Karena f1()
harus selalu kembali false
, orang akan mengharapkan program untuk mencetak hanya satu yang salah ke layar. Tetapi setelah mengkompilasi dan menjalankannya, dieksekusi juga ditampilkan:
$ gcc main.c f1.c -o test
$ ./test
false
executed
Mengapa demikian? Apakah kode ini memiliki semacam perilaku yang tidak terdefinisi?
Catatan: Saya kompilasi dengan gcc (Ubuntu 4.9.2-10ubuntu13) 4.9.2
.
main()
dapat disederhanakan ke int main() { puts(f1() == true ? "true" : "false"); puts(f1() ? "true" : "false"); return 0; }
- ini akan menunjukkan perbedaan yang lebih baik.
void
?
true
dan false
di K&R 1st ed., jadi tidak ada masalah sama sekali. Itu hanya 0 dan bukan nol untuk benar dan salah. Bukan? Saya tidak tahu apakah prototipe tersedia saat itu.
_Bool
tipe dan tidak ada <stdbool.h>
header.
f1()
ke file yang sama denganmain()
, Anda akan mendapatkan beberapa keanehan: Meskipun benar di C ++ untuk digunakan()
untuk daftar parameter kosong, di C yang digunakan untuk fungsi dengan daftar parameter yang belum ditentukan ( pada dasarnya mengharapkan daftar parameter K & R-style setelah)
). Agar benar C, Anda harus mengubah kode Anda kebool f1(void)
.