 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Thomas Thiele Guest
|
Posted: Wed Apr 12, 2006 1:59 pm Post subject: Zuweisung in if-Ausdruck |
|
|
Hallo!
folgender Codeschnipsel:
-------------------------------------
if ( (currtime = util::FileBrowser::getTime(filelist[i])) != 0
&& currtime > lastfiletime
&& (oldestToProcessTime == 0 || currtime <
oldestToProcessTime)
&& util::FileBrowser::isReadable(filelist[i])
)
{
oldestToProcessTime = currtime;
oldestToProcessName = filelist[i];
}
Oben wird currtime bestimmt, danach weiter in Vergleichen benutzt.
Ist garantiert, dass currtime beim Vergleich currtime > lastfiletime
schon gesetzt ist?
Dass die Anweisungen von links nach rechts im Vergleich ausgeführt
werden weiss ich.
Aber wird auch _das_ currtime dann benutzt?
Falls der Standard so denkt wie ich: wie denkt Microsoft Visual C++
6.0?
(auch wenn offtopic, aber vielleicht weiss es ja wer)
Gruß Thomas
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
Stefan Reuther Guest
|
Posted: Wed Apr 12, 2006 8:06 pm Post subject: Re: Zuweisung in if-Ausdruck |
|
|
Thomas Thiele wrote:
| Quote: | if ( (currtime = util::FileBrowser::getTime(filelist[i])) != 0
&& currtime > lastfiletime
[...]
Oben wird currtime bestimmt, danach weiter in Vergleichen benutzt.
Ist garantiert, dass currtime beim Vergleich currtime > lastfiletime
schon gesetzt ist?
|
Ja.
| Quote: | Falls der Standard so denkt wie ich: wie denkt Microsoft Visual C++
6.0?
|
'&&' garantiert, dass die linke Seite vor der rechten Seite ausgewertet
wird. Das ist so, seit es '&&' gibt. Auch Microsoft macht das
normalerweise richtig.
Stefan
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
Thomas Thiele Guest
|
Posted: Wed Apr 12, 2006 11:06 pm Post subject: Re: Zuweisung in if-Ausdruck |
|
|
Stefan Reuther:
| Quote: | '&&' garantiert, dass die linke Seite vor der rechten Seite ausgewertet
wird. Das ist so, seit es '&&' gibt.
|
Ja, darum gehts aber nicht.
Es ist mir klar, dass der _Ausdruck_ auf der linken Seite eher
ausgewertet wird.
Dazu könnte auch noch die Zuweisung gehören.
Wichtig ist ob der Wert für den zweiten Vergleich nicht irgendwie
gecashed wird oder so.
Aber - so habe ich herausgelesen - wohl nicht.
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
Rolf Magnus Guest
|
Posted: Wed Apr 12, 2006 11:06 pm Post subject: Re: Zuweisung in if-Ausdruck |
|
|
Thomas Thiele wrote:
| Quote: | Stefan Reuther:
'&&' garantiert, dass die linke Seite vor der rechten Seite ausgewertet
wird. Das ist so, seit es '&&' gibt.
Ja, darum gehts aber nicht.
Es ist mir klar, dass der _Ausdruck_ auf der linken Seite eher
ausgewertet wird.
Dazu könnte auch noch die Zuweisung gehören.
|
Wieso "könnte"? Sie ist doch das, was links steht.
| Quote: | Wichtig ist ob der Wert für den zweiten Vergleich nicht irgendwie
gecashed wird oder so.
|
Ein && markiert einen Sequenzpunkt, das heißt, daß alle vorherigen
Berechnungen abgeschlossen sein müssen.
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
Thomas Mang Guest
|
Posted: Thu Apr 13, 2006 7:06 am Post subject: Re: Zuweisung in if-Ausdruck |
|
|
"Rolf Magnus" <ramagnus@t-online.de> schrieb im Newsbeitrag
news:e1jv96$bqe$02$1 (AT) news (DOT) t-online.com...
| Quote: | Thomas Thiele wrote:
Stefan Reuther:
'&&' garantiert, dass die linke Seite vor der rechten Seite ausgewertet
wird. Das ist so, seit es '&&' gibt.
Ja, darum gehts aber nicht.
Es ist mir klar, dass der _Ausdruck_ auf der linken Seite eher
ausgewertet wird.
Dazu könnte auch noch die Zuweisung gehören.
Wieso "könnte"? Sie ist doch das, was links steht.
Wichtig ist ob der Wert für den zweiten Vergleich nicht irgendwie
gecashed wird oder so.
Ein && markiert einen Sequenzpunkt, das heißt, daß alle vorherigen
Berechnungen abgeschlossen sein müssen.
|
Solange es der eingebaute operator && ist und nicht irgendjemand
rücksichtsloser ihn für seine eigene Klasse überlädt.
Thomas
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
kanze Guest
|
Posted: Thu Apr 13, 2006 3:06 pm Post subject: Re: Zuweisung in if-Ausdruck |
|
|
Thomas Thiele wrote:
| Quote: | folgender Codeschnipsel:
-------------------------------------
if ( (currtime = util::FileBrowser::getTime(filelist[i])) != 0
&& currtime > lastfiletime
&& (oldestToProcessTime == 0 || currtime
oldestToProcessTime)
&& util::FileBrowser::isReadable(filelist[i])
)
{
oldestToProcessTime = currtime;
oldestToProcessName = filelist[i];
}
Oben wird currtime bestimmt, danach weiter in Vergleichen
benutzt. Ist garantiert, dass currtime beim Vergleich currtime
lastfiletime schon gesetzt ist?
|
Ja.
Es wird auch garantiert, dass bei der Wartung der Programmierer
solche Zuweisungen übersieht, und damit es schwer hat, dein
Programm zu verstehen.
Gibt es einen Grund, warum die Zuweisung nicht vor der
if-Anweisung kommt? Als Initialisierung in der Definition, z.B.
--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
Sebastian Biallas Guest
|
Posted: Thu Apr 13, 2006 4:01 pm Post subject: Re: Zuweisung in if-Ausdruck |
|
|
Thomas Mang wrote:
| Quote: | Solange es der eingebaute operator && ist und nicht irgendjemand
rücksichtsloser ihn für seine eigene Klasse überlädt.
|
&& kann man überladen? OMG
--
Gruß,
Sebastian
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
Thomas Thiele Guest
|
Posted: Thu Apr 13, 2006 5:40 pm Post subject: Re: Zuweisung in if-Ausdruck |
|
|
Rolf Magnus:
| Quote: | Ein && markiert einen Sequenzpunkt, das heißt, daß alle vorherigen
Berechnungen abgeschlossen sein müssen.
|
Danke, das wollte ich nochmal bestätigt haben.
Gruß Thomas
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
Elcaro Nosille Guest
|
Posted: Fri Apr 14, 2006 5:20 am Post subject: Re: Zuweisung in if-Ausdruck |
|
|
| Quote: | Es wird auch garantiert, dass bei der Wartung der Programmierer
solche Zuweisungen übersieht, und damit es schwer hat, dein
Programm zu verstehen.
|
Das passiert nur wenn man sowas nicht gewohnt ist. Wenn
man sowas zwei oder dreimal gesehen hat ist es schon akzeptiert.
| Quote: | Gibt es einen Grund, warum die Zuweisung nicht vor der
if-Anweisung kommt? Als Initialisierung in der Definition, z.B.
|
Ja, gibt es. Der Ausdruck ...
| if( (a = f1()) != 0 &&
| (b = f2()) != 0 )
.... würde dann so aussehen:
| a = f1()
| if( a != 0 )
| {
| b = f2();
| if( b != 0 )
| {
| ...
Ich finde ersteres sehr viel lesbarer.
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
Falk Tannhäuser Guest
|
Posted: Sun Apr 16, 2006 4:07 pm Post subject: Re: Zuweisung in if-Ausdruck |
|
|
Elcaro Nosille wrote:
| Quote: | Gibt es einen Grund, warum die Zuweisung nicht vor der
if-Anweisung kommt? Als Initialisierung in der Definition, z.B.
Ja, gibt es. Der Ausdruck ...
| if( (a = f1()) != 0 &&
| (b = f2()) != 0 )
... würde dann so aussehen:
| a = f1()
| if( a != 0 )
| {
| b = f2();
| if( b != 0 )
| {
| ...
Ich finde ersteres sehr viel lesbarer.
|
Preisfrage: Wieviele Wartungsprogrammierer werden sofort sehen,
dass hier was faul ist im Staate DK:
int a, b;
if( (a = f1()) > 666 &&
(b = f2()) > 42 )
{
maak_wat(a, b);
}else
{
maak_wat_anners(a, b);
}
Da lob ich mir doch:
int a = f1();
int b = f2();
if(a > 666 && b > 42)
{
maak_wat(a, b);
}else
{
maak_wat_anners(a, b);
}
MfG
Falk
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
Torsten Robitzki Guest
|
Posted: Sun Apr 16, 2006 8:06 pm Post subject: Re: Zuweisung in if-Ausdruck |
|
|
Falk Tannhäuser wrote:
| Quote: | Elcaro Nosille wrote:
Gibt es einen Grund, warum die Zuweisung nicht vor der
if-Anweisung kommt? Als Initialisierung in der Definition, z.B.
Ja, gibt es. Der Ausdruck ...
| if( (a = f1()) != 0 &&
| (b = f2()) != 0 )
... würde dann so aussehen:
| a = f1()
| if( a != 0 )
| {
| b = f2();
| if( b != 0 )
| {
| ...
Ich finde ersteres sehr viel lesbarer.
Preisfrage: Wieviele Wartungsprogrammierer werden sofort sehen,
dass hier was faul ist im Staate DK:
int a, b;
if( (a = f1()) > 666 &&
(b = f2()) > 42 )
{
maak_wat(a, b);
}else
{
maak_wat_anners(a, b);
}
Da lob ich mir doch:
int a = f1();
int b = f2();
if(a > 666 && b > 42)
{
maak_wat(a, b);
}else
{
maak_wat_anners(a, b);
}
|
Das ist aber was anderes und ohne die Anforderungen zu kennen, kann man
kaum sagen, das da etwas faul ist. Elcaro hatte ein ganz gutes Beispiel
gebracht finde ich. Das der zweite Operand von && oder || nicht
ausgewertet wird, wenn mit der Auswertung des ersten Operanden bereits
fest steht, muß jeder wissen, wenn er C++ Programme warten möchte.
Ansonsten wird er schon an einfachen Sachen wie p && p->f() scheitern.
Oberes Ziel sollte immer Lesbarkeit sein, aber ich denke nicht, das man
sich da unbedingt an jemanden orientieren sollte, der nur rudimentäre
Sprachkenntnisse hat.
mfg Torsten
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
Stefan Reuther Guest
|
Posted: Sun Apr 16, 2006 9:06 pm Post subject: Re: Zuweisung in if-Ausdruck |
|
|
Falk Tannhäuser wrote:
| Quote: | Preisfrage: Wieviele Wartungsprogrammierer werden sofort sehen,
dass hier was faul ist im Staate DK:
int a, b;
if( (a = f1()) > 666 &&
(b = f2()) > 42 )
{
maak_wat(a, b);
}else
{
maak_wat_anners(a, b);
}
|
Natürlich sollte man bei der Sache sein, wenn man sowas schreibt. Ich
finde Zuweisungen in Bedingungen oft wesentlich lesbarer als die
Äquivalente. Zum Beispiel sowas:
if ((fp = fopen("program.rc", "rb")) != 0
|| (fp = fopen("/etc/program.rc", "rb")) != 0
|| (fp = fopen("/usr/lib/program/defaults", "rb") != 0)
{
/* lies Konfigurationsdatei */
} else {
fprintf(stderr, "unable to find configuration file\n");
exit(1);
}
Oder in C++
if (Derived* d = dynamic_cast<Derived*>(baseptr)) {
// ...
}
Im Gegenteil: die teilweise Auswertung bei logischen Operatoren ist mir
schon derart ins Blut übergegangen, dass ich vor kurzem die Funktion
// Fehler prüfen und beheben; true wenn Fehler gefunden
bool checkAndFixErrors(SomeStruct& s) {
return checkAndFixErrorsOneSide(s.left)
| checkAndFixErrorsOneSide(s.right);
}
so umgebaut habe
// Fehler prüfen und beheben; true wenn Fehler gefunden
bool checkAndFixErrors(SomeStruct& s) {
bool l = checkAndFixErrorsOneSide(s.left);
bool r = checkAndFixErrorsOneSide(s.right);
return l | r;
}
weil das einfach erwartungskonformer ist :)
Stefan
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
Elcaro Nosille Guest
|
Posted: Sun Apr 16, 2006 10:33 pm Post subject: Re: Zuweisung in if-Ausdruck |
|
|
| Quote: | Preisfrage: Wieviele Wartungsprogrammierer werden
sofort sehen, dass hier was faul ist im Staate DK:
|
Ich würde das sehen - reine Gewöhnungssache.
| Quote: |
int a, b;
if( (a = f1()) > 666 &&
(b = f2()) > 42 )
{
maak_wat(a, b);
}else
{
maak_wat_anners(a, b);
}
Da lob ich mir doch:
int a = f1();
int b = f2();
if(a > 666 && b > 42)
{
maak_wat(a, b);
}else
{
maak_wat_anners(a, b);
}
|
Unteres ist nicht mit obigem identisch.
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
Falk Tannhäuser Guest
|
Posted: Mon Apr 17, 2006 12:06 pm Post subject: Re: Zuweisung in if-Ausdruck |
|
|
Elcaro Nosille wrote:
| Quote: | Preisfrage: Wieviele Wartungsprogrammierer werden
sofort sehen, dass hier was faul ist im Staate DK:
Ich würde das sehen - reine Gewöhnungssache.
|
Ich wahrscheinlich auch - bloß eben nicht unbedingt
*sofort* in -zigtausend Zeilen Programmtext...
| Quote: | int a, b;
if( (a = f1()) > 666 &&
(b = f2()) > 42 )
{
maak_wat(a, b);
}else
{
maak_wat_anners(a, b);
}
Da lob ich mir doch:
int a = f1();
int b = f2();
if(a > 666 && b > 42)
{
maak_wat(a, b);
}else
{
maak_wat_anners(a, b);
}
Unteres ist nicht mit obigem identisch.
|
Freilich nicht - drum würde ich es ja gerade vorziehen.
MfG
Falk
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
Falk Tannhäuser Guest
|
Posted: Mon Apr 17, 2006 1:06 pm Post subject: Re: Zuweisung in if-Ausdruck |
|
|
Stefan Reuther wrote:
| Quote: | Natürlich sollte man bei der Sache sein, wenn man sowas schreibt. Ich
finde Zuweisungen in Bedingungen oft wesentlich lesbarer als die
Äquivalente. Zum Beispiel sowas:
if ((fp = fopen("program.rc", "rb")) != 0
|| (fp = fopen("/etc/program.rc", "rb")) != 0
|| (fp = fopen("/usr/lib/program/defaults", "rb") != 0)
{
/* lies Konfigurationsdatei */
} else {
fprintf(stderr, "unable to find configuration file\n");
exit(1);
}
|
Ack. Hier ist ja sichergestellt, dass 'fp' im if-Zweig stets auf
ein gültiges FILE zeigt, und im else-Zweig wird es nicht benutzt
- daher kein Problem.
| Quote: | Oder in C++
if (Derived* d = dynamic_cast<Derived*>(baseptr)) {
// ...
}
|
Auch Ack - diese Benutzung kann ja als idiomatisch gelten und
außerdem lässt sich ja die Deklaration+Initialisierung nicht
mit den logischen Operatoren kombinieren, so dass das in meinem
Beispiel illustrierte Problem (mögliche fehlende Initialisierung
im else-Zweig) nicht auftreten kann.
| Quote: | Im Gegenteil: die teilweise Auswertung bei logischen Operatoren ist mir
schon derart ins Blut übergegangen, dass ich vor kurzem die Funktion
// Fehler prüfen und beheben; true wenn Fehler gefunden
bool checkAndFixErrors(SomeStruct& s) {
return checkAndFixErrorsOneSide(s.left)
| checkAndFixErrorsOneSide(s.right);
}
so umgebaut habe
// Fehler prüfen und beheben; true wenn Fehler gefunden
bool checkAndFixErrors(SomeStruct& s) {
bool l = checkAndFixErrorsOneSide(s.left);
bool r = checkAndFixErrorsOneSide(s.right);
return l | r;
}
weil das einfach erwartungskonformer ist
|
Ich nehme an, dass die Verwendung von '|' an Stelle von '||'
beabsichtigt war, um in der ersten Variante die Auswertung
beider Operanden sicherzustellen. Das hat mir nun doch einen
zu großen "Phreak-" bzw. "Überraschungsfaktor" und ich
bevorzuge die zweite Variante - sähe dort aber trotzdem lieber
"return l || r;" .
MfG
Falk
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|