มาตรฐาน C ระบุค่าความจริงอย่างชัดเจนเป็น 0 หรือ 1 หรือไม่


86

เรารู้ว่าตัวเลขใด ๆ ที่ไม่เท่ากับจะ0ถูกมองtrueใน C ดังนั้นเราจึงสามารถเขียน:

อย่างไรก็ตามฉันสงสัยว่าจริง / เท็จถูกกำหนดให้เป็น1/ 0ใน C ดังนั้นฉันจึงลองใช้รหัสด้านล่าง:

ไม่มาตรฐาน C อย่างชัดเจนระบุค่าความจริงของความจริงและเท็จเป็น1และ0ตามลำดับ?


3
ฉันเดาว่าคำถาม SOนี้เกี่ยวข้อง
Imran Ali

3
ฉันพยายามเรียกใช้สิ่งนี้gccด้วย-std=c89และให้ผลลัพธ์เดียวกัน
Kevin Dong

1
@Blackhole จาก 15 ถึง 0
Arturo Torres Sánchez

6
เกือบล่อ แต่ในช่วงทศวรรษที่ผ่านมาก่อนที่จะ SO / SE A: c-faq.com/bool/bool2.html
dave_thompson_085

1
เท็จนั้นเป็นศูนย์คือแคนนอนอย่างไรก็ตามความจริงโดยทั่วไปมักคิดว่า "ไม่ใช่ศูนย์" โปรแกรมเมอร์เป็นอย่างที่พวกเขาเป็นอย่างไรก็ตามเราใช้ 1 ทั้งหมดว่า "ไม่ใช่ศูนย์" ด้วยเหตุผลหลายประการ คุณไม่ควรเชื่อว่าจริงจะเป็น 1 อย่างแน่นอนในขณะที่ (0 == 0) เป็นค่าหนึ่งในตัวอย่างของคุณบางสิ่งเช่น (12 == 12) สามารถมีค่า 12 ได้อย่างง่ายดาย "จริง" ด้วย
วิศวกร

คำตอบ:


96

มาตรฐาน C ระบุค่าความจริงของtrueและfalseเป็น0และ1ตามลำดับอย่างชัดเจนหรือไม่?

มาตรฐาน C กำหนดtrueและfalseเป็นมาโครstdbool.hที่ขยายเป็น1และ0ตามลำดับ

C11-§7.18:

มาโครสามตัวที่เหลือเหมาะสำหรับใช้ใน#ifคำสั่งก่อนการประมวลผล พวกเขาเป็น

ซึ่งจะขยายอย่างต่อเนื่องจำนวนเต็ม1,

ซึ่งขยายเป็นค่าคงที่จำนวนเต็ม0[... ]

สำหรับผู้ปฏิบัติงาน==และ!=มาตรฐานกล่าวว่า

C11-§6.5.9 / 3:

ตัวดำเนินการ==(เท่ากับ) และ!=(ไม่เท่ากับ) นั้นคล้ายคลึงกับตัวดำเนินการเชิงสัมพันธ์ยกเว้นตัวดำเนินการที่มีความสำคัญต่ำกว่า 108)แต่ละตัวดำเนินการให้1หากความสัมพันธ์ที่ระบุเป็นจริงและ0หากเป็นเท็จ intผลที่ได้มีประเภท สำหรับคู่ของตัวถูกดำเนินการใด ๆ ความสัมพันธ์ข้อใดข้อหนึ่งเป็นจริง


20
สำหรับฉันแล้วดูเหมือนว่าคำถามนั้นเกี่ยวกับ0 == 0และ0 != 0อื่น ๆ ไม่ใช่ค่าของมาโคร
MM

9
ฉันคิดว่าตอนที่เขาเขียนtrueเขาหมายถึง "มูลค่าของการเปรียบเทียบที่แท้จริง" หรืออะไรสักอย่างไม่ใช่มาโครtrue
MM

1
@KevinDong; ใช่ร่าง C99 มีย่อหน้าที่คล้ายกัน
haccks

1
@haccks: คุณสามารถพูดเกี่ยวกับเรื่องนี้ได้โดยไม่ลังเลว่า "เหมือนกัน" ฉันเพิ่งเขียนคำพูดของคุณขึ้นมาเนื่องจากฉันขี้เกียจค้นหาทีละย่อหน้าเนื่องจากฉันอ้างถึง c99 เมื่อจำเป็น และฉันสามารถค้นหามันได้โดยเพียงแค่ค้นหาผ่านctrl+ f;)
dhein

