if-anweisung vereinfachen?



  • 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