2014-06-11 4 views
0

Mon doute est que dans le code suivant, la sortie est respectivement 2 et 1? Est-ce vraiment OK? Pour ma perception, la méthode 'm' devrait recevoir la valeur 1 puisqu'elle utilise l'opérateur postfix sur la variable 'i' au lieu de l'opérateur de préfixe.Priorité de l'opérateur Java postfix dans les expressions avec des appels de méthode

public class PostfixDoubt { 

    public static void main(String[] args) { 
     int i = 1; 
     // why does m receive 2 as argument and not 1? 
     i = i++ + m(i); 
     System.out.println(i); 
    } 

    public static int m(int i) { 
     System.out.println(i); 
     return 0; 
    } 
} 

Soufflet est le bytecode décompilé avec javap:

public class PostfixDoubt { 
    public PostfixDoubt(); 
    Code: 
     0: aload_0 
     1: invokespecial #8     // Method java/lang/Object."<init>":()V 
     4: return 

    public static void main(java.lang.String[]); 
    Code: 
     0: iconst_1 
     1: istore_1 
     2: iload_1 
     3: iinc   1, 1 
     6: iload_1 
     7: invokestatic #16     // Method m:(I)I 
     10: iadd 
     11: istore_1 
     12: getstatic  #20     // Field java/lang/System.out:Ljava/io/PrintStream; 
     15: iload_1 
     16: invokevirtual #26     // Method java/io/PrintStream.println:(I)V 
     19: return 

    public static int m(int); 
    Code: 
     0: getstatic  #20     // Field java/lang/System.out:Ljava/io/PrintStream; 
     3: iload_0 
     4: invokevirtual #26     // Method java/io/PrintStream.println:(I)V 
     7: iconst_0 
     8: ireturn 
} 

Répondre

2

Cette opération

i++ 

incrémente la valeur stockée dans la variable i et retourne sa valeur précédente. Lorsque i est réévalué à être passé en argument à

m(i) 

le nouveau incrémentée, la valeur est utilisée.


int i = 1; 
i = i++ + m(i); 

ressemble

1: 1 (i = 2) + m(i) 
2: 1 (i = 2) + m(2) 
3: 1 (i = 2) + Whatever value m(2) returns 
4: whatever value is the result of that addition 
5: that value is assigned to i 
+0

Oui, j'ai compris, mais pourquoi quand m (i) retourne est son résultat ajouté à 1? Si je suis déjà réévalué, cela devrait être 2. Ai-je raté quelque chose? – staroski

+0

@staroski Voir mes modifications. La valeur de 'i ++' est générée une fois. –

+0

On dirait que je suis réévalué deux fois. D'abord en le passant à m (i) et plus tard quand il est réaffecté à lui-même avec i = staroski

Questions connexes