2
@MooingDuck: NaN == NaNเป็นเท็จและNaN != NaNเป็นความจริง ไม่มีปัญหากับคำสั่งนั้น
kennytm

51

ไม่ได้ระบุไว้อย่างชัดเจนใน C11 การดำเนินการระดับภาษาทั้งหมดจะคืนค่า 1 เป็นความจริง (และยอมรับใด ๆ ที่ไม่ใช่ศูนย์รวมถึง NaN เป็นจริง)

  • หากคุณกังวลเรื่อง_Boolจริงต้องเป็น 1 เพราะมาตรฐานกำหนดให้ถือ 0 และ 1 เท่านั้น (§6.2.5 / 2)
  • นอกจากนี้ใน<stdbool.h>มาโครtrueยังขยายเป็น1(§7.18 / 3)
  • ==, !=, <, >, <=และ>=กลับ 0 หรือ 1 (§6.5.8 / 6, §6.5.9 / 3)
  • !, &&และ||กลับ 0 หรือ 1 (§6.5.3.3 / 5, §6.5.13 / 3, §6.5.14 / 3)
  • defined ขยายเป็น 0 หรือ 1 (§6.10.1 / 1)

แต่ฟังก์ชันไลบรารีมาตรฐานทั้งหมดเช่นislowerเพียงแค่พูดว่า "nonzero" สำหรับ truthy (เช่น§7.4.1 / 1, §7.17.5.1 / 3, §7.30.2.1 / 1, §7.30.2.2.1 / 4)


§6.2.5 / 2 : วัตถุที่ประกาศเป็นประเภท_Boolมีขนาดใหญ่พอที่จะเก็บค่า 0 และ 1

§6.5.5.3 / 5 : ผลลัพธ์ของตัวดำเนินการเชิงตรรกะปฏิเสธ!คือ 0 ถ้าค่าของตัวถูกดำเนินการเปรียบเทียบไม่เท่ากันกับ 0, 1 ถ้าค่าของตัวถูกดำเนินการเปรียบเทียบเท่ากับ 0 ...

§6.5.8 / 6 : แต่ละตัวดำเนินการ<(น้อยกว่า) >(มากกว่า) <=(น้อยกว่าหรือเท่ากับ) และ>=(มากกว่าหรือเท่ากับ) จะให้ผล 1 ถ้าความสัมพันธ์ที่ระบุเป็นจริงและ 0 ถ้ามัน เป็นเท็จ 107) …

§6.5.9 / 3 : ตัวดำเนินการ==(เท่ากับ) และ!=(ไม่เท่ากับ) นั้นคล้ายคลึงกับตัวดำเนินการเชิงสัมพันธ์ยกเว้นตัวดำเนินการเชิงสัมพันธ์ที่ต่ำกว่า 108) ตัวดำเนินการแต่ละตัวให้ผล 1 หากความสัมพันธ์ที่ระบุเป็นจริงและ 0 ถ้าเป็น เท็จ …

§6.5.13 / 3 : ตัว&&ดำเนินการจะให้ 1 ถ้าตัวถูกดำเนินการทั้งสองเปรียบเทียบไม่เท่ากันกับ 0 …

§6.5.14 / 3 : ตัว||ดำเนินการจะต้องให้ 1 ถ้าตัวถูกดำเนินการอย่างใดอย่างหนึ่งเปรียบเทียบไม่เท่ากันกับ 0 …

§6.10.1 / 1 : …มันอาจมีนิพจน์ตัวดำเนินการยูนารีของแบบฟอร์ม - defined identifier- หรือ - defined ( identifier )- ซึ่งประเมินเป็น 1 ถ้า ...

§7.4.1 (ฟังก์ชันการจัดหมวดหมู่อักขระ) / 1 : ฟังก์ชันในอนุประโยคนี้จะส่งกลับค่าไม่ใช่ศูนย์ (จริง) ถ้าหาก ...

§7.18 / 3 : มาโครสามตัวที่เหลือเหมาะสำหรับใช้ใน#ifคำสั่งก่อนการประมวลผล พวกมันคือ - true- ซึ่งขยายเป็นค่าคงที่จำนวนเต็ม 1, …

§7.17.5.1 / 3 : atomic_is_lock_freeฟังก์ชันทั่วไปจะส่งคืนค่าที่ไม่ใช่ศูนย์ (จริง) ถ้าและเฉพาะในกรณีที่การทำงานของวัตถุไม่มีการล็อค …

§7.30.2.1 (ฟังก์ชันการจำแนกอักขระแบบกว้าง) / 1 : ฟังก์ชันในอนุประโยคนี้จะส่งกลับค่าไม่ใช่ศูนย์ (จริง) ถ้าและเฉพาะในกรณีที่ ...

§7.30.2.2.1 / 4 : iswctypeฟังก์ชันจะส่งกลับค่าไม่ใช่ศูนย์ (จริง) ถ้าและต่อเมื่อ


23

มีสองส่วนของมาตรฐานที่คุณต้องระวังเมื่อจัดการกับค่าบูลีน (โดยที่ฉันหมายถึงค่าจริง / เท็จแทนที่จะเป็นbool/_BoolประเภทC เฉพาะ) ใน C

สิ่งแรกเกี่ยวข้องกับผลลัพธ์ของนิพจน์และสามารถพบได้ในส่วนต่างๆของC11 6.5 Expressions(ตัวดำเนินการเชิงสัมพันธ์และความเท่าเทียมกันเป็นต้น) บรรทัดล่างคือเมื่อใดก็ตามที่ค่าบูลีนถูกสร้างขึ้นโดยนิพจน์มัน ...

... ให้ 1 ถ้าความสัมพันธ์ที่ระบุเป็นจริงและ 0 ถ้าเป็นเท็จ ผลลัพธ์มีประเภท int

ใช่ผลลัพธ์ของนิพจน์ที่สร้างบูลีนจะเป็นหนึ่งสำหรับจริงหรือเป็นศูนย์สำหรับเท็จ สิ่งนี้ตรงกับสิ่งที่คุณจะพบในstdbool.hที่ที่มาโครมาตรฐานtrueและfalseกำหนดไว้ในลักษณะเดียวกัน

อย่างไรก็ตามโปรดทราบว่าการปฏิบัติตามหลักการที่มีประสิทธิภาพของ "จงอนุรักษ์นิยมในสิ่งที่คุณส่งไปมีความเสรีในสิ่งที่คุณยอมรับ" การตีความจำนวนเต็มในบริบทบูลีนจะค่อนข้างผ่อนคลาย

อีกครั้งจากส่วนต่างๆ6.5คุณจะเห็นภาษาเช่น:

ตัว||ดำเนินการจะให้ผลลัพธ์ 1 ถ้าตัวถูกดำเนินการอย่างใดอย่างหนึ่งเปรียบเทียบไม่เท่ากันกับ 0 มิฉะนั้นจะให้ผลเป็น 0ผลลัพธ์มีประเภท int

จากนั้น (และส่วนอื่น ๆ ) ก็เห็นได้ชัดว่าเป็นศูนย์ถือว่าเป็นเท็จและใด ๆค่าอื่นเป็นความจริง


นอกจากนี้ภาษาที่ระบุว่าค่าใดที่ใช้สำหรับการสร้างบูลีนและการตีความยังปรากฏใน C99 และ C89 ดังนั้นจึงใช้มาระยะหนึ่งแล้ว แม้แต่ K&R (ANSI-C รุ่นที่สองและรุ่นแรก) ก็ระบุว่ามีส่วนข้อความเช่น:

นิพจน์เชิงสัมพันธ์เช่นi > jและนิพจน์ตรรกะที่เชื่อมต่อ&&และ||ถูกกำหนดให้มีค่า1ถ้าเป็นจริงและ0หากเป็นเท็จ

ในส่วนของการทดสอบif, while, forฯลฯ "ความจริง" ก็หมายความว่า "ไม่เป็นศูนย์"

ตัว&&ดำเนินการ ... คืนค่า 1 หากตัวถูกดำเนินการทั้งสองเปรียบเทียบไม่เท่ากันกับศูนย์มิฉะนั้น 0

ตัว||ดำเนินการ ... ส่งคืน 1 หากตัวถูกดำเนินการเปรียบเทียบไม่เท่ากันกับศูนย์และเป็น 0

มาโครในstdbool.hปรากฏใน C99 เช่นกัน แต่ไม่ปรากฏใน C89 หรือ K&R เนื่องจากไม่มีไฟล์ส่วนหัวในตอนนั้น


