2010-01-08 9 views
35

compiler et exécuter ce code dans Cdifférences logiques en C et Java

#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 existe-t-il une différence de sortie dans les deux langues, la sortie est compréhensible f ou Java mais je ne peux pas comprendre la production dans C

une chose, si l'on applique l'opérateur préfixe ++, on obtient le même résultat dans les deux langues, pourquoi?

+17

mais qui écrirait le code comme ça (dans une application réelle)? –

+0

@CarlosHeuberger Je vois que vous n'êtes pas habitué à la balise «C++» –

+0

@RyanHaining Je ne comprends pas, mais le commentaire était du 8 janvier ** 2010 ** et la question n'a pas été taguée avec «C++» cette fois . Et je pense toujours que 'un [index ++] = index = index + 2 n'est pas bon ni en C, C++ ni en Java (Python?) - par le commentaire up-votes, je crois que je ne suis pas seul - ou le' C++ 'tag signifie que le code peut être illisible (comme Code Golf peut-être?) Et, voir la seule réponse, aussi C est un peu * confus * à ce sujet ... –

Répondre

65

C'est parce que a[index++] = index = index + 2; Comportement non défini dans invoque C. Jetez un oeil à this

À partir du lien:

..la deuxième phrase dit: si un objet est écrit dans un plein expression, tous les accès à la même expression doivent être directement impliqués dans le calcul de la valeur à écrire. Cette règle contraint effectivement les expressions juridiques à celles dans lesquelles les accès précèdent la modification. Par exemple, l'ancien standby i = i + 1 est autorisé, car l'accès de i est utilisé pour déterminer la valeur finale de i. L'exemple

a[i] = i++ 

est refusée parce que l'un des accès de i (l'un dans une [i]) n'a rien à voir avec la valeur qui finit par être stockée dans i (ce qui se passe plus dans i ++) , et donc il n'y a pas de bon moyen de définir - que ce soit pour notre compréhension ou celle du compilateur - si l'accès doit avoir lieu avant ou après que la valeur incrémentée soit stockée. Comme il n'y a pas de bonne façon de le définir, le standard déclare qu'il est indéfini, et que les programmes portables ne doivent tout simplement pas utiliser de telles constructions. Semblable à a[i++]=i (qui appelle UB), votre expression appelle aussi UB.

Votre expression a également un comportement similaire.

Le comportement est bien défini dans Java.

+0

serait 'un [index ++] = index + 2' (même résultat, la plupart du temps) être indéfini, cependant. Pour être honnête, il faudrait que je vérifie la norme. –

+2

+1 .......... :) – missingfaktor

+2

@Michiel: Oui, ce serait aussi UB, même raison. –

Questions connexes