Jest to więc bardziej teoretyczne pytanie. C ++ i języki (in) bezpośrednio na nim oparte (Java, C #, PHP) mają operatory skrótów do przypisywania wyniku większości operatorów binarnych do pierwszego operandu, takie jak
a += 3; // for a = a + 3
a *= 3; // for a = a * 3;
a <<= 3; // for a = a << 3;
ale kiedy chcę zmienić wyrażenie boolowskie, zawsze piszę coś takiego
a = !a;
co staje się irytujące, gdy a
jest to długie wyrażenie.
this.dataSource.trackedObject.currentValue.booleanFlag =
!this.dataSource.trackedObject.currentValue.booleanFlag;
(tak, prawo Demeter, wiem).
Zastanawiałem się więc, czy istnieje język z jednoargumentowym operatorem przełączania typu boolean , który pozwoliłby mi skrócić a = !a
bez powtarzania wyrażenia a
, na przykład
!=a;
// or
a!!;
Załóżmy, że nasz język ma odpowiedni typ boolowski (jak bool
w C ++) i to a
jest tego typu (więc nie ma stylu C int a = TRUE
).
Jeśli możesz znaleźć udokumentowane źródło, chciałbym się również dowiedzieć, czy np. Projektanci C ++ rozważali dodanie takiego operatora, kiedy bool
stał się typem wbudowanym, a jeśli tak, to dlaczego zdecydowali się na nie.
(Uwaga: Wiem, że niektórzy ludzie są zdania, że zadanie nie należy używać
=
i że ++
i +=
nie są użyteczne, ale operatorzy wady projektowe; niech tylko zakładać, że jestem zadowolony z nich i skupić się dlaczego oni nie rozciąga się bools).
this.dataSource.trackedObject.currentValue.booleanFlag ^= 1;
*= -1
jednak, co z jakiegoś powodu wydaje mi się bardziej intuicyjne niż ^= true
.
void Flip(bool& Flag) { Flag=!Flag; }
Skraca twoje długie wyrażenie.