2
ทราบว่า||, ==, !=ฯลฯ อัตราผลตอบแทนที่intไม่เป็นชนิดบูล
เอ็มเอ็ม

2
ฉันโหวตคำถามนี้สำหรับคำถามที่ถูกต้อง สำหรับฉันแล้วคำถามก็เกี่ยวกับตัวดำเนินการเชิงสัมพันธ์ไม่ใช่มาโคร
ckruczek

"ในส่วนของการทดสอบif, while, forฯลฯ 'ความจริง' ก็หมายความว่า 'ไม่เป็นศูนย์'." นี่เป็นส่วนสำคัญของคำตอบและในความคิดของฉันเป็นทางเลือกที่โชคร้ายของเดนนิสริตชี่เมื่อนานมาแล้ว ใครก็ตามที่เขียนฟังก์ชันที่ส่งคืนรหัสข้อผิดพลาดเป็นค่าที่ส่งคืนโดยทั่วไปมี#define noErr 0และรหัสข้อผิดพลาดที่ไม่ใช่ศูนย์ถือเป็นข้อผิดพลาด แล้วปัญหาก็คือความเรียบง่ายและสวยงามของif ( ready_to_do_something() ){do_something();} มันไม่ได้ผล จะต้องเป็นif ( !not_ready_to_do_something() ){do_something();}"มีความเท็จมากมาย แต่มีเพียงความจริงเพียงหนึ่งเดียว" TRUE ควรเป็น 0
robert bristow-johnson

ด้วยความอยากรู้อยากเห็นว่ากฎ C ฉบับร่างแรกระบุลักษณะการทำงานของ "&&" และ "||" อย่างไร ในกรณีที่ตัวถูกดำเนินการมีค่าอื่นที่ไม่ใช่ 0 หรือ 1? ข้อความที่คุณอ้างว่า "นิพจน์ตรรกะ" เชื่อมต่อกันโดย && และ || แต่ถ้าตัวดำเนินการเหล่านั้นเชื่อมต่อสิ่งอื่นที่ไม่ใช่นิพจน์เชิงตรรกะ
supercat

1
@sdenham ใช่ ในสำเนา K&R ที่เก่าที่สุดที่ฉันมี (รุ่นแรกพิมพ์รัน 14 หนึ่งครั้งก่อนกำหนดที่กล่าวถึงคุณลักษณะฮาร์ดแวร์ของเครื่องทั่วไปสี่เครื่อง ได้แก่ PDP-11, Honeywell-6000, IBM-370 และ Interdata-8/32) A.7.6/7/10/11(เชิงสัมพันธ์ / เสมอภาค / ตรรกะและ / ตรรกะ - หรือ) ทั้งหมดระบุว่าให้ 0 หรือ 1 เป็นผลลัพธ์ มีคำตอบที่อัปเดตเพื่อรวมไว้
paxdiablo

10

คุณกำลังผสมสิ่งต่างๆมากมาย: คำสั่งควบคุมตัวดำเนินการและประเภทบูลีน แต่ละคนมีกฎของตัวเอง

คำสั่งควบคุมทำงานเหมือนตัวอย่างifคำสั่ง C11 6.4.8.1:

ในทั้งสองรูปแบบการย่อยครั้งแรกจะดำเนินการถ้านิพจน์เปรียบเทียบไม่เท่ากันกับ 0

while, forฯลฯ มีกฎเดียวกัน สิ่งนี้ไม่เกี่ยวข้องกับ "จริง" หรือ "เท็จ"

สำหรับตัวดำเนินการที่คาดคะเนว่าจะให้ผลลัพธ์แบบบูลีนพวกเขากำลังให้intค่า 1 หรือ 0 ตัวอย่างเช่นตัวดำเนินการความเท่าเทียมกัน C11 6.5.9:

ตัวดำเนินการแต่ละตัวจะให้ 1 หากความสัมพันธ์ที่ระบุเป็นจริงและ 0 หากเป็นเท็จ

ทั้งหมดข้างต้นเป็นเพราะ C ไม่มีประเภทบูลีนจนถึงปี 2542 และถึงแม้จะได้มากฎข้างต้นก็ไม่เปลี่ยนแปลง แตกต่างจากภาษาโปรแกรมอื่น ๆ ส่วนใหญ่ที่คำสั่งและตัวดำเนินการให้ผลเป็นประเภทบูลีน (เช่น C ++ และ Java) intโดยให้ค่าเป็นศูนย์หรือไม่เป็นศูนย์ ตัวอย่างเช่นsizeof(1==1)จะให้ 4 ใน C แต่ 1 ใน C ++

ประเภทบูลีนที่แท้จริงใน C ถูกตั้งชื่อ_Boolและต้องการคอมไพเลอร์ที่ทันสมัย ส่วนหัวstdbool.hแมโครกำหนดbool, trueและfalseที่ขยายตัวออกไป_Bool, 1และ0ตามลำดับ (สำหรับการทำงานร่วมกันกับ C ++)


อย่างไรก็ตามถือเป็นแนวทางปฏิบัติในการเขียนโปรแกรมที่ดีในการปฏิบัติต่อข้อความควบคุมและตัวดำเนินการราวกับว่าพวกเขาต้องการ / ให้ผลเป็นประเภทบูลีนจริงๆ มาตรฐานการเข้ารหัสบางอย่างเช่น MISRA-C แนะนำให้ปฏิบัติเช่นนั้น นั่นคือ:

if(ptr == NULL)if(ptr)แทน

if((data & mask) != 0)if(data & mask)แทน

จุดมุ่งหมายของรูปแบบดังกล่าวคือการเพิ่มความปลอดภัยให้กับประเภทโดยใช้เครื่องมือวิเคราะห์แบบคงที่ซึ่งจะช่วยลดข้อบกพร่อง กล่าวได้ว่าสไตล์นี้มีความหมายก็ต่อเมื่อคุณใช้เครื่องวิเคราะห์แบบคงที่ แม้ว่าในบางกรณีจะนำไปสู่การอ่านโค้ดที่สามารถจัดทำเอกสารด้วยตนเองได้มากขึ้น

ดีเจตนาชัดเจนรหัสเป็นเอกสารในตัวเอง

เทียบกับ

ไม่ดี อาจหมายถึงอะไรก็ได้และเราต้องค้นหาประเภทของcรหัสเพื่อทำความเข้าใจ มันเป็นจำนวนเต็มตัวชี้หรืออักขระ?


1
sizeof(bool)เป็นการนำไปใช้งานเฉพาะใน C ++ ดูstackoverflow.com/questions/4897844/is-sizeofbool-defined
David Hammen

@DavidHammen เช่นเดียวกับ sizeof (0 == 0) ถูกกำหนดให้ใช้งานด้วย เป็นเพียงตัวอย่างเท่านั้น
Lundin

ฉันคิดว่า C ได้เปลี่ยนกฎสำหรับประเภทบูลีน ประเภท uintN ประเภทอื่น ๆ (รวมถึงประเภท "บิต" ของคอมไพเลอร์รุ่นเก่าจำนวนมาก) เก็บค่า N บิตที่ต่ำกว่าและไม่สนใจบิตที่สูงกว่าในขณะที่ประเภทบูลีนใหม่ "หรือ" รวมบิตทั้งหมด
supercat

1
มันควรจะเป็นif(ptr != NULL)หรือบางทีif(!ptr)?
Mathieu K.

1
if(c == '\0')ยืมตัวมาจากความผิดพลาดในการเขียนโค้ดของผู้เริ่มต้นโดยเฉพาะif(c = '\0')ดังนั้นฉันจึงหลีกเลี่ยง เห็นด้วยif(c)ไม่ดี ... ควรเป็นเช่นif(valveIsOpen)
aja

4

ฉันได้ตั้งโปรแกรมไว้หลายภาษา ฉันเคยเห็นจริงเป็น 1 หรือ -1 ขึ้นอยู่กับภาษา ตรรกะที่อยู่เบื้องหลังการเป็นจริง 1 คือบิตเป็น 0 หรือ 1 ตรรกะที่อยู่เบื้องหลังการเป็นจริง -1 ก็คือ! ผู้ประกอบการเป็นส่วนเติมเต็ม มันเปลี่ยน 1 ทั้งหมดเป็น 0 และ 0 ทั้งหมดเป็น 1 ใน int ดังนั้นสำหรับ int,! 0 = -1 และ! (- 1) = 0 สิ่งนี้ทำให้ฉันสะดุดมากพอที่ฉันจะไม่เปรียบเทียบว่าบางสิ่งเป็น == จริง แต่ให้เปรียบเทียบเป็น! = false ด้วยวิธีนี้รูปแบบการเขียนโปรแกรมของฉันใช้ได้กับทุกภาษา ดังนั้นคำตอบของฉันคือไม่ต้องกังวล แต่ตั้งโปรแกรมเพื่อให้โค้ดของคุณทำงานได้อย่างถูกต้องไม่ว่าจะด้วยวิธีใดก็ตาม


ทำอย่างไร ! เปลี่ยน 0 ทั้งหมดเป็น 1 และยังคงสร้าง 0 สำหรับ! 5?
codehot

@codeshot มันไม่ได้ แต่ประเด็นที่เขาทำคือไม่ใช่ทุกภาษาที่ปฏิบัติต่อตัวถูกดำเนินการ! เป็นบูลีน รักษาบ้าง! เป็น C ~ - นั่นคือส่วนเสริมแบบบิต ในกรณีนี้การกำหนดค่าผลลัพธ์จำเป็นต้องทราบประเภทของตัวแปรตั้งแต่แรกดังนั้น! (uint32_t) 5 จึงเป็น 4,294,967,290 แต่! 0 ยังคงเป็น 4,294,967,295 และ 4,294,967,295 เป็นความจริง
Pegasus Epsilon

1

คำตอบนี้ต้องดูอย่างละเอียดอีกเล็กน้อย

คำจำกัดความที่แท้จริงใน C ++ คือสิ่งที่ไม่ใช่ 0 จะถือว่าเป็นจริง เหตุใดจึงเกี่ยวข้อง เนื่องจาก C ++ ไม่ทราบว่าจำนวนเต็มคืออะไรโดยเราคิดอย่างไร - เราสร้างความหมายนั้นสิ่งที่เก็บไว้คือเปลือกและกฎสำหรับความหมาย มันรู้ว่าบิตคืออะไรซึ่งประกอบเป็นจำนวนเต็ม

1 ในฐานะที่เป็นจำนวนเต็มจะแสดงเป็นบิตแบบหลวม ๆ พูดว่า int ที่มีการลงนาม 8 บิตเป็น 0000 0001 หลายครั้งสิ่งที่เราเห็นด้วยสายตาเป็นเรื่องโกหกเล็กน้อย -1 เป็นวิธีที่ใช้แทนกันได้มากเนื่องจากลักษณะการลง ของ "จำนวนเต็ม" 1 ไม่ได้หมายความว่าเหมาะสมจริงทำไม? เพราะมันไม่ใช่การดำเนินการ 1111 1110 นั่นเป็นปัญหาหลักสำหรับบูลีน เมื่อเราพูดถึงบูลีนมันก็แค่ 1 บิตมันง่ายมาก 0 เป็นเท็จและ 1 เป็นจริง การดำเนินการตรรกะทั้งหมดถือเป็นเรื่องเล็กน้อย นี่คือเหตุผลที่ '-1' ควรถูกกำหนดให้เป็น 'จริง' สำหรับจำนวนเต็ม (ลงนาม) 1111 1111 NOT'ed กลายเป็น 0000 0000 --- ตรรกะถือและเราดี ints ที่ไม่ได้ลงนามนั้นค่อนข้างยุ่งยากและมักใช้กันมากในอดีตโดยที่ 1 หมายถึงจริงเพราะมันง่ายที่จะบอกเป็นนัยถึงตรรกะที่ว่า '

นั่นคือคำอธิบาย ฉันบอกว่าคำตอบที่ยอมรับที่นี่ผิด - ไม่มีคำจำกัดความที่ชัดเจนในนิยาม C / C ++ บูลีนเป็นบูลีนคุณสามารถถือว่าจำนวนเต็มเป็นบูลีนได้ แต่ความจริงแล้วผลลัพธ์เป็นจำนวนเต็มบอกว่าไม่มีอะไรเกี่ยวกับการดำเนินการที่ทำจริงเป็นบิต


4
คำถามเกี่ยวกับ C ไม่ใช่ C ++
glglgl

0

มันเกิดขึ้นเนื่องจากตัวดำเนินการเชิงสัมพันธ์ในprintfคำสั่งของคุณ

ตัวดำเนินการ==และตัวดำเนินการ!=

เนื่องจาก(0 == 0)ถือเป็นจริงดังนั้นจึงให้ค่า1

ในขณะที่ไม่ได้ถือเพื่อให้ความจริงให้ความคุ้มค่า(0 != 0)0

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.