Mehrfache ODER-Abfrage



  • Hallo,

    Ich konnte leider nichts im Internet finden, deswegen wende ich mich an euch.

    Die Frage: Geht das so?

    if( Index != (1 || 9 || 17) ){
    

    Oder muss ich das wirklich separat so machen?

    if( (Index != 1) || (Index != 9) || (Index != 17) ){
    

    Bzw anders: Gibt es noch einen anderen Weg, der evtl. eleganter ist?

    Dankeschoen
    der Hannes



  • du wirst es in der langen Form schreiben müssen, auch, wenn der Code, den du gepostet hast sicherlich nicht das macht, was du gerne hättest.

    if( (Index != 1) || (Index != 9) || (Index != 17) ){
    

    ist immer wahr, denn selbst wenn Index eine der drei Zahlen ist, so würden die anderen Teilbedingungen trotzdem noch wahr.

    du meinst sicherlich eher:

    if( (Index != 1) && (Index != 9) && (Index != 17) ){
    

    Diese Bedingung ist nur wahr, wenn Index keine der drei Zahlen ist.

    Eine etwas ungewohnte, aber sicherlich auch mögliche Schreibweise wäre diese:

    switch (Index)
    {
        1:
        9:
        17: break;
        default:
        {
            // Hier der Code
        }
    }
    

    Aber leserlicher wird der Code dadurch sicher nicht^^



  • DrakoXP schrieb:

    Aber leserlicher wird der Code dadurch sicher nicht^^

    Kommt halt drauf an, wenn man so ~25 verschiedene Zahlen ausschließen möchte finde ich das gar nicht mal so schlecht. 😃



  • Sehe ich auch so ... ein switch-Konstrukt war das Erste, was mir nach Lesen des Eingangspostings einfiel.



  • Warscheinlich ist if(Index%8!=1) gemeint.



  • Schneller dürfte es auch werden mit:

    if( !(Index&1) || (Index != 1) || (Index != 9) || (Index != 17) ){
    


  • Wutz, deine if-Bedingung ist genau wie die vom TS immer wahr...
    also effizienter wäre dann doch (wenn man das tatsächlich so will)

    if (true) {
    

  • Mod

    DrakoXP schrieb:

    Wutz, deine if-Bedingung ist genau wie die vom TS immer wahr...
    also effizienter wäre dann doch (wenn man das tatsächlich so will)

    Kleiner aber feiner Unterschied: Wutz prüft zuerst, ob die Zahl gerade ist (!(Index&1)). Ist dies der Fall, werden die anderen Bedingungen gar nicht erst angeguckt. Falls Index gerade sein sollte, spart man so 2 unnötige Vergleiche, bei ungeraden Zahlen hat man einen Vergleich mehr. Falls Index gleichverteilt ist, dann gewinnt man im Schnitt.



  • Was ist da falsch?

    #include <stdio.h>
    
    int main(void)
    {
      int Index;
      for(Index=0;Index<20;++Index)
        if( !(Index&1) || (Index != 1) || (Index != 9) || (Index != 17) )
          printf("%d wahr\n", Index);
        else
          printf("%d unwahr\n", Index);
    
      return 0;
    }
    

    ergibt

    0 wahr
    1 wahr
    2 wahr
    3 wahr
    4 wahr
    5 wahr
    6 wahr
    7 wahr
    8 wahr
    9 wahr
    10 wahr
    11 wahr
    12 wahr
    13 wahr
    14 wahr
    15 wahr
    16 wahr
    17 wahr
    18 wahr
    19 wahr
    

    http://codepad.org/mQZg1e6V



  • Ja natürlich, man sollte eben nicht fremden Code auch nicht teilweise übernehmen, also:

    if( !(Index&1) || (Index != 1) && (Index != 9) && (Index != 17) ){
    

    sollte dann auch schneller sein und sogar funktionieren.


Anmelden zum Antworten