35 votes

Différences logiques en C et Java

Compiler et exécuter ce code en C

 #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]);
}
 

Sortie: 10 20 4 40 50

Maintenant, pour la même logique en 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]);
  }
}
 

Sortie: 10 20 5 40 50

Pourquoi y a-t-il une différence de sortie dans les deux langues? La sortie est compréhensible pour Java mais je ne peux pas comprendre la sortie en C

Une dernière chose, si nous appliquons le préfixe opérateur ++ , nous obtenons le même résultat dans les deux langues, pourquoi?

64voto

Prasoon Saurav Points 47488

C'est parce qu' a[index++] = index = index + 2; invoque un Comportement Indéfini dans C. Jetez un oeil à cette

À partir du lien:

..la deuxième phrase dit: si un objet est écrit à l'intérieur d'une expression pleine de tout et de tous les accès à l'intérieur de la même expression doit être directement impliqués dans le calcul de la valeur à écrire. Cette règle limite l'expression juridique de celles dans lesquelles l'accès manifestement précéder la modification. Par exemple, la veille ancienne i = i + 1 est autorisé, parce que l'accès de i est utilisée pour déterminer la j'ai de la valeur finale. L'exemple

 a[i] = i++

est rejetée parce que l'un des accès de i (l'un dans un[i]) n'a rien à voir avec la valeur qui est stockée dans i (ce qui arrive de plus en i++), et donc il n'y a pas de bonne façon de définir--soit pour notre compréhension ou le compilateur--si l'accès doit avoir lieu avant ou après la valeur incrémentée est stocké. Car il n'y a pas de bonne façon de le définir, la Norme déclare qu'il n'est pas défini, et que les programmes portables doivent tout simplement pas utiliser de telles constructions. Semblable à l' a[i++]=i (qui invoque UB) votre expression trop invoque UB.

Votre expression a aussi un comportement similaire.

Le comportement est bien définie en Java.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X