Ich möchte nur einen Booleschen Wert umdrehen, basierend auf dem, was er bereits ist. Wenn es wahr ist - mach es falsch. Wenn es falsch ist - mach es wahr.
Hier ist mein Code-Auszug:
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.
quelle
quelle
Natürlich brauchen Sie ein Fabrikmuster!
: D.
quelle
Wenn Sie wissen, dass die Werte 0 oder 1 sind, können Sie dies tun
flipval ^= 1
.quelle
^
ist der Exklusiv- oder Operator.0^1
ist1
und1^1
ist0
. Dies entspricht dem Hinzufügen, wenn Sie das Übertragsbit ignorieren. Oder Sie können sich das so vorstellen: Wenn eines der Bits 1 ist, ist das Ergebnis die Umkehrung des anderen Bits. Oder Sie können sich vorstellen, die Frage zu stellen: Sind diese beiden Bits unterschiedlich?Die einfachste Lösung, die ich gefunden habe:
quelle
x = !x;
ist nicht nur kürzer, sondern auch besser lesbar.longVariableName ^= true;
deutlich kürzer ist alslongVariableName = !longVariableName;
Und jeder Programmierer sollte XOR kennen.a ^= b
bedeuteta = a ^ b
, wo^
bedeutet XOR. Die Notationa °= b
füra = a ° b
jeden Operator°
ist in der C / C ++ / C # -Syntax sehr verbreitet.gRackWidget->modules->first().lights[PATTERN1_LIGHT + i].value = !gRackWidget->modules->first().lights[PATTERN1_LIGHT + i].value;
gestoßen. Natürlich ist es am saubersten, sie auf mehrere Zeilen zu erweitern und temporäre Variablen zum Speichern der Objekte zu verwenden. Sie ist jedochgRackWidget->modules->first().lights[PATTERN1_LIGHT + i].value ^= 1
viel besser lesbar, weniger fehleranfällig und weniger Zeichen als der ursprüngliche Code .Nur zur Information - wenn Ihr erforderliches Feld anstelle einer Ganzzahl ein einzelnes Bit innerhalb eines größeren Typs ist, verwenden Sie stattdessen den Operator 'xor':
quelle
Dies scheint ein Alleskönner zu sein ... Heh. Hier ist eine weitere Variante, die meiner Meinung nach eher in der Kategorie "clever" liegt als etwas, das ich für den Produktionscode empfehlen würde:
Ich denke, die Vorteile sind:
Und ein ebenso offensichtlicher Nachteil ist
Dies kommt der Lösung von @ korona mit ?: Nahe, geht aber noch einen (kleinen) Schritt weiter.
quelle
Nur weil meine Lieblingsmethode zum Umschalten eines Bools nicht aufgeführt ist ...
funktioniert auch. :) :)
(ja das
x = !x;
ist klarer und leichter zu lesen)quelle
Die Codegolf-Lösung wäre eher wie folgt:
quelle
Ich bevorzuge die Lösung von John T, aber wenn Sie nur Code-Golf spielen möchten, reduziert sich Ihre Aussage logischerweise auf Folgendes:
quelle
Gleiches gilt für
quelle
Natürlich benötigen Sie eine flexible Lösung, die Typen unterstützt, die sich als boolesch tarnen. Folgendes ermöglicht dies:
Sie können dies dann auf verschiedene Typen spezialisieren, die sich als boolesch ausgeben. Beispielsweise:
Ein Beispiel für die Verwendung dieses Konstrukts:
Nein, ich meine es nicht ernst.
quelle
Für ganze Zahlen mit den Werten 0 und 1 können Sie Folgendes versuchen:
MWE in C:
quelle
Nur weil ich gerne Code frage. Ich schlage vor, dass Sie das Ternäre auch nutzen können, indem Sie so etwas tun:
Beispiel:
quelle