Apa yang terjadi (di balik tirai) ketika ini dilakukan?
int x = 7;
x = x++;
Yaitu, ketika suatu variabel ditambahkan dan ditempatkan untuk dirinya sendiri dalam satu pernyataan? Saya menyusun dan menjalankan ini. x
masih 7 bahkan setelah seluruh pernyataan . Dalam buku saya, katanya x
bertambah!
java
operators
post-increment
Michael
sumber
sumber
int x = 7; x = ++x;
:, tentu saja masih kode yang mengerikan, Anda tidak perlu ditugaskan kembali.int x = 7; x++;
cukup.x += 1
, kecuali mungkin dalam loop.for(int x=0; x<7; x++)
Jawaban:
x
tidak bertambah. Tetapi Anda menugaskan nilai lamax
kembali ke dalam dirinya sendiri.x++
menambahx
dan mengembalikan nilai lamanya.x =
menetapkan nilai lama kembali ke dirinya sendiri.Jadi pada akhirnya,
x
akan ditugaskan kembali ke nilai awal.sumber
x
bertambah terlebih dahulu sebelum dibaca dalam kasus itu, jadi Anda berakhir denganx + 1
.setara dengan
sumber
x=x+1
alih-alihx++
x = x++
, bukan hanya kenaikan posx++
.x = ++x;
juga setara denganint tmp = x; ++x; x = tmp;
, jadi dengan logika apa kita dapat menyimpulkan bahwa jawaban Anda benar (yang mana)?x=x++
=MOV x,tmp; INC x; MOV tmp,x
Pernyataan:
setara dengan:
Singkatnya, pernyataan itu tidak berpengaruh.
Poin-poin penting:
Nilai dari ekspresi kenaikan / penurunan Postfix adalah nilai operan sebelum kenaikan / penurunan terjadi. (Dalam hal bentuk Awalan, nilainya adalah nilai operan setelah operasi,)
RHS ekspresi penugasan sepenuhnya dievaluasi (termasuk kenaikan, penurunan, dan / atau efek samping lainnya) sebelum nilai ditugaskan ke LHS.
Perhatikan bahwa tidak seperti C dan C ++, urutan evaluasi ekspresi di Jawa benar-benar ditentukan dan tidak ada ruang untuk variasi platform-spesifik. Compiler hanya diperbolehkan untuk menyusun ulang operasi jika ini tidak mengubah hasil dari mengeksekusi kode dari perspektif utas saat ini. Dalam hal ini, kompiler akan diizinkan untuk mengoptimalkan seluruh pernyataan karena dapat dibuktikan bahwa itu adalah no-op.
Dalam hal ini belum jelas:
Semoga, pemeriksa kode seperti FindBugs dan PMD akan menandai kode seperti ini sebagai mencurigakan.
sumber
x++
sajax = x++
.Ini memiliki perilaku yang tidak terdefinisi dalam C dan untuk Java lihat jawaban ini . Tergantung pada kompiler apa yang terjadi.
sumber
Konstruk seperti
x = x++;
menunjukkan Anda mungkin salah memahami apa yang dilakukan++
operator:Mari kita menulis ulang ini untuk melakukan hal yang sama, berdasarkan menghapus
++
operator:Sekarang, mari kita menulis ulang untuk melakukan (apa yang saya pikirkan) yang Anda inginkan:
Kehalusan di sini adalah
++
operator memodifikasi variabelx
, tidak seperti ekspresi sepertix + x
, yang akan mengevaluasi ke nilai int tetapi membiarkan variabelx
itu sendiri tidak berubah. Pertimbangkan konstruksi sepertifor
loop terhormat :Perhatikan
i++
di sana? Ini operator yang sama. Kita dapat menulis ulangfor
loop ini seperti ini dan akan berperilaku sama:Saya juga merekomendasikan untuk tidak menggunakan
++
operator dalam ekspresi yang lebih besar dalam banyak kasus. Karena kehalusan kapan memodifikasi variabel asli sebelum dan sesudah kenaikan (++x
danx++
masing-masing), sangat mudah untuk memperkenalkan bug halus yang sulit dilacak.sumber
Menurut kode Byte diperoleh dari file kelas,
Kedua tugas bertambah x, tetapi perbedaannya adalah waktu
when the value is pushed onto the stack
Di
Case1
, Push terjadi (dan kemudian ditetapkan) sebelum kenaikan (pada dasarnya berarti kenaikan Anda tidak menghasilkan apa-apa)Di
Case2
, Peningkatan terjadi pertama kali (membuatnya 8) dan kemudian mendorong ke tumpukan (dan kemudian ditugaskan ke x)Kasus 1:
Kode Byte:
Kasus 2:
Kode Byte
sumber
Ini bertambah setelah "
x = x++;
". Akan menjadi 8 jika Anda melakukannya "x = ++x;
".sumber
x = x++
, maka seharusnya 8.Operator Post Increment bekerja sebagai berikut:
Demikian pernyataannya
akan dievaluasi sebagai berikut:
Jadi x memang meningkat tetapi karena x ++ menetapkan hasil kembali ke x sehingga nilai x ditimpa ke nilai sebelumnya.
sumber
Peningkatan terjadi setelah x dipanggil, jadi x masih sama dengan 7. ++ x akan sama dengan 8 ketika x dipanggil
sumber
Ketika Anda menetapkan ulang nilai untuk
x
itu masih 7. Cobax = ++x
dan Anda akan mendapatkan 8 yang lain lakukansumber
karena x ++ menambah nilai SETELAH menugaskannya ke variabel. seterusnya dan selama eksekusi baris ini:
varialbe x masih akan memiliki nilai asli (7), tetapi menggunakan x lagi di baris lain, seperti
akan memberi Anda 8.
jika Anda ingin menggunakan nilai x yang ditambahkan pada pernyataan tugas Anda, gunakan
Ini akan bertambah x oleh 1, MAKA menetapkan nilai itu ke variabel x.
[Sunting] alih-alih x = x ++, itu hanya x ++; yang pertama memberikan nilai asli x pada dirinya sendiri, jadi sebenarnya tidak melakukan apa pun pada baris itu.
sumber
Apa yang terjadi ketika
int x = 7; x = x++;
?ans ->
x++
berarti nilai pakai pertama x untuk ekspresi dan kemudian meningkatkannya dengan 1.Inilah yang terjadi dalam kasus Anda. Nilai x pada RHS disalin ke variabel x pada LHS dan kemudian nilai
x
meningkat sebesar 1.Demikian pula
++x
berarti->
meningkatkan nilai x pertama dengan satu dan kemudian gunakan dalam ekspresi.Jadi dalam kasus Anda jika Anda melakukannya,
x = ++x ; // where x = 7
Anda akan mendapatkan nilai 8.
Untuk kejelasan lebih lanjut cobalah untuk mencari tahu berapa banyak pernyataan printf akan menjalankan kode berikut
sumber
x
menjadi 8, tetapi itu adalah 7 - kenaikan terjadi antara membaca dan penugasan++x
adalah pra-kenaikan->
x ditambahkan sebelum digunakanx++
adalah pasca-kenaikan->
x bertambah setelah digunakansumber
Jadi ini berarti:
x++
tidak sama denganx = x+1
karena:
dan sekarang sepertinya agak aneh:
sangat bergantung pada kompiler!
sumber
(x = x + 1, x-1)
di C, di mana ekspresi yang dipisahkan koma diperbolehkan.x = x ++;
Ini adalah operator pasca kenaikan. Ini harus dipahami sebagai "Gunakan nilai operan dan kemudian tambahkan operan".
Jika Anda ingin kebalikannya terjadi yaitu "Menambah operan dan kemudian menggunakan nilai operan", Anda harus menggunakan operator pra-kenaikan seperti yang ditunjukkan di bawah ini.
x = ++ x;
Operator ini pertama-tama menambahkan nilai x dengan 1 dan kemudian memberikan nilai kembali ke x.
sumber
Saya pikir kontroversi ini dapat diatasi tanpa masuk ke kode & hanya berpikir.
Anggap i ++ & ++ i sebagai fungsi, katakan Func1 & Func2.
Sekarang saya = 7;
Func1 (i ++) mengembalikan 7, Func2 (++ i) mengembalikan 8 (semua orang tahu ini). Secara internal kedua fungsi menambah i hingga 8, tetapi keduanya mengembalikan nilai yang berbeda.
Jadi i = i ++ memanggil fungsi Func1. Di dalam fungsi saya naik ke 8, tetapi setelah selesai fungsi mengembalikan 7.
Jadi akhirnya 7 dialokasikan untuk saya. (Jadi pada akhirnya, saya = 7)
sumber
Ini karena Anda menggunakan operator pasca kenaikan. Pada baris kode berikut
Yang terjadi adalah, Anda menetapkan nilai x ke x. x ++ kenaikan x setelah nilai x ditugaskan ke x. Begitulah cara operator pasca kenaikan bekerja. Mereka bekerja setelah sebuah pernyataan dieksekusi. Jadi dalam kode Anda, x dikembalikan terlebih dahulu setelah itu kemudian meningkat.
Jika Anda melakukannya
Jawabannya adalah 8 karena Anda menggunakan operator pra-kenaikan. Ini menambah nilai terlebih dahulu sebelum mengembalikan nilai x.
sumber