Bagaimana cara kerja operator post increment (i ++) dan pre increment (++ i) di Java?

99

Bisakah Anda menjelaskan kepada saya output dari kode Java ini?

int a=5,i;

i=++a + ++a + a++;
i=a++ + ++a + ++a;
a=++a + ++a + a++;

System.out.println(a);
System.out.println(i);

Outputnya 20 dalam kedua kasus

Ankit Sachan
sumber
9
Selalu hindari pernyataan ambigu :)
Prasoon Saurav
9
@Prasoon Saurav Tidak seperti C dan C ++, Java dan C # memiliki urutan evaluasi yang ketat, jadi pernyataan ini tidak ambigu.
Pete Kirkham
12
Saya tahu itu tapi tetap saja pernyataan itu tidak (tidak bisa) digunakan untuk tujuan praktis jadi harus dihindari.
Prasoon Saurav
4
@PeteKirkham Sudah lebih dari enam tahun kemudian, tapi saya masih ingin menunjukkan bahwa "ambigu", dalam situasi ini, ambigu - ini bisa berarti "kompilator tidak tahu apa yang akan dimasukkan", atau bisa juga berarti "Pemrogram tidak tahu apa artinya ".
Gugatan Dana Monica

Jawaban:

150

Apakah ini membantu?

a = 5;
i=++a + ++a + a++; =>
i=6 + 7 + 7; (a=8)

a = 5;
i=a++ + ++a + ++a; =>
i=5 + 7 + 8; (a=8)

Poin utamanya adalah ++amenaikkan nilai dan segera mengembalikannya.

a++ juga menambah nilai (di latar belakang) tetapi mengembalikan nilai variabel yang tidak berubah - yang sepertinya akan dijalankan nanti.

kgiannakakis
sumber
5
Apakah Anda yakin a == 9 dalam yang kedua?
Pete Kirkham
1
i = ++ a + ++ a + a ++; => i = 7 + 8 + 5; (a = 8) karena kenaikan posting memiliki prioritas tertinggi, apakah ++ dieksekusi terlebih dahulu?
rsirs
2
contoh rumit menjadi sesuatu yang mudah dijelaskan.
oznus
Apakah jawaban ini sama untuk c # dan c ++?
alur kerja
Mengapa a, b, dan c sama dengan 2 di sini? int a = 1; int b = a++; int c = ++b;Berharap b menjadi 1 karena itu kenaikan pos.
Dennis
202

++akenaikan dan kemudian menggunakan variabel.
a++menggunakan dan kemudian menambah variabel.

Jika Anda memiliki

a = 1;

dan kamu juga

System.out.println(a++); //You will see 1

//Now a is 2

System.out.println(++a); //You will see 3

codaddict menjelaskan cuplikan khusus Anda.

Lombo
sumber
62

Dalam kedua kasus itu, pertama kali menghitung nilai, tetapi dalam kenaikan setelah itu memegang nilai lama dan setelah menghitung mengembalikannya

++ a

  1. a = a + 1;
  2. kembali a;

a ++

  1. suhu = a;
  2. a = a + 1;
  3. suhu kembali;
Tigran Babajanyan
sumber
8
Jawaban paling jelas
Kartik Chugh
2
inilah yang membuatku mengerti dengan jelas .. terima kasih.
rematnarab
22
i = ++a + ++a + a++;

adalah

i = 6 + 7 + 7

Bekerja : kenaikan a hingga 6 (nilai saat ini 6) + kenaikan a hingga 7 (nilai saat ini 7). Jumlahnya 13 sekarang tambahkan ke nilai saat ini dari a (= 7) dan kemudian tingkatkan a menjadi 8. Jumlahnya 20 dan nilai a setelah tugas selesai adalah 8.

i = a++ + ++a + ++a;

adalah

i = 5 + 7 + 8

Bekerja : Pada nilai awal a adalah 5. Gunakan dalam penambahan dan kemudian tingkatkan menjadi 6 (nilai saat ini 6). Tingkatkan a dari nilai saat ini 6 ke 7 untuk mendapatkan operan + lainnya. Jumlahnya 12 dan nilai a saat ini adalah 7. Kenaikan berikutnya a dari 7 menjadi 8 (nilai saat ini = 8) dan tambahkan ke jumlah sebelumnya 12 untuk mendapatkan 20.

codaddict
sumber
pernyataan ini bekerja dari kanan ke kiri atau dari kiri ke kanan?
Abhijeet
10

++akenaikan asebelum dievaluasi. a++mengevaluasi adan kemudian menambahkannya.

Terkait dengan ekspresi Anda diberikan:

i = ((++a) + (++a) + (a++)) == ((6) + (7) + (7)); // a is 8 at the end
i = ((a++) + (++a) + (++a)) == ((5) + (7) + (8)); // a is 8 at the end

Tanda kurung yang saya gunakan di atas secara implisit digunakan oleh Java. Jika Anda melihat istilah dengan cara ini, Anda dapat dengan mudah melihat, bahwa keduanya sama dan bersifat komutatif.

Aurril
sumber
1
@ KlasLindbäck commutative berarti Anda dapat menukar kedua ekspresi dan tetap mendapatkan hasil yang sama. Jadi a ++ + ++ a == ++ a + a ++ (5 + 7 == 6 + 6; a == 7 di akhir).
Aurril
8

Pada contoh di atas

int a = 5,i;

i=++a + ++a + a++;        //Ans: i = 6 + 7 + 7 = 20 then a = 8 

i=a++ + ++a + ++a;        //Ans: i = 8 + 10 + 11 = 29 then a = 11

a=++a + ++a + a++;        //Ans: a = 12 + 13 + 13 = 38

System.out.println(a);    //Ans: a = 38

System.out.println(i);    //Ans: i = 29
vinod
sumber
4

++ a adalah operator kenaikan prefiks:

  • hasilnya dihitung dan disimpan dulu,
  • kemudian variabel digunakan.

a ++ adalah operator kenaikan postfix:

  • variabel digunakan pertama,
  • kemudian hasilnya dihitung dan disimpan.

Begitu ingat aturannya, ZE buat nih menghitung semuanya!

Xinyi Liu
sumber
4

Menganggap itu yang Anda maksud

int a=5; int i;

i=++a + ++a + a++;

System.out.println(i);

a=5;

i=a++ + ++a + ++a;

System.out.println(i);

a=5;

a=++a + ++a + a++;

System.out.println(a);

Ini mengevaluasi untuk:

i = (6, a is now 6) + (7, a is now 7) + (7, a is now 8)

jadi i adalah 6 + 7 + 7 = 20 dan 20 dicetak.

i = (5, a is now 6) + (7, a is now 7) + (8, a is now 8)

jadi i adalah 5 + 7 + 8 = 20 dan 20 dicetak lagi.

a = (6, a is now 6) + (7, a is now 7) + (7, a is now 8)

dan setelah semua sisi kanan dievaluasi (termasuk pengaturan a ke 8) LALU a diatur ke 6 + 7 + 7 = 20 dan 20 dicetak sebagai waktu terakhir.

pengguna93199
sumber
3

when aadalah 5, kemudian a++memberikan 5 untuk ekspresi dan kenaikan asetelahnya, sedangkan ++akenaikan asebelum meneruskan angka ke ekspresi (yang memberikan a6 untuk ekspresi dalam kasus ini).

Jadi Anda menghitung

i = 6 + 7 + 7
i = 5 + 7 + 8
Thorbjørn Ravn Andersen
sumber
3

Namun saya percaya jika Anda menggabungkan semua pernyataan Anda dan menjalankannya di Java 8.1, Anda akan mendapatkan jawaban yang berbeda, setidaknya itulah yang dikatakan pengalaman saya.

Kode akan bekerja seperti ini:

int a=5,i;

i=++a + ++a + a++;            /*a = 5;
                                i=++a + ++a + a++; =>
                                i=6 + 7 + 7; (a=8); i=20;*/

i=a++ + ++a + ++a;           /*a = 5;
                                i=a++ + ++a + ++a; =>
                                i=8 + 10 + 11; (a=11); i=29;*/

a=++a + ++a + a++;            /*a=5;
                                a=++a + ++a + a++; =>
                                a=12 + 13 + 13;  a=38;*/

System.out.println(a);        //output: 38
System.out.println(i);         //output: 29
Rishabh Vashishtha
sumber
3

Pre-increment berarti variabel tersebut bertambah SEBELUM dievaluasi dalam ekspresi. Penambahan pasca berarti bahwa variabel bertambah SETELAH dievaluasi untuk digunakan dalam ekspresi.

Oleh karena itu, perhatikan baik-baik dan Anda akan melihat bahwa ketiga tugas secara hitung setara.

Oke Uwechue
sumber
2

pre-increment dan post increment sama jika tidak dalam ekspresi

int j =0;
int r=0         
for(int v = 0; v<10; ++v) { 
          ++r;
          j++;
          System.out.println(j+" "+r);
  }  
 1 1  
 2 2  
 3 3       
 4 4
 5 5
 6 6
 7 7
 8 8
 9 9
10 10
Utama Jawa
sumber
0
a=5; i=++a + ++a + a++;

adalah

i = 7 + 6 + 7

Bekerja: kenaikan pra / pasca memiliki asosiasi "kanan ke kiri", dan pra didahulukan dari pos, jadi pertama-tama kenaikan pra akan diselesaikan sebagai (++a + ++a) => 7 + 6. kemudian a=7disediakan untuk kenaikan posting => 7 + 6 + 7 =20dan a =8.

a=5; i=a++ + ++a + ++a;

adalah

i=7 + 7 + 6

Bekerja: kenaikan pra / posting memiliki asosiatif "kanan ke kiri", dan pra memiliki prioritas di atas posting, jadi pertama-tama kenaikan pra akan diselesaikan sebagai (++a + ++a) => 7 + 6. Kemudian a=7disediakan untuk kenaikan posting => 7 + 7 + 6 =20dan a =8.

Vineet Sahu
sumber
0

Saya percaya Anda menjalankan semua pernyataan ini secara berbeda
mengeksekusi bersama-sama akan menghasilkan => 38, 29

int a=5,i;
i=++a + ++a + a++;
//this means i= 6+7+7=20 and when this result is stored in i,
//then last *a* will be incremented <br>
i=a++ + ++a + ++a;
//this means i= 5+7+8=20 (this could be complicated, 
//but its working like this),<br>
a=++a + ++a + a++;
//as a is 6+7+7=20 (this is incremented like this)
Randhawa
sumber