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 falsekể từ đó var3 == 3000. Các mainchứ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?
truevà falsetrong 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 đó.
_Boolloạ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).