if-anweisung vereinfachen?



  • Tag.
    Hab hier folgende if-Anweisung:

    int a[DIM];
    //...
    if(i<DIM)
    {
       if (a[i]==0)
       {
    //...
       }
    }
    

    Kann man diese 2 Anweisungen irgendwie zusammenfassen, so in etwa, dass der zweite Teil gar nicht mehr überprüft wird, wenn der erste Teil (also i<DIM) schon nicht erfüllt ist?



  • &&



  • Leider bin ich mir nicht sicher wie c++ das handhabt, in Pascal wars aber so, dass, wenn 2 Bedingungen mit and verknuepft waren, die 2. nicht ueberprueft wurde, wenn die erste schon falsch war. Daher konnte man halt das sichern, dass der index sich im gewuenschten Berreich (also zwischen 0 und arraygroesse-1) befindet UND dann eine Ueberpruefung des arrayinhalts an diesem Index in einer if Anweisung zusammen haben.

    wuerds gehen waers also ganz banal:

    if(i<DIM && a[i]==0)
    

    Solltest du das schon ausprobiert habe tuts mir leid.



  • Nennt sich "Kurzschlussoperator" und ist auch in C++ so gelöst 😉

    if (a != 0 && a->something()) ...
    


  • Ist dieser Kurzschlussoperator schon länger in C implementiert?



  • Das zumindest schon in C89 so gewesen.

    Greetz



  • Nennt sich "Kurzschlussoperator" und ist auch in C++ so gelöst 😉

    if (a != 0 && a->something()) ...
    

    vielleicht wäre

    if ( (a != 0) && (a->something()) ) ...
    

    besser, so sieht man schneller was du machst und man macht weniger leichtsinnsfehler



  • Stelfer schrieb:

    if ( (a != 0) && (a->something()) ) ...
    

    besser, so sieht man schneller was du machst und man macht weniger leichtsinnsfehler

    Kannst Du das begründen?
    Also ich sehe dort nur ein paar mehr Klammern, die mir persönlich mehr Übersicht rauben als schenken. (Dass && einen niedrigeren Rang als != und -> hat, versteht sich eigentlich von selbst, oder?)



  • Stelfer schrieb:

    if ( (a != 0) && (a->something()) ) ...
    

    besser, so sieht man schneller was du machst und man macht weniger leichtsinnsfehler

    ich find's übersichtlicher wenn man noch weniger schreibt

    if (a && a->something())
    {
      // hat geklappt
    }
    

    eigentlich sollte auch das gehen:

    if (a & a->something())
    {
      // hat geklappt
    }
    

    aber das sieht dann doch komisch aus...



  • kurze Frage schrieb:

    Ist dieser Kurzschlussoperator schon länger in C implementiert?

    Nur etwas mehr als 30 Jahre 😉



  • net schrieb:

    eigentlich sollte auch das gehen:

    if (a & a->something())
    

    Warum sollte das gehen?



  • Bashar schrieb:

    net schrieb:

    eigentlich sollte auch das gehen:

    if (a & a->something())
    

    Warum sollte das gehen?

    geht's nicht?
    könnte es sein dass das 'a->something()' manchmal zuerst drankommt?
    hab's nicht ausprobiert...



  • Bei & werden beide Operationen ausgeführt, da es sich um ein bitweises UND handelt. & wird strikt und && wird logisch (nicht-strikt/verkürzt) ausgewertet.

    Greetz



  • Vellas schrieb:

    Bei & werden beide Operationen ausgeführt, da es sich um ein bitweises UND handelt.

    das ist kein grund.
    wenn der erste schon 0 ist, könnte er folgende operanden ja überspringen.
    ich glaub' eher die reihenfolge von &-verknüpfungen ist nicht festgelegt, bei && aber schon (von links nach rechts).



  • net schrieb:

    Bashar schrieb:

    net schrieb:

    eigentlich sollte auch das gehen:

    if (a & a->something())
    

    Warum sollte das gehen?

    geht's nicht?
    könnte es sein dass das 'a->something()' manchmal zuerst drankommt?
    hab's nicht ausprobiert...

    a ist 0xAA und a->something() ist 0x55.



  • TactX schrieb:

    a ist 0xAA und a->something() ist 0x55.

    auch schlimm 😞



  • net schrieb:

    das ist kein grund.

    Bei einem bitweisen & werden zwei Zahlen in die CPU geworfen und verknüpft (jedenfalls bei gängigen Architekturen). Da kommt die Bewertung "ist links bereits false" nicht mehr in Betracht. Beide Ausdrücke müssen zum Verknüpfungszeitpunkt feststehen.

    Da die Operanden einer binären Verknüpfung zudem nicht boolsch sind, wäre "ist false" noch dazu ein Spezialfall, nämlich dass alle Bits 0 sind.



  • ja, ich seh's ja ein. ich bin manchmal einfach zu doof um c zu kapieren 😞


Anmelden zum Antworten