Chcę tylko odwrócić wartość logiczną na podstawie tego, czym już jest. Jeśli to prawda - zrób to fałszywie. Jeśli to fałsz - uczyń to prawdą.
Oto mój fragment kodu:
switch(wParam) {
case VK_F11:
if (flipVal == true) {
flipVal = false;
} else {
flipVal = true;
}
break;
case VK_F12:
if (otherVal == true) {
otherValVal = false;
} else {
otherVal = true;
}
break;
default:
break;
}
c++
c
boolean
boolean-logic
John T
źródło
źródło
Oczywiście potrzebujesz wzoru fabrycznego!
:RE
źródło
Jeśli wiesz, że wartości to 0 lub 1, możesz to zrobić
flipval ^= 1
.źródło
^
jest operatorem na wyłączność lub .0^1
jest1
i1^1
jest0
. To to samo, co dodawanie, jeśli zignorujesz bit przenoszenia. Lub możesz o tym myśleć tak, jakby - jeśli jeden z bitów ma wartość 1, wynik jest odwrotnością drugiego bitu. Lub możesz o tym myśleć jako o zadawaniu pytania: czy te dwa bity są różne?Najłatwiejsze rozwiązanie, które znalazłem:
źródło
x = !x;
jest nie tylko krótszy, ale także bardziej czytelny.longVariableName ^= true;
Jest wyraźnie krótszy niżlongVariableName = !longVariableName;
I każdy programista powinien znać XOR.a ^= b
oznaczaa = a ^ b
, gdzie^
oznacza XOR. Notacjaa °= b
dlaa = a ° b
dowolnego operatora°
jest bardzo powszechna w składni C / C ++ / C #.gRackWidget->modules->first().lights[PATTERN1_LIGHT + i].value = !gRackWidget->modules->first().lights[PATTERN1_LIGHT + i].value;
Oczywiście najczystszą rzeczą do zrobienia jest rozszerzenie jej na wiele linii i użycie zmiennych tymczasowych do przechowywania obiektów, alegRackWidget->modules->first().lights[PATTERN1_LIGHT + i].value ^= 1
jest dużo bardziej czytelny, mniej podatny na błędy i mniej znaków niż oryginalny kod .Tylko dla informacji - jeśli zamiast liczby całkowitej wymagane pole jest jednym bitem w większym typie, użyj zamiast tego operatora „xor”:
źródło
To wydaje się być darmowe dla wszystkich ... Heh. Oto kolejna odmiana, która, jak sądzę, jest bardziej w kategorii „sprytny” niż coś, co poleciłbym do kodu produkcyjnego:
Myślę, że jego zalety to:
I równie oczywista jest wada
Jest to bliskie rozwiązaniu @ korona używającego?: Ale poszło o jeden (mały) krok dalej.
źródło
Tylko dlatego, że mój ulubiony dziwny sposób na przełączanie bool nie jest wymieniony ...
działa też. :)
(tak,
x = !x;
jest jaśniejszy i łatwiejszy do odczytania)źródło
Codegolf'owe rozwiązanie byłoby bardziej podobne do:
źródło
Wolę rozwiązanie Johna T, ale jeśli chcesz zagrać w kodowanie, twoje stwierdzenie logicznie sprowadza się do tego:
źródło
to samo dotyczy
źródło
Oczywiście potrzebujesz elastycznego rozwiązania, które może obsługiwać typy maskujące jako wartości logiczne. Umożliwia to:
Następnie możesz specjalizować się w tym dla różnych typów, które mogą udawać, że są logiczne. Na przykład:
Przykład użycia tej konstrukcji:
Nie, nie mówię poważnie.
źródło
W przypadku liczb całkowitych o wartościach 0 i 1 możesz spróbować:
MWE w C:
źródło
Tylko dlatego, że lubię kwestionować kod. Proponuję, abyś mógł również skorzystać z trójskładnika, robiąc coś takiego:
Przykład:
źródło