คิดว่าบูลีนไม่ใช่บิต
โดยสรุปคำตอบของอาจารย์ของคุณนั้นดีกว่า (แต่ก็ยังพูดผิดดูเคร่งครัดมากขึ้น) เพราะมันใช้โอเปอเรเตอร์บูลีนแทนโอเปอเรเตอร์บิตไซด์และรักษาบูลีนเป็นจำนวนเต็ม การแสดงออกc==1
เพื่อเป็นตัวแทนของ "C เป็นความจริง" ไม่ถูกต้องเพราะถ้าคอาจเป็นตัวเลข (ตามที่ได้รับมอบหมายตามที่ระบุไว้) แล้วใด ๆ ที่ไม่ใช่ศูนย์ค่าของ c true
คือจะได้รับการยกย่องในฐานะที่เป็นตัวแทนของ
ดูคำถามนี้ว่าเหตุใดจึงไม่ควรเปรียบเทียบบูลีนกับ 0 หรือ 1 แม้ว่าจะปลอดภัยก็ตาม
หนึ่งในเหตุผลที่ดีมากที่จะไม่ใช้xor
เป็นที่ว่านี้เป็นบิตที่ชาญฉลาดการดำเนินการ แต่เพียงผู้เดียวหรือ มันเกิดขึ้นกับตัวอย่างของคุณเพราะทั้งด้านซ้ายและด้านขวาเป็นนิพจน์บูลีนที่แปลงเป็น 1 หรือ 0 (ดูอีก1 )
!=
แต่เพียงผู้เดียวหรือบูลีนในความเป็นจริง
ทำลายการแสดงออก
เพื่อให้เข้าใจถึงวิธีแก้ปัญหาของอาจารย์ได้ดีขึ้นง่ายที่สุดในการแทนที่โอเปอเรเตอร์บูลีนด้วย "โทเค็นทางเลือก" ที่เทียบเท่าซึ่งเปลี่ยนให้เป็น redable (imho) ที่ดีกว่าและรหัส C ++ เทียบเท่าทั้งหมด: การใช้ และ 'และ' สำหรับ '&' คุณจะได้รับ
(not a and not b) != c
น่าเสียดายที่ไม่มีexclusive_or
ตัวดำเนินการเชิงตรรกะนอกเหนือไปจากnot_eq
นี้ซึ่งไม่เป็นประโยชน์ในกรณีนี้
หากเราทำลายการแสดงออกของภาษาธรรมชาติ:
ทั้ง a และ b เป็นเท็จหรือ c เป็นจริง แต่ไม่ใช่ทั้งสองอย่าง
ก่อนอื่นในประโยคเกี่ยวกับบูลีนข้อเสนอ A และ B:
อาจเป็น A หรือ B แต่ไม่ใช่ทั้งคู่
สิ่งนี้แปลเป็นA != B
(เฉพาะสำหรับ booleans ไม่ใช่สำหรับประเภท A และ B ใด ๆ )
จากนั้นข้อเสนอ A คือ
a และ b เป็นเท็จทั้งคู่
ซึ่งสามารถระบุได้เป็น
a เป็นเท็จและ b เป็นเท็จ
ซึ่งแปลเป็น(not a and not b)
และในที่สุด
c เป็นจริง
ซึ่งแปลเป็นc
เพียง (not a and not b) != c
รวมพวกเขาคุณจะได้รับอีกครั้ง
สำหรับคำอธิบายเพิ่มเติมว่าการแสดงออกนี้ทำงานอย่างไรฉันขอเลื่อนตารางความจริงที่คนอื่นให้ไว้ในคำตอบของพวกเขา
คุณผิดทั้งคู่
และถ้าฉันอาจ nitpick: การบ้านเริ่มต้นระบุว่า a, b และ c สามารถเป็นตัวเลขที่ไม่เป็นลบ แต่ไม่ได้ระบุอย่างชัดเจนว่าหากพวกเขาเป็นตัวเลขพวกเขาควรถูก จำกัด ไว้ที่ 0 และ 1 หากตัวเลขใด ๆ ที่เป็น ไม่ใช่ 0 แทนtrue
ตามธรรมเนียมแล้วรหัสต่อไปนี้จะให้คำตอบที่น่าประหลาดใจ:
auto c = 2; // "true" in some way
auto a = 0; // "false"
auto b = 0; // "false"
std::cout << ((!a && !b) != c);
// this will output: 1 (!)
// fix by making sure that != compares booleans:
std::cout << ((!a && !b) != (bool)c);
a == b or c
a == b or a ==c
ปัญหาคือการพูด lanuage ไม่แม่นยำและจริง ๆ แล้วการตีความทั้งสองอาจถูกต้อง