Hallo,
dieses Proggy: if(printf("This compiler does ")||printf("not ")) printf("shorten logical expressions.\n"); hat diesen Output: This compiler does shorten logical expressions. (das "not" fehlt) Wenn man mit G++ und Klassen arbeitet wird die Reihenfolge umgekehrt bei int bleibt es wie oben.
Frage: kennt jemand Optionen, die die Reihenfolge des ||-Operators beeinflussen (g++) bzw. erzwingen, dass beide Operanden ausgefuehrt werden (gcc und g++).
Konrad
Konrad Rosenbaum wrote:
(das "not" fehlt) Wenn man mit G++ und Klassen arbeitet wird die Reihenfolge umgekehrt bei int bleibt es wie oben.
Frage: kennt jemand Optionen, die die Reihenfolge des ||-Operators beeinflussen (g++) bzw. erzwingen, dass beide Operanden ausgefuehrt werden (gcc und g++).
Meinst Du, daß bei ( x||y ) erst y und dann x ausgewertet wird? Wäre das nicht gegen alle Regeln? (Ich denke schon.) Hast Du ein Beispiel mit Klassen?
Uli
Am Fre, 07 Jan 2000 schrieb Ulrich Küttler:
Meinst Du, daß bei ( x||y ) erst y und dann x ausgewertet wird? Wäre das nicht gegen alle Regeln? (Ich denke schon.)
Welche Regeln ? Es gibt nur Standards und keine Regeln. Und im C-Standard steht nicht drin was zuerst ausgewertet werden soll. Warum auch, es spielt ja (normalerweise) keine Rolle. Beim ANSI-C++-Standard bin ich mir da nicht so sicher.
In welcher Reihenfolge z.B. Ausdrücke ausgewertet werden ist auch nicht festgelegt, warum auch, ist ja schließlich egal.
z.B: x = (a*b)+(c*d);
Was wird zuerst ausgerechnet ? (a*b) oder (c*d) ?
Das ist Compilerabhängig ! AFAIK rollen die Compiler die Sache meistens von hinten auf, also (c*d).
Daß es Unterschiede beim gcc und g++ gibt ist ein bißchen blöd, wer aber guten, portablen C/C++-Code schreibt, dem kann das auch egal sein.
Bye, Stephan
Stephan Goetter wrote:
Am Fre, 07 Jan 2000 schrieb Ulrich Küttler:
Meinst Du, daß bei ( x||y ) erst y und dann x ausgewertet wird? Wäre das nicht gegen alle Regeln? (Ich denke schon.)
Welche Regeln ? Es gibt nur Standards und keine Regeln. Und im C-Standard steht nicht drin was zuerst ausgewertet werden soll. Warum auch, es spielt ja (normalerweise) keine Rolle. Beim ANSI-C++-Standard bin ich mir da nicht so sicher.
In welcher Reihenfolge z.B. Ausdrücke ausgewertet werden ist auch nicht festgelegt, warum auch, ist ja schließlich egal.
Nicht ganz! Bei C++ ist es festgelegt. Und manchmal spielt es auch eine Rolle. (Wegen der Seiteneffekte.) Nicht festgelegt ist (IMHO) nur die Reihenfolge, in der die Argumente beim Funktionsaufruf ausgewertet werden.
Gerade Operatorer wie && und || werden ja nur solang ausgewertet, bis der Wert es Ausdrucks feststeht.
Uli
On Tue, Jan 04, 2000 at 05:55:26PM +0100, Konrad Rosenbaum wrote:
Hallo,
dieses Proggy: if(printf("This compiler does ")||printf("not ")) printf("shorten logical expressions.\n"); hat diesen Output: This compiler does shorten logical expressions. (das "not" fehlt) Wenn man mit G++ und Klassen arbeitet wird die Reihenfolge umgekehrt bei int bleibt es wie oben.
Frage: kennt jemand Optionen, die die Reihenfolge des ||-Operators beeinflussen (g++) bzw. erzwingen, dass beide Operanden ausgefuehrt werden (gcc und g++).
Wird es nicht geben. Du musst beide explizit evaluieren, da laut C-Standard bei || und && nur ausgewertet wird, soweit es nötig ist.
Kannst du mal ein Beispiel bringen, wo das bei "g++ und Klassen" anders sein soll, also sozusagen || von rechts her ausgewertet wird. Ich kann mir sowas nicht vorstellen.
Reinhard
On Sat, 8 Jan 2000, Reinhard Foerster wrote:
On Tue, Jan 04, 2000 at 05:55:26PM +0100, Konrad Rosenbaum wrote:
[cut]
Wird es nicht geben. Du musst beide explizit evaluieren, da laut C-Standard bei || und && nur ausgewertet wird, soweit es nötig ist.
Kannst du mal ein Beispiel bringen, wo das bei "g++ und Klassen" anders sein soll, also sozusagen || von rechts her ausgewertet wird. Ich kann mir sowas nicht vorstellen.
das Proggy ist im Attachment. Der Output war bei mir: not This compiler does shorten logical expressions. ^^^^ man beachte das "not" am Anfang. Ab Compiler-Flag -O3 sieht es uebrigens so aus: This compiler does not shorten logical expressions. und selbst -O6 kuerzt noch nicht ab. Was auch verstaendlich ist, es duerfte etwas schwierig sein die Seiteneffekte selbstgebastelter Operatoren abzusehen.
Vielleicht sollte man dem egcs Team mal den Vorschlag machen sowas leichter steuerbar zu gestalten. Ich kenne zuviele Algorithmen, die auf bestimmten Reihenfolgen und Verhaltensweisen basieren, einige Leute nennen soeinen Stil "raffiniert" - zugegeben, oft gehoere ich auch dazu.
Konrad
lug-dd@mailman.schlittermann.de