Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Klammern in Ausdrücken - irgendwie riskant?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
25.06.2010, 11:30 Uhr
ao

(Operator)


Hallo zusammen,

wir hatten letztens eine Diskussion. Es ging um zusammengesetzte boolsche Ausdrücke, also etwas in dieser Art:

C++:
if ( (x == 42) || (a * a + b * b <= c * c) && (bitmaske & (1 << 4) != 0))
{
    printf ("Gewonnen!");
}



Wir waren uns einig, dass man durch großzügiges Verteilen von Klammern die Lesbarkeit des Codes deutlich erhöhen kann, besonders für diejenigen Leser, die die Rangfolgetabelle nicht als neuronale Verknüpfung im Großhirn implementiert haben.

Eine Frage blieb offen: Gibts auch Gegenanzeigen, wo Klammernsetzen konkrete Nachteile hat? Kann man dadurch zum Beispiel Fehler verschleiern, ähnlich wie bei unnötigen expliziten Typecasts?

Kennt jemand Beispiele?

Danke schön
ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
04.07.2010, 14:19 Uhr
Hans
Library Walker
(Operator)


Hi,

also Gegenbeispiele kenn ich keine, aber ich hätte Probleme damit, auch mittels Debugger darin einen Fehler zu finden wenn ich true erwarte und es kommt false heraus. Deshalb ziehe ich es vor, solche Ausdrücke zumindest in der Debug-version ungefähr so zu schreiben:

C++:
x = ... ;
hilf1 = a * a + b * b;
hilf2 = c * c;
hilf3 = bitmaske & (1 << 4)
if ( (x == 42) || (hilf1 <= hilf2) && (hilf3) != 0)
{
    printf ("Gewonnen!");
}


D.h. solche langen Ausdrücke weitestgehend zu vermeiden, bzw. die einzelnen Berechnungen vorher zu machen und nur noch deren Ergebnisse zu vergleichen.

Jetzt kann man natürlich einwenden, das man auf Assemblerebene debuggen kann, weil die Ausdrück da auch vorher berechnet werden. Stimmt, aber da kann vom Compiler auch schon jede Menge wegoptimiert worden sein, so das vom ursprünglichen Ausdruck nicht mehr viel übrig ist. (Ich hatte da schon den Fall, das der Compiler einen Ausdruck komplett selbst ausgewertet hat und nur noch das Ergebnis in ein Register geladen und anschliessend printf aufgerufen hat.) Ausserdem kann man nicht von jedem erwarten, Assembler zu können.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
04.07.2010, 15:47 Uhr
0xdeadbeef
Gott
(Operator)


Mit Klammern sollte man ein bisschen vorsichtig sein. Beispielsweise finde ich

C++:
(a * b) + c


weniger lesbar als

C++:
a * b + c


weil man die Klammern hier eher um b + c erwartet.

Bei && und || ist das streitbar. Ich halte es eigentlich für sinnvoller, das ganze über Einrückung, Kommentare und sinnvolle Symbolbenennung zu machen, etwa

C++:
// Interpretiere Gleichung nach FLAG_PYTHAGORAS, wenn c >= Hypothenuse,
// außerdem Sonderbehandlung für die Antwort auf die Frage nach nach Leben,
// dem Universum und dem ganzen Rest.
if (x == 42 ||
    bitmaske & FLAG_PYTHAGORAS && a * a + b * b <= c * c)


Wenn nicht eh auf den ersten Blick klar ist, was du meinst, sind Kommentare oft eine gute Idee.

Riskant könnte das ganze im Zusammenhang mit dem ==-Operator und Tipfeelern werden. Beispielsweise warnt der gcc bei

C++:
if(x = y)


nicht aber bei

C++:
if((x = y))


wenn du jetzt etwa

C++:
if((x = y && y == z) || a == b)


schreibst...
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 04.07.2010 um 15:51 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: