Jadi ini lebih merupakan pertanyaan teoretis. C ++ dan bahasa (dalam) langsung berdasarkan itu (Java, C #, PHP) memiliki operator pintas untuk menetapkan hasil dari sebagian besar operator biner ke operan pertama, seperti
a += 3; // for a = a + 3
a *= 3; // for a = a * 3;
a <<= 3; // for a = a << 3;
tetapi ketika saya ingin beralih ekspresi boolean saya selalu menemukan diri saya menulis sesuatu seperti
a = !a;
yang menjadi menjengkelkan ketika a
ekspresi panjang seperti.
this.dataSource.trackedObject.currentValue.booleanFlag =
!this.dataSource.trackedObject.currentValue.booleanFlag;
(Ya, Hukum Demeter, saya tahu).
Jadi saya bertanya-tanya, apakah ada bahasa dengan operator toggle boolean unary yang akan memungkinkan saya untuk menyingkat a = !a
tanpa mengulangi ungkapan untuk a
, misalnya
!=a;
// or
a!!;
Mari kita asumsikan bahwa bahasa kita memiliki tipe boolean yang tepat (seperti bool
dalam C ++) dan itu a
adalah tipe itu (jadi tidak ada gaya-C int a = TRUE
).
Jika Anda dapat menemukan sumber yang terdokumentasi, saya juga akan tertarik untuk mengetahui apakah mis. Perancang C ++ telah mempertimbangkan untuk menambahkan operator seperti itu ketika bool
menjadi tipe bawaan dan jika demikian, mengapa mereka memutuskan untuk tidak melakukannya.
(Catatan: Saya tahu bahwa beberapa orang berpendapat bahwa penugasan tidak boleh digunakan
=
dan bahwa ++
dan +=
bukan operator yang berguna tetapi kelemahan desain; mari kita asumsikan saya senang dengan mereka dan fokus pada mengapa mereka tidak meluas ke bools).
this.dataSource.trackedObject.currentValue.booleanFlag ^= 1;
*= -1
meskipun, yang karena alasan tertentu saya menemukan lebih intuitif daripada ^= true
.
void Flip(bool& Flag) { Flag=!Flag; }
, mempersingkat ekspresi panjang Anda.