Apakah ada perbedaan dalam ++i
dan i++
dalam satu for
lingkaran? Apakah ini hanya masalah sintaksis?
303
Apakah ada perbedaan dalam ++i
dan i++
dalam satu for
lingkaran? Apakah ini hanya masalah sintaksis?
Jawaban:
++ dikenal sebagai postfix.
tambah 1 ke a, kembalikan nilai yang lama.
++ a dikenal sebagai awalan.
tambah 1 ke, mengembalikan nilai baru.
C #:
Keluaran:
foreach
danwhile
loop tergantung pada tipe kenaikan mana yang Anda gunakan. Dengan untuk loop seperti di bawah ini tidak ada bedanya karena Anda tidak menggunakan nilai pengembalian i:Jika nilai yang dievaluasi digunakan maka jenis kenaikan menjadi signifikan:
sumber
Pre-increment ++ i menambah nilai i dan mengevaluasi ke nilai incremented yang baru.
Post-increment i ++ menambah nilai i dan mengevaluasi ke nilai non-incremented yang asli.
Di C ++, pre-increment biasanya lebih disukai di mana Anda bisa menggunakan keduanya.
Ini karena jika Anda menggunakan post-increment, itu dapat meminta kompiler harus membuat kode yang menciptakan variabel sementara tambahan. Ini karena nilai-nilai sebelumnya dan baru dari variabel yang ditingkatkan perlu disimpan di suatu tempat karena mereka mungkin diperlukan di tempat lain dalam ekspresi yang sedang dievaluasi.
Jadi, setidaknya di C ++, ada perbedaan kinerja yang memandu pilihan Anda untuk digunakan.
Ini terutama hanya masalah ketika variabel yang ditambahkan adalah tipe yang ditentukan pengguna dengan operator ++ yang ditimpa. Untuk tipe primitif (int, dll) tidak ada perbedaan kinerja. Tapi, ada baiknya tetap berpegang teguh pada operator pra-kenaikan sebagai pedoman kecuali jika operator pasca kenaikan pasti yang diperlukan.
Ada beberapa diskusi lagi di sini:
https://web.archive.org/web/20170405054235/http://en.allexperts.com/q/C-1040/Increment-operators.htm
Di C ++ jika Anda menggunakan STL, maka Anda mungkin menggunakan untuk loop dengan iterator. Ini sebagian besar memiliki operator ++ utama, jadi tetap berpegang pada pra-kenaikan adalah ide yang bagus. Kompiler menjadi lebih pintar sepanjang waktu, dan yang lebih baru mungkin dapat melakukan optimasi yang berarti tidak ada perbedaan kinerja - terutama jika tipe yang bertambah didefinisikan secara inline dalam file header (seperti implementasi STL yang sering) sehingga kompiler dapat melihat bagaimana metode ini diterapkan dan kemudian dapat mengetahui optimasi apa yang aman untuk dilakukan. Meski begitu, itu mungkin masih layak menempel pra-kenaikan karena loop dieksekusi berkali-kali dan ini berarti penalti kinerja kecil segera bisa diperkuat.
Dalam bahasa lain seperti C # di mana operator ++ tidak dapat kelebihan beban tidak ada perbedaan kinerja. Digunakan dalam loop untuk memajukan variabel loop, operator kenaikan pra dan pasca adalah setara.
Koreksi: overloading ++ dalam C # diperbolehkan. Tampaknya, dibandingkan dengan C ++, di c # Anda tidak dapat membebani versi pre dan post secara independen. Jadi, saya akan berasumsi bahwa jika hasil memanggil ++ di C # tidak ditugaskan ke variabel atau digunakan sebagai bagian dari ekspresi yang kompleks, maka kompiler akan mengurangi versi pra dan posting ++ ke kode yang berkinerja setara.
sumber
Dalam C # tidak ada perbedaan saat digunakan dalam for for loop .
menampilkan hal yang sama dengan
Seperti yang telah ditunjukkan orang lain, ketika digunakan secara umum i ++ dan ++ i memiliki perbedaan yang halus namun signifikan:
i ++ membaca nilai i lalu menambahkannya.
++ i menambah nilai i lalu membacanya.
sumber
++i
dani++
melakukan operasi yang sama dalam urutan yang sama: membuat salinan tempi
; menambah nilai temp untuk menghasilkan nilai baru (tidak untuk menimpa temp); simpan nilai baru dii
; sekarang jika++i
hasilnya dikembalikan adalah nilai baru; jikai++
hasilnya dikembalikan adalah salinan temp. Jawaban lebih rinci di sini: stackoverflow.com/a/3346729/3330348Pertanyaannya adalah:
Jawabannya adalah: Tidak .
Mengapa masing-masing dan setiap jawaban lainnya harus masuk ke penjelasan terperinci tentang kenaikan sebelum dan sesudah ketika ini bahkan tidak ditanyakan?
Ini untuk-loop:
Akan menerjemahkan ke kode ini tanpa menggunakan loop:
Sekarang apakah itu penting jika Anda memasukkan
i++
atau++i
sebagai kenaikan di sini? Tidak, itu tidak karena nilai pengembalian operasi kenaikan tidak signifikan.i
akan bertambah setelah eksekusi kode yang ada di dalam for loop body.sumber
Karena Anda bertanya tentang perbedaan dalam satu lingkaran, saya kira maksud Anda
Dalam hal ini, Anda tidak memiliki perbedaan dalam sebagian besar bahasa: Loop berperilaku sama terlepas dari apakah Anda menulis
i++
dan++i
. Dalam C ++, Anda dapat menulis versi Anda sendiri dari operator ++, dan Anda dapat mendefinisikan arti yang terpisah untuk mereka, jika itui
adalah tipe yang ditentukan pengguna (kelas Anda sendiri, misalnya).Alasan mengapa itu tidak masalah di atas adalah karena Anda tidak menggunakan nilai
i++
. Hal lain adalah ketika Anda melakukannyaSekarang, ada adalah perbedaan, karena sebagai orang lain menunjukkan,
i++
berarti kenaikan, namun mengevaluasi nilai sebelumnya , tapi++i
berarti kenaikan, namun mengevaluasii
(sehingga akan mengevaluasi ke nilai baru). Dalam kasus di atas,a
ditetapkan nilai sebelumnya dari i, sementara i bertambah.sumber
Seperti yang ditunjukkan kode ini (lihat MSIL yang tidak jelas dalam komentar), kompiler C # 3 tidak membuat perbedaan antara i ++ dan ++ i dalam for for loop. Jika nilai i ++ atau ++ i diambil, pasti akan ada perbedaan (ini dikompilasi dalam Visutal Studio 2008 / Release Build):
sumber
Satu (++ i) adalah preincrement, satu (i ++) adalah postincrement. Perbedaannya adalah dalam nilai apa yang segera dikembalikan dari ekspresi.
Sunting: Woops, sepenuhnya mengabaikan sisi loop hal. Tidak ada perbedaan nyata untuk loop ketika itu adalah bagian 'langkah' (untuk (...; ...;)), tetapi ini dapat ikut bermain dalam kasus lain.
sumber
Tidak ada perbedaan jika Anda tidak menggunakan nilai setelah kenaikan dalam loop.
Kedua loop akan mencetak 0123.
Tetapi perbedaannya datang ketika Anda menggunakan nilai setelah kenaikan / penurunan di loop Anda seperti di bawah ini:
Pra Pertambahan Loop:
Output: 0 0 1 1 2 2 3 3
Post Increment Loop:
Output: 0 0 1 0 2 1 3 2
Saya harap perbedaannya jelas dengan membandingkan output. Poin yang perlu diperhatikan di sini adalah kenaikan / penurunan selalu dilakukan pada akhir for loop dan karenanya hasilnya dapat dijelaskan.
sumber
Berikut adalah Java-Sample dan Byte-Code, post- dan preIncrement tidak menunjukkan perbedaan dalam Bytecode:
Dan sekarang untuk byte-code (javap -private -c PreOrPostIncrement):
sumber
Ya ada. Perbedaannya terletak pada nilai balik. Nilai kembali "++ i" akan menjadi nilai setelah menambahkan i. Kembalinya "i ++" akan menjadi nilai sebelum bertambah. Ini berarti kode yang terlihat seperti berikut:
Oleh karena itu, a akan menjadi 2, dan b dan c masing-masing akan menjadi 1.
Saya bisa menulis ulang kode seperti ini:
sumber
Tidak ada perbedaan aktual dalam kedua kasus '
i
' akan bertambah 1.Tetapi ada perbedaan ketika Anda menggunakannya dalam ekspresi, misalnya:
sumber
Ada lebih banyak ke ++ i dan i ++ daripada loop dan perbedaan kinerja. ++ i mengembalikan nilai-l dan i ++ mengembalikan nilai-r. Berdasarkan hal ini, ada banyak hal yang dapat Anda lakukan untuk (++ i) tetapi tidak untuk (i ++).
sumber
Ini mengejutkan pikiran saya mengapa begitu orang dapat menulis ekspresi kenaikan di-loop sebagai i ++.
Dalam for-loop, ketika komponen ke-3 adalah pernyataan kenaikan sederhana, seperti pada
atau
tidak ada perbedaan dalam eksekusi yang dihasilkan.
sumber
Seperti yang dikatakan @Jon B , tidak ada perbedaan dalam for for loop.
Tetapi dalam satu
while
ataudo...while
loop, Anda bisa menemukan beberapa perbedaan jika Anda membuat perbandingan dengan++i
ataui++
sumber
Dalam javascript karena i ++ berikut mungkin lebih baik digunakan:
Sementara array (saya pikir semua) dan beberapa fungsi dan panggilan lainnya menggunakan 0 sebagai titik awal Anda harus mengatur i ke -1 untuk membuat loop bekerja dengan array saat menggunakan ++ i .
Saat menggunakan i ++ nilai berikut akan menggunakan nilai yang meningkat. Anda bisa mengatakan i ++ adalah cara manusia menghitung, karena Anda bisa mulai dengan 0 .
sumber
sama dengan versi WHILE
sumber
Mungkin ada perbedaan untuk loop. Ini adalah aplikasi praktis pasca / kenaikan.
Sementara yang pertama dihitung menjadi 11 dan loop 11 kali, yang kedua tidak.
Sebagian besar ini agak digunakan dalam waktu yang sederhana (x--> 0); - - Loop untuk beralih misalnya semua elemen array (kecuali foreach-constructs di sini).
sumber
Mereka berdua menambah jumlahnya.
++i
setara dengani = i + 1
.i++
dan++i
sangat mirip tetapi tidak persis sama. Keduanya menambah angka, tetapi++i
menambah angka sebelum ekspresi saat ini dievaluasi, sedangkani++
menambah angka setelah ekspresi dievaluasi.Periksa tautan ini .
sumber
Ya, ada perbedaan antara
++i
dani++
dalam satufor
lingkaran, meskipun dalam kasus penggunaan yang tidak biasa; ketika variabel loop dengan operator kenaikan / penurunan digunakan dalam for for atau dalam ekspresi tes loop , atau dengan salah satu variabel loop . Tidak, itu bukan hanya masalah sintaksis.Seperti
i
dalam kode berarti mengevaluasi ekspresii
dan operator tidak berarti evaluasi tetapi hanya operasi;++i
berarti nilai selisihi
1 dan kemudian dievaluasii
,i++
berarti mengevaluasii
dan kemudian nilai kenaikani
sebesar 1.Jadi, apa yang diperoleh dari masing-masing dua ekspresi berbeda karena apa yang dievaluasi berbeda di masing-masing. Semua sama untuk
--i
dani--
Sebagai contoh;
Dalam kasus penggunaan yang tidak biasa, namun contoh berikut kedengarannya bermanfaat atau tidak, itu menunjukkan perbedaan
sumber
Untuk
i
tipe yang ditentukan pengguna, operator ini bisa (tetapi tidak boleh ) memiliki semantik yang berbeda dalam konteks indeks loop, dan ini dapat (tetapi tidak seharusnya) mempengaruhi perilaku loop yang dijelaskan.Juga, di
c++
dalamnya umumnya paling aman untuk menggunakan formulir pra-kenaikan (++i
) karena lebih mudah dioptimalkan. (Scott Langham mengalahkan saya untuk berita gembira ini . Kutukan Anda, Scott)sumber
Saya tidak tahu bahasa lain tetapi di Java ++ i adalah peningkatan awalan yang berarti: meningkatkan i dengan 1 dan kemudian menggunakan nilai baru dari i dalam ekspresi di mana saya berada, dan i ++ adalah peningkatan postfix yang berarti berikut : gunakan nilai i saat ini dalam ekspresi dan kemudian tambahkan dengan 1. Contoh:
} dan hasilnya adalah:
sumber
i ++; ++ i; keduanya serupa karena tidak digunakan dalam ekspresi.
sumber