Mailinglist Archive: opensuse-programming-de (184 mails)
| < Previous | Next > |
Re: Gleitkomma-Ausnahme
- From: Christoph Maurer <christoph-maurer@xxxxxx>
- Date: Thu, 2 Oct 2003 12:16:38 +0200
- Message-id: <20031002101637.GL4250@xxxxxxxxxxxxxxxxxxxxxxxxxx>
* Am Don, 02 Okt 2003 schrieb Albert Scholl:
> Hallo.
>
> am Donnerstag, 2. Oktober 2003 um 10:22 kam u.a. folgendes:
>
> > * Am Don, 02 Okt 2003 schrieb Ulrich Walter:
> >> Am Donnerstag, 2. Oktober 2003 09:12 schrieb Christoph Maurer:
> >>
> >> >
> >> > if ( a > 0 && b/a < 2 && b%a != 0) ...
> >> ^^^
> >> Hier steht dann 0/0, und das ist zumindest in der Mathematik
> >> ein unbestimmter Ausdruck...
> >>
>
> > Ja, aber das sollte doch gar nicht mehr ausgewertet werden, da ich
> > vorher auf a>0 abfrage...
>
> > Das ist exakt der Punkt, den ich nicht verstehe!
>
> Wieso sollte der Ausdruck unbedingt von links nach rechts abgearbeitet
> werden?
> Es gab in einer Newsgroup in der ich mitlese vor ein paar Monaten mal
> eine Diskussion zu dem Thema - die Reihenfolge kann völlig verschieden
> sein und ist glaube ich vom Compiler abhängig.
>
> Richtig wäre:
>
> if ( a > 0 ) {
> if ( b/a < 2 && b%a != 0) {
> ...
> }
> }
In B. Stroustroups "Die C++-Programmiersprache" steht:
"Die Operatoren Komma (,), logisches Und (&&) und logisches Oder
(&&) garantieren, dass ihr linker Operand vor ihrem Rechten
ausgewertet wird." Es wird dann weiter erläutert, dass insbesonder
der rechts von && stehende Teil nur ausgewertet wird, wenn der linke
true ergibt.
Das scheint mir dann im gcc evtl. nicht so implementiert zu sein...
Gruß
Christoph
--
Christoph Maurer - Tux#194235 - christoph-maurer at gmx.de
> Hallo.
>
> am Donnerstag, 2. Oktober 2003 um 10:22 kam u.a. folgendes:
>
> > * Am Don, 02 Okt 2003 schrieb Ulrich Walter:
> >> Am Donnerstag, 2. Oktober 2003 09:12 schrieb Christoph Maurer:
> >>
> >> >
> >> > if ( a > 0 && b/a < 2 && b%a != 0) ...
> >> ^^^
> >> Hier steht dann 0/0, und das ist zumindest in der Mathematik
> >> ein unbestimmter Ausdruck...
> >>
>
> > Ja, aber das sollte doch gar nicht mehr ausgewertet werden, da ich
> > vorher auf a>0 abfrage...
>
> > Das ist exakt der Punkt, den ich nicht verstehe!
>
> Wieso sollte der Ausdruck unbedingt von links nach rechts abgearbeitet
> werden?
> Es gab in einer Newsgroup in der ich mitlese vor ein paar Monaten mal
> eine Diskussion zu dem Thema - die Reihenfolge kann völlig verschieden
> sein und ist glaube ich vom Compiler abhängig.
>
> Richtig wäre:
>
> if ( a > 0 ) {
> if ( b/a < 2 && b%a != 0) {
> ...
> }
> }
In B. Stroustroups "Die C++-Programmiersprache" steht:
"Die Operatoren Komma (,), logisches Und (&&) und logisches Oder
(&&) garantieren, dass ihr linker Operand vor ihrem Rechten
ausgewertet wird." Es wird dann weiter erläutert, dass insbesonder
der rechts von && stehende Teil nur ausgewertet wird, wenn der linke
true ergibt.
Das scheint mir dann im gcc evtl. nicht so implementiert zu sein...
Gruß
Christoph
--
Christoph Maurer - Tux#194235 - christoph-maurer at gmx.de
| < Previous | Next > |