Tôi đã vấp phải một câu hỏi thú vị trong một diễn đàn từ lâu và tôi muốn biết câu trả lời.
Xét hàm C sau:
F1.c
#include <stdbool.h>
bool f1()
{
int var1 = 1000;
int var2 = 2000;
int var3 = var1 + var2;
return (var3 == 0) ? true : false;
}
Điều này sẽ luôn luôn trở lại false
kể từ đó var3 == 3000
. Các main
chức năng trông như thế này:
C chính
#include <stdio.h>
#include <stdbool.h>
int main()
{
printf( f1() == true ? "true\n" : "false\n");
if( f1() )
{
printf("executed\n");
}
return 0;
}
Vì f1()
luôn luôn quay trở lại false
, người ta sẽ mong đợi chương trình chỉ in một sai lên màn hình. Nhưng sau khi biên dịch và chạy nó, thực thi cũng được hiển thị:
$ gcc main.c f1.c -o test
$ ./test
false
executed
Tại sao vậy? Liệu mã này có một số loại hành vi không xác định?
Lưu ý: Tôi đã biên dịch nó với gcc (Ubuntu 4.9.2-10ubuntu13) 4.9.2
.
main()
thể được đơn giản hóa int main() { puts(f1() == true ? "true" : "false"); puts(f1() ? "true" : "false"); return 0; }
- điều này sẽ cho thấy sự khác biệt tốt hơn.
void
?
true
và false
trong K & R 1st ed., Vì vậy không có vấn đề nào như vậy cả. Đó chỉ là 0 và khác không đối với đúng và sai. Phải không? Tôi không biết liệu nguyên mẫu có sẵn tại thời điểm đó.
_Bool
loại và không có <stdbool.h>
tiêu đề.
f1()
vào cùng một tệp như vậymain()
, bạn sẽ nhận được một số điều kỳ lạ: Mặc dù nó đúng trong C ++ để sử dụng()
cho danh sách tham số trống, nhưng trong C được sử dụng cho một hàm với danh sách tham số chưa được xác định ( về cơ bản, nó mong đợi một danh sách tham số kiểu K & R sau)
). Để được chính xác C, bạn nên thay đổi mã của bạn thànhbool f1(void)
.