C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Zuweisung in if-Ausdruck
Goto page 1, 2, 3, 4  Next
 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Thomas Thiele
Guest





PostPosted: Wed Apr 12, 2006 1:59 pm    Post subject: Zuweisung in if-Ausdruck Reply with quote



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





PostPosted: Wed Apr 12, 2006 8:06 pm    Post subject: Re: Zuweisung in if-Ausdruck Reply with quote



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





PostPosted: Wed Apr 12, 2006 11:06 pm    Post subject: Re: Zuweisung in if-Ausdruck Reply with quote



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





PostPosted: Wed Apr 12, 2006 11:06 pm    Post subject: Re: Zuweisung in if-Ausdruck Reply with quote

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





PostPosted: Thu Apr 13, 2006 7:06 am    Post subject: Re: Zuweisung in if-Ausdruck Reply with quote

"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





PostPosted: Thu Apr 13, 2006 3:06 pm    Post subject: Re: Zuweisung in if-Ausdruck Reply with quote

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





PostPosted: Thu Apr 13, 2006 4:01 pm    Post subject: Re: Zuweisung in if-Ausdruck Reply with quote

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





PostPosted: Thu Apr 13, 2006 5:40 pm    Post subject: Re: Zuweisung in if-Ausdruck Reply with quote

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





PostPosted: Fri Apr 14, 2006 5:20 am    Post subject: Re: Zuweisung in if-Ausdruck Reply with quote

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





PostPosted: Sun Apr 16, 2006 4:07 pm    Post subject: Re: Zuweisung in if-Ausdruck Reply with quote

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





PostPosted: Sun Apr 16, 2006 8:06 pm    Post subject: Re: Zuweisung in if-Ausdruck Reply with quote

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





PostPosted: Sun Apr 16, 2006 9:06 pm    Post subject: Re: Zuweisung in if-Ausdruck Reply with quote

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





PostPosted: Sun Apr 16, 2006 10:33 pm    Post subject: Re: Zuweisung in if-Ausdruck Reply with quote

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





PostPosted: Mon Apr 17, 2006 12:06 pm    Post subject: Re: Zuweisung in if-Ausdruck Reply with quote

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





PostPosted: Mon Apr 17, 2006 1:06 pm    Post subject: Re: Zuweisung in if-Ausdruck Reply with quote

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 Smile

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;" Cool.

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
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Goto page 1, 2, 3, 4  Next
Page 1 of 4

 
Jump to:  
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


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.