kleines problem
-
Wenn dein Prof. das als Alternative ansieht,hat der keine Ahnung.
Wie gesagt,zwischen beiden Inkrementierungen ist kein Sequenzpunkt zu finden,und zwischen 2 Sequenzpunkten steht es dem Compiler frei einen Zeitpunkt zu wählen,an dem die Zuweisung an die Variablen stattfinden soll.
Der 1.Code beschwört daher undefiniertes Verhalten hervor,der 2te nicht,daher können diese beiden nicht äquivalent sein (ob der 2.Code das tut was er soll,hängt davon was er tun soll ;)).
-
Jep. Das ist eine Alternative. Aber ich würde das sco schreiben:
int j = *ip++; a[j]=*ip++;
Damit ist alles klar.
In C sind Zuweisungen dieser Art
a[i] = i++;
undefiniert. Genauer: soll für den Index i der alte oder der neue Wert von i verwendet werden? In deinem ersten Beispiel ist genau so etwas der Fall.
-
Jep. Das ist eine Alternative.
Das kannst doch garnicht sagen.Danach müßtest du bei der ersten Alternative sagen können,was genau passiert (und das kannst du nicht).
Wenn ein Compiler aus erstem Code eine Hello World macht,ist das 2te keine Alternative.
-
also der erste code ist also undefiniert, weil er nicht weiss ob er zuerst i erhöhen soll und zuweisen oder zuerst zuweisen dann erhöhen, habe ich recht?
und habt ihr eine gute netz adresse wo ich sollche beispiele finde die ich übern kann? danke für eure hilfe!
aber was ich noch immer nicht verstanden habe, was ist genau mit Sequenzpunkten gemeint?
-
Original erstellt von <UB>:
Jep. Das ist eine Alternative.
Das kannst doch garnicht sagen.Danach müßtest du bei der ersten Alternative sagen können,was genau passiert (und das kannst du nicht).
Wenn ein Compiler aus erstem Code eine Hello World macht,ist das 2te keine Alternative.Bla...
Du und Ich meinen schon das gleiche. Ich bin auch der Meinung, das eben solcher Code nicht geschrieben werden sollte. (siehe mein erstes Posting)
Mit 'Alternative' meinte ich, es wäre ein alternativer Code mit der Bedeutung, die ich oben beschrieben habe.
Nebenbei ist das Resultat nicht unbedingt undefiniert sondern eher implementationsabhängig: Der Compiler entscheidet, wie der Code zu übersetzten ist. Wenn jetzt ein bestimmter Compiler das 'richtig' kompiliert, dann passt doch für diesen Fall. Dann ist der zweite Code IMHO tatsächlich eine Alternative (für diesen bestimmten Compiler). Ich hasse solche Haarspaltereien.
-
Original erstellt von mady:
Nebenbei ist das Resultat nicht unbedingt undefiniert sondern eher implementationsabhängig'implementationsabhängig' schließt 'undefiniert' mit ein.
-
drmabuse: Manche Ausdrücke haben sogenannte Seiteneffekte. In einem Programm gibt es nun spezielle Punkte, an denen garantiert wird, dass alle vorhergehenden Seiteneffekte erfolgt und abgeschlossen sind. Im Groben bestehen diese Punkte aus Semikola, Operatoren wie Kommata, &&, ||, ?:, Funktionsaufrufen, der Sequenzpunkt bei der Rückkehr aus einer Funktion usw.
-
Original erstellt von Bashar:
'implementationsabhängig' schließt 'undefiniert' mit ein.(Implementierungsspezifisches Verhalten muss AFAIK von der Implementierung dokumentiert werden, UB nicht. -- hier irrelevant) mady wollte aber IMHO eher darauf hinaus, dass das Verhalten des Programmes durch die Umgebung _definiert_ ist, weil UB eine Codeeigenschaft ist.
[ Dieser Beitrag wurde am 24.06.2003 um 22:21 Uhr von Daniel E. editiert. ]
-
'implementationsabhängig' ist ein sinnloser Allgemeinplatz, da das Verhalten ja schließlich von irgendwas abhängig ist ... letztlich ist die Implementation als abstrakte Zusammenfassung von Compiler, Compilereinstellungen, Library, OS, Hardware etc. die entscheidende Instanz, die sämtliches Verhalten bestimmt.
BTW implementationsabhängig != implementationsdefiniert
*haarspalt*
-
Original erstellt von Bashar:
BTW implementationsabhängig != implementationsdefiniertDas Verhalten eines, von einer Umgebung abhängiges, Programm wird durch diese beschrieben und hängt damit also von ihr ab. Ein durch die Umgebung vollständig definiertes Programm[1] hängt von dieser Definition, und damit von der Umgebung ab. Wo ist der Unterschied?
[1]: Mir ist klar, dass das programm in erster Linie durch den Quelltext geschrieben wird. Es geht ja hier um Fälle, wo die Norm das Programm nicht komplett beschreiben kann.