Prüfung mehrer Bedingungen gleichzeitig in if Abfrage
-
Hallo,
ich möchte mit einer Prüfung mehrer Bedingungen in einer if Abfrage auswerten.
Kann man z.B. diese Langformif (var!=bed1 && var!=bed2 && var!=bed3) { }
auch so zusammenfassen:
if (var != (bed1 || bed2 || bed3)) { }
Sprich auf einmal mehrere Bedingungen ausschließen und den Code hinter der if Abfrage nur ausführen wenn keine der Bedingungen zutrifft.
var wäre in meinem Beispiel eine int Variablen und die Bedingungen Konstanten deren Wert in var stehen kann.Danke für eure Antworten!
-
Geht nicht.
-
Nein, kannst du nicht - deine "Kurzform" kombiniert deine Konstanten zu einem (boolean) Wert, mit dem du dann die Variable vergleichst.
(in C++ könnte man eventuell sowas per operator-Überladung hinbiegen :D)
-
Man könnte sich höchstens Hilfsfunktionen schreiben.
bool int_in_2(int x, int e1, int e2); bool int_in_3(int x, int e1, int e2, int e3); bool int_in_4(int x, int e1, int e2, int e3, int e4); //... if (int_in_3(var, bed1, bed2, bed3))
Natürlich verschiebst du das "komplizierte if" dadurch nur in die entsprechenden Funktionen. Fraglich ob das den Code "besser" macht.
-
Man könnte zumindest die gesetzten Bits zusammenzählen und mit der erforderlichen Summe vergleichen.
Also stattor ax,ax jnz or bx,bx jnz or cx,cx jnz
das hier:
add ax,bx add ax,cx cmp ax,3 jnz
Guck mal im Debugger und im Hexcode, was dein Compiler aus den oben genannten C-Code Beispielen macht, eventuell kannst du den entsprechenden Teil im Hexeditor austauschen.
-
Na, ob das so eine gute Idee ist, C-Code durch Assemblersequenzen zu ersetzen, um Schreibarbeit zu sparen?
-
Wenn es um syntaktischen Zucker geht, Boost hat eine Bibliothek für Präprozessor-Metaprogrammierung (Boost.Preprocessor), mit der man etwas vergleichbares zusammenschustern kann. Beispielsweise
#include <boost/preprocessor/seq.hpp> #include <stdio.h> #define AND_IS_UNEQUAL(unused, data, elem) && ((data) != (elem)) #define IS_NONE_OF(needle, sequence) 1 BOOST_PP_SEQ_FOR_EACH(AND_IS_UNEQUAL, needle, sequence) int main(void) { /* IS_NONE_OF(0, (1)(2)(3)) expandiert zu 1 && ((0) != (1)) && ((0) != (2)) && ((0) != (3) */ if(IS_NONE_OF(0, (1)(2)(3))) { puts("foo"); } return 0; }