นี่เป็นคำถามเชิงทฤษฎีมากกว่า C ++ และภาษา (ใน) ขึ้นอยู่กับมันโดยตรง (Java, C #, PHP) มีตัวดำเนินการทางลัดสำหรับการกำหนดผลลัพธ์ของตัวดำเนินการไบนารีส่วนใหญ่ให้กับตัวถูกดำเนินการแรกเช่น
a += 3; // for a = a + 3
a *= 3; // for a = a * 3;
a <<= 3; // for a = a << 3;
แต่เมื่อฉันต้องการสลับนิพจน์บูลีนฉันมักพบว่าตัวเองเขียนอะไรบางอย่างเช่น
a = !a;
ซึ่งน่ารำคาญเมื่อa
มีการแสดงออกยาวเช่น
this.dataSource.trackedObject.currentValue.booleanFlag =
!this.dataSource.trackedObject.currentValue.booleanFlag;
(ใช่กฎหมายของ Demeter ฉันรู้)
ดังนั้นฉันจึงสงสัยว่ามีภาษาใดบ้างที่มีโอเปอเรเตอร์การสลับบูลีนแบบเอกนารีที่จะทำให้ฉันสามารถใช้ตัวย่อa = !a
โดยไม่ต้องทำซ้ำการแสดงออกa
เช่น
!=a;
// or
a!!;
สมมติว่าภาษาของเรามีประเภทบูลีนที่เหมาะสม (เช่นbool
ใน C ++) และa
เป็นประเภทนั้น (ดังนั้นจึงไม่มีรูปแบบ C int a = TRUE
)
หากคุณสามารถหาแหล่งข้อมูลที่เป็นเอกสารได้ฉันก็สนใจที่จะเรียนรู้ว่าเช่นนักออกแบบ C ++ ได้พิจารณาเพิ่มผู้ดำเนินการเช่นนั้นเมื่อbool
กลายเป็นประเภทในตัวหรือไม่และถ้าเป็นเช่นนั้นทำไมพวกเขาถึงเลือกมัน
(หมายเหตุ: ฉันรู้ว่าบางคนมีความเห็นว่าการกำหนดไม่ควรใช้
=
และ++
และ+=
ไม่ได้เป็นผู้ประกอบการที่มีประโยชน์ แต่ข้อบกพร่องการออกแบบให้เพียงสมมติผมมีความสุขกับพวกเขาและมุ่งเน้นไปที่ว่าทำไมพวกเขาจะไม่ขยายไป bools)
this.dataSource.trackedObject.currentValue.booleanFlag ^= 1;
*= -1
^= true
void Flip(bool& Flag) { Flag=!Flag; }
การแสดงออกของคุณสั้นลง