ฉันพบคำถามที่น่าสนใจในฟอรัมมานานแล้วและต้องการทราบคำตอบ
พิจารณาฟังก์ชัน C ต่อไปนี้:
f1.c
#include <stdbool.h>
bool f1()
{
int var1 = 1000;
int var2 = 2000;
int var3 = var1 + var2;
return (var3 == 0) ? true : false;
}
นี้ควรกลับมาตั้งแต่false
ฟังก์ชั่นมีลักษณะเช่นนี้var3 == 3000
main
main.c
#include <stdio.h>
#include <stdbool.h>
int main()
{
printf( f1() == true ? "true\n" : "false\n");
if( f1() )
{
printf("executed\n");
}
return 0;
}
เนื่องจากf1()
ควรกลับมาตลอดโปรแกรมfalse
หนึ่งจึงคาดว่าโปรแกรมจะพิมพ์เท็จเพียงหน้าจอเดียว แต่หลังจากการรวบรวมและการทำงาน, การดำเนินการนอกจากนี้ยังจะแสดง:
$ gcc main.c f1.c -o test
$ ./test
false
executed
ทำไมถึงเป็นอย่างนั้น? รหัสนี้มีพฤติกรรมที่ไม่ได้กำหนดบางอย่างหรือไม่?
หมายเหตุ: gcc (Ubuntu 4.9.2-10ubuntu13) 4.9.2
ผมรวบรวมมันด้วย
main()
อาจจะง่ายไปint main() { puts(f1() == true ? "true" : "false"); puts(f1() ? "true" : "false"); return 0; }
- นี้จะแสดงให้เห็นความแตกต่างที่ดีกว่า
void
?
true
และfalse
ใน K & R 1 เอ็ด. จึงมีไม่ปัญหาดังกล่าวได้ทั้งหมด มันเป็นเพียง 0 และไม่ใช่ศูนย์สำหรับความจริงและเท็จ ไม่ใช่เหรอ ฉันไม่รู้ว่ามีต้นแบบในเวลานั้นหรือไม่
_Bool
ประเภทและไม่มี<stdbool.h>
ส่วนหัว
f1()
ไปไว้ในไฟล์เดียวกับmain()
คุณจะได้รับความแปลก: ในขณะที่มันถูกต้องใน C ++ เพื่อใช้()
สำหรับรายการพารามิเตอร์ที่ว่างเปล่าใน C ที่ใช้สำหรับฟังก์ชั่นที่มีรายการพารามิเตอร์ที่ยังไม่ได้กำหนด โดยทั่วไปคาดว่าจะมีรายการพารามิเตอร์สไตล์ K & R หลังจาก)
) เพื่อให้เกิดความถูกต้อง Cbool f1(void)
คุณควรเปลี่ยนรหัสของคุณ