Logikunterschiede in C und Java

Lesezeit: 4 Minuten

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?

  • 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 noch a[index++] = index = index + 2 ist weder in C, C++ noch Java (Python?) gut – durch die Kommentar-Up-Stimmen glaube ich nicht allein – oder tut das c++ 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

Benutzeravatar von Prasoon Saurav
Prasun Saurav

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.

  • möchten a[index++] = index+2 (meistens das gleiche Ergebnis) jedoch undefiniert sein. Um ehrlich zu sein, müsste ich den Standard nachschlagen.

    – Michiel Buddingh

    8. Januar 2010 um 15:21 Uhr

  • @Michiel: Ja, das wäre auch UB, aus demselben Grund.

    – Prasun Saurav

    8. Januar 2010 um 15:24 Uhr

  • +1 – Sehr gute Antwort. Können Sie einen Ausschnitt darüber hinzufügen, was in Java definiert ist? Nur für Neugierige 🙂

    – Topher Fangio

    8. Januar 2010 um 15:25 Uhr

  • a[index++] = index+2 wäre auch undefiniertes Verhalten. Stellen Sie sich das so vor: Der Standard sagt, dass das Inkrement irgendwann vor dem Ende der Anweisung stattfindet, und spezifiziert keine andere Reihenfolge als diese. Daher gibt es keine Möglichkeit zu wissen, ob die Erhöhung vor oder nach der Addition erfolgt. (Dasselbe gilt für ++index – während der tiefgestellte Wert das Original ist index + 1 es ist undefiniert, wann der Wert tatsächlich gespeichert wird index.) Das Komitee hat sich entschieden, dies im Standard als undefiniert und nicht als unspezifiziert zu bezeichnen, was bedeutet, dass jedes Verhalten legal ist.

    – David Thornley

    8. Januar 2010 um 15:33 Uhr

  • @Topher: C und Java haben hier sehr unterschiedliche Ziele. C wurde entwickelt, um dem Compiler eine große Freiheit zur Verbesserung der Leistung zu geben, wie es sich für eine Systemimplementierungssprache gehört. Java wurde entwickelt, um alle möglichen Verhaltensweisen festzulegen, um es dem Programmierer zu erleichtern. Sowohl C als auch Java waren sehr erfolgreich.

    – David Thornley

    8. Januar 2010 um 15:37 Uhr

1387470cookie-checkLogikunterschiede in C und Java

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy