title image


Smiley noch ein (letztes) Mal (genauer)...
Hallo,



ich hoffe mal, daß das die einzige "Ungenauigkeit" in deinem Buch ist, denn wie ich unten schon geschrieben habe, ist das Ergebnis nicht festgelegt. Als "Beweis" habe ich noch ein paar Beispiele anzubieten, die erklären, wie ich den Beitrag unten meinte:



1. http://151.196.11.50/spring2003/intprog/lecture-notes/macros.html:





y = 5;

z = SQR(y++);



What will the value of "z" be?

The expression SQR(y++) will expand into (y++)*(y++). It looks like this should evaluate to 5 * 6 = 30, with "y" having the value of 7 after the expression is evaluated. It turns out that this is not necessarily true.



C and C++ do not define the order of evaluation of arguments and do not define when the side effects from the increment and decrement operations actually take place.

Consider

x = 5;

y = x * x++;

It looks like y should be equal to 25, but it may not be. Different implementations may evaluate the arguments in a different order and the side effect may take place at different times. For example, an implementation might evaluate the right hand argument (x++) first, returning 5 and changing x to 6, so that 30 is assigned to y. Another implementation might evaluate the right hand argument first, but the side effect from the increment might not occur until after the entire expression is evaluated. All that is guaranteed is the side effect is applied before the next statement is executed.

It is illegal in C and C++ to modify the same variable twice in a single expression, or to modify it and use it a second time in the same expression. The results of doing so are undefined, meaning that the program can do anything.



If we consider the example with SQR, SQR(y++) will expand to (y++) * (y++). Since "y" is modified twice in this expression, the results are undefined. It is likely that the return value with be 30 (rather than 25 as expected), and that y will be incremented twice, rather than once, but that is not guaranteed. Some implementations may behave differently.







ähnlicher Fall:

2.:http://www.aoenterprises.de/weiterbildung/tagebuch/hauptteil_faqs_c_plusplus.html:

dort steht:



...

...

Jeder Ausdruck in C und C++ hat einen Wert und einen Seiteneffekt. Es wird jedoch nirgendwo gesagt, daß das eine vor dem anderen stattfindet.

Beispiel:



for (int i=0; i<10; i=i++) {cout << i;}



Dieser Ausdruck wird sehr wahrscheinlich in 95% aller Fälle eine Endlosschleife ergeben.

Und zwar weil nicht gesagt wird, dass zuerst der Wert zugewiesen wird und dann erhöht wird oder zuerst erhöht wird und dann der Wert zugewiesen wird. Nein, viel schlimmer. Es könnte sein, dass i vor der Verarbeitung als Kopie in ein Register geladen wird und von dort aus eine die Wert-Zuweisung stattfindet. Währenddessen wurde der Originalwert um 1 erhöht. Zu guter letzt wird dann aber der Register-Wert wieder zurückgeschrieben und voilà, i hat wieder seinen ursprünglichen Wert wie vor der Erhöhung.

...

...

...





3.http://www-info2.informatik.uni-wuerzburg.de/dclc-faq/c-faq.text:



ich denke, jetzt ist die "Gefährlichkeit" solcher Ausdrücke klar..

geschrieben von

Login

E-Mail:
  

Passwort:
  

Beitrag anfügen

Symbol:
 
 
 
 
 
 
 
 
 
 
 
 
 

Überschrift: