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
}
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
@staroski Voir mes modifications. La valeur de 'i ++' est générée une fois. –
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