Kompilieren Sie diesen Code und führen Sie ihn in C aus
#include <stdio.h>
int main()
{
int a[] = {10, 20, 30, 40, 50};
int index = 2;
int i;
a[index++] = index = index + 2;
for(i = 0; i <= 4; i++)
printf("%d\n", a[i]);
}
Ausgabe : 10 20 4 40 50
Nun zur gleichen Logik in Java
class Check
{
public static void main(String[] ar)
{
int a[] = {10, 20, 30, 40, 50};
int index = 2;
a[index++] = index = index + 2;
for(int i = 0; i <= 4; i++)
System.out.println(a[i]);
}
}
Ausgabe : 10 20 5 40 50
Warum gibt es in beiden Sprachen einen Ausgabeunterschied, für den die Ausgabe verständlich ist Java
aber ich kann die Ausgabe in nicht verstehen C
Eine weitere Sache, wenn wir das Präfix anwenden ++
Operator erhalten wir in beiden Sprachen das gleiche Ergebnis, warum?
Das ist, weil a[index++] = index = index + 2;
ruft Undefined Behavior in C auf Dies
Aus dem Link:
..der zweite Satz besagt: Wenn ein Objekt innerhalb eines vollständigen Ausdrucks geschrieben wird, müssen alle Zugriffe darauf innerhalb desselben Ausdrucks direkt an der Berechnung des zu schreibenden Werts beteiligt sein. Diese Regel schränkt legale Ausdrücke effektiv auf diejenigen ein, bei denen die Zugriffe nachweislich der Änderung vorausgehen. Zum Beispiel ist die alte Reserve i = i + 1 erlaubt, weil der Zugriff auf i verwendet wird, um den Endwert von i zu bestimmen. Das Beispiel
a[i] = i++
ist nicht erlaubt, weil einer der Zugriffe von i (der in a[i]) hat nichts mit dem Wert zu tun, der letztendlich in i gespeichert wird (was in i++ passiert), und daher gibt es keine gute Möglichkeit, zu definieren – weder für unser Verständnis noch für den Compiler – ob der Zugriff vor oder erfolgen soll nachdem der inkrementierte Wert gespeichert ist. Da es keinen guten Weg gibt, es zu definieren, erklärt der Standard, dass es undefiniert ist und dass portable Programme solche Konstrukte einfach nicht verwenden dürfen. Ähnlich zu a[i++]=i
(der UB aufruft) Ihr Ausdruck ruft auch UB auf.
Ihr Ausdruck hat auch ein ähnliches Verhalten.
Das Verhalten ist gut definiert in Java
.
aber wer würde solchen Code schreiben (in einer echten Anwendung)?
– user85421
8. Januar 2010 um 15:39 Uhr
@CarlosHeuberger Ich sehe, du bist das nicht gewohnt
c++
Schild– Ryan Haining
31. Juli 2017 um 15:47 Uhr
@RyanHaining Ich verstehe es nicht, aber der Kommentar war vom 8. Januar 2010 und die Frage wurde nicht mit getaggt
c++
diese Zeit. Und das denke ich immer nocha[index++] = index = index + 2
ist weder in C, C++ noch Java (Python?) gut – durch die Kommentar-Up-Stimmen glaube ich nicht allein – oder tut dasc++
tag bedeuten, dass der Code unlesbar sein kann (wie Code Golf vielleicht?) Und, siehe die einzige Antwort, auch C ist ein bisschen verwirrt darüber…– user85421
31. Juli 2017 um 16:53 Uhr
@CarlosHeuberger es ist ein Witz. Mindestens die Hälfte der
[c++]
Fragen zur Sprache könnten mit „Warum würdest du das jemals schreiben?“ beantwortet werden. Es ist übrigens kein legales Python.– Ryan Haining
31. Juli 2017 um 19:05 Uhr