if-abfragen mit mehreren vergleichen..

#915979
Lesenswert?

Andreas Kaiser wrote:

> Spätestens bei
>    if ((b != 0) & (a / b == 1))
> wird der Unterschied zwischen "&" und "&&" wichtig.

Nö, auch da sind "&" und "&&" praktisch äquivalent.
Wichtig wird es, wenn einer der Operanten auch größer als 1 sein kann 
(z.B. "if (a && b)"), oder der rechte Operant einen Seiteneffekt hat.
#915987
Lesenswert?

Stefan Ernst wrote:

>>    if ((b != 0) & (a / b == 1))
>
> Nö, auch da sind "&" und "&&" praktisch äquivalent.

Interessant. Kannte ich bisher anders. Bei "&" werden beide Seiten 
berechnet, also wird bei b==0 seelenruhig durch 0 dividiert, was dem 
Programm ein jähes Ende bereiten kann. Bei "&&" ist sichergestellt, dass 
die rechte Seite nur berechnet wird, wenn die linke Seite zutrifft.

> oder der rechte Operant einen Seiteneffekt hat.

Eben. Er hat.
Gast #916001
Lesenswert?

Aus dem Gesetzbuch:

  "Unlike the bitwise binary & operator, the && operator guarantees
  left-to-right evaluation; there is a sequence point after the
  evaluation of the first operand. If the first operand compares equal
  to 0, the second operand is not evaluated."

Auch wenn der rechte Operand keinen Seiteneffekt hat, ist das && meist
vorzuziehen, weil es fast immer Rechenzeit einspart. Außerdem dient es
der Lesbarkeit, wenn man durch die Wahl des Operators ausdrückt, ob
eine logische oder eine bitweise Operation gemacht wird.
#916004
Lesenswert?

yalu wrote:

> Auch wenn der rechte Operand keinen Seiteneffekt hat, ist das && meist
> vorzuziehen, weil es fast immer Rechenzeit einspart.

Bei Controllern stimmt das. Bei PC-Prozessoren kann das auch andersrum 
ausgehen, je nachdem wie gut sich die bei "&&" verwendeten Sprungbefehle 
vorhersagen lassen.
Gast #916028
Lesenswert?

Da sehe ich gerade, dass der GCC, wenn möglich, das & wie ein &&
behandelt, es sei denn, der rechte Operand hat einen definierten
Seiteneffekt. Da a/b keinen (für b!=0) oder einen undefinierten (für
b==0) Seiteneffekt hat, wird sogar hier die &&-Variante genommen.
Gast #916240
Lesenswert?

Ich kann aus meiner Erfahrung nur empfehlen, möglichst immer Klammern zu 
schreiben. Dies dient der besseren Lesbarkeit / Verständnis des Codes 
und verhindert damit komische Fehler, die im Nachhinein fast nicht mehr 
gefunden werden können, da sie rasch übersehen werden.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren