Vì vậy, đây là nhiều hơn một câu hỏi lý thuyết. C ++ và các ngôn ngữ (in) trực tiếp dựa trên nó (Java, C #, PHP) có các toán tử phím tắt để gán kết quả của hầu hết các toán tử nhị phân cho toán hạng đầu tiên, chẳng hạn như
a += 3; // for a = a + 3
a *= 3; // for a = a * 3;
a <<= 3; // for a = a << 3;
nhưng khi tôi muốn chuyển đổi một biểu thức boolean, tôi luôn thấy mình viết một cái gì đó như
a = !a;
Điều này gây khó chịu khi a
một biểu hiện dài như thế nào.
this.dataSource.trackedObject.currentValue.booleanFlag =
!this.dataSource.trackedObject.currentValue.booleanFlag;
(vâng, Luật của Demeter, tôi biết).
Vì vậy, tôi đã tự hỏi, có ngôn ngữ nào với toán tử chuyển đổi boolean unary sẽ cho phép tôi viết tắt a = !a
mà không lặp lại biểu thức cho a
, ví dụ
!=a;
// or
a!!;
Giả sử rằng ngôn ngữ của chúng ta có loại boolean thích hợp (như bool
trong C ++) và đó a
là loại đó (vì vậy không có kiểu C int a = TRUE
).
Nếu bạn có thể tìm thấy một nguồn tài liệu, tôi cũng muốn tìm hiểu xem, ví dụ như các nhà thiết kế C ++ đã xem xét việc thêm một toán tử như thế khi bool
trở thành một loại tích hợp và nếu vậy, tại sao họ lại quyết định chống lại nó.
(Lưu ý: Tôi biết rằng một số người có quan điểm rằng việc chuyển nhượng không nên sử dụng
=
và điều đó ++
và +=
không phải là các nhà khai thác hữu ích nhưng lỗi trong thiết kế; chúng ta hãy chỉ giả sử tôi đang hạnh phúc với họ và tập trung vào lý do tại sao họ sẽ không mở rộng đến bools).
this.dataSource.trackedObject.currentValue.booleanFlag ^= 1;
*= -1
, mặc dù vậy, vì một số lý do tôi thấy trực quan hơn ^= true
.
void Flip(bool& Flag) { Flag=!Flag; }
Việc rút ngắn biểu thức dài của bạn.