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


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.


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.


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;

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.


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.


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

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!


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.


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

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

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.


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

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.


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)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.