Dalam C, apa perbedaan antara menggunakan ++i
dan i++
, dan yang harus digunakan dalam incrementation blok untuk
loop?
++i
akan kenaikan nilai aku
, dan kemudian kembali bertambah nilai.i = 1; j = ++i; (saya adalah 2, j 2)
i++
akan kenaikan nilai aku
, tetapi mengembalikan nilai asli yang aku
yang diselenggarakan sebelum menjadi bertambah.i = 1; j = i++; (i 2 j 1)
Untuk untuk
loop, baik bekerja. ++i
tampaknya lebih umum, mungkin karena itu adalah apa yang digunakan dalam K&R.
Dalam kasus apapun, mengikuti pedoman "sukai ++i
atas i++
" dan anda tidak't salah.
Ada's beberapa komentar mengenai efisiensi dari ++i
dan i++
. Di setiap non-mahasiswa-project compiler, tidak akan ada perbedaan kinerja. Anda dapat memverifikasi ini dengan melihat kode yang dihasilkan, yang akan menjadi identik.
Efisiensi yang dimaksud adalah menarik... berikut's my upaya jawaban: https://stackoverflow.com/questions/24886/is-there-a-performance-difference-between-i-and-i
Sebagai Pada Freund catatan, it's yang berbeda untuk objek C++, sejak operator++()
adalah fungsi dan compiler dapat't tahu untuk mengoptimalkan saat penciptaan objek sementara untuk memegang nilai menengah.
i dikenal sebagai PostKenaikan sedangkan ++i adalah Pra Kenaikan.**
i
i++
pasca kenaikan karena kenaikan i
's nilai 1 setelah operasi selesai.
Mari kita lihat contoh berikut:
int i = 1, j;
j = i++;
Di sini nilai j = 1
tetapi i = 2
. Di sini nilai aku
akan ditugaskan untuk j
pertama maka aku
akan bertambah.
++i
++i
pra kenaikan karena kenaikan i
's nilai dengan 1 sebelum operasi.
Itu berarti j = i;
akan mengeksekusi setelah i++
.
Mari kita lihat contoh berikut:
int i = 1, j;
j = ++i;
Di sini nilai j = 2
tetapi i = 2
. Di sini nilai aku
akan ditugaskan untuk j
setelah aku
incremention dari aku
.
Demikian pula ++i
akan dieksekusi sebelum j=i;
.
Untuk pertanyaan anda yang harus digunakan dalam incrementation blok untuk loop? jawabannya adalah, anda dapat menggunakan salah satu.. doesn't peduli. Itu akan mengeksekusi anda untuk loop tidak sama. kali.
for(i=0; i<5; i++)
printf("%d ",i);
Dan
for(i=0; i<5; ++i)
printf("%d ",i);
Kedua loop akan menghasilkan output yang sama. yaitu 0 1 2 3 4
.
Itu hanya hal-hal di mana anda menggunakannya.
for(i = 0; i<5;)
printf("%d ",++i);
Dalam hal ini output akan menjadi 1 2 3 4 5
.
Silakan don't khawatir tentang "efisiensi" (kecepatan, benar-benar) yang lebih cepat. Kami memiliki kompiler hari ini yang mengurus hal-hal ini. Gunakan apapun yang masuk akal untuk menggunakan, berdasarkan yang lebih jelas menunjukkan niat anda.
++i
penambahan nilai, kemudian kembali itu.
i++
mengembalikan nilai, dan kemudian kenaikan itu.
It's perbedaan yang halus.
Untuk loop for, gunakan ++i
, seperti's sedikit lebih cepat. i++
akan membuat salinan tambahan yang hanya akan dibuang.
i++
: Dalam skenario ini pertama nilai yang ditetapkan dan kemudian terjadi kenaikan.
++i
: Dalam skenario ini pertama kenaikan dilakukan dan kemudian nilai ditetapkan
Di bawah ini adalah gambar visualisasi dan juga [di sini adalah praktis yang bagus video](
yang menunjukkan hal yang sama.Alasan ++i
** bisa menjadi sedikit lebih cepat dari i
adalah i++
dapat meminta salinan lokal dari nilai i sebelum semakin bertambah, sementara ++i
tidak pernah. Dalam beberapa kasus, beberapa compiler akan mengoptimalkan diri jika mungkin... tapi itu's tidak selalu mungkin, dan tidak semua compiler melakukan hal ini.
Saya mencoba untuk tidak bergantung terlalu banyak pada compiler optimasi, jadi saya'd ikuti Ryan Fox's saran: ketika saya bisa menggunakan kedua, saya menggunakan ++i
.
Mereka berdua kenaikan jumlah. ++i
adalah sama dengan i = i + 1
.
i
dan ++i
yang sangat mirip tapi tidak persis sama. Kedua kenaikan jumlah, tapi ++i
penambahan jumlah sebelum saat ekspresi ini dievaluasi, sedangkan i++
penambahan jumlah setelah ekspresi ini dievaluasi.
Contoh:
int i = 1;
int x = i++; //x is 1, i is 2
int y = ++i; //y is 3, i is 3
Hasil yang efektif baik menggunakan adalah identik. Dengan kata lain, loop akan melakukan hal yang persis sama dalam kedua kasus.
Dalam hal efisiensi, tidak bisa menjadi hukuman yang terlibat dengan memilih i++ lebih ++i. Dari segi bahasa spec, menggunakan post-increment operator harus membuat salinan tambahan dari nilai di mana operator bertindak. Ini bisa menjadi sumber tambahan operasi.
Namun, anda harus mempertimbangkan dua masalah utama dengan logika sebelumnya.
Modern compiler yang besar. Semua baik kompiler yang cukup pintar untuk menyadari bahwa itu adalah melihat integer kenaikan dalam for-loop, dan hal ini akan mengoptimalkan kedua metode sama kode efisien. Jika menggunakan post-increment lebih dari pre-increment benar-benar menyebabkan program anda untuk memiliki lebih lambat waktu berjalan, kemudian anda menggunakan mengerikan compiler.
Dalam hal waktu operasional-kompleksitas, dua metode (bahkan jika salinan yang sebenarnya sedang dilakukan) adalah setara. Jumlah instruksi yang dilakukan dalam loop harus mendominasi jumlah operasi dalam peningkatan operasi secara signifikan. Oleh karena itu, dalam setiap loop ukuran yang signifikan, hukuman dari kenaikan metode akan besar-besaran dibayangi oleh eksekusi loop tubuh. Dengan kata lain, anda akan jauh lebih baik khawatir tentang mengoptimalkan kode dalam lingkaran daripada kenaikan.
Menurut saya, seluruh masalah hanya bermuara pada preferensi gaya. Jika anda berpikir pre-increment lebih mudah dibaca, kemudian menggunakannya. Secara pribadi, saya lebih suka posting-incrment, tapi itu tidak mungkin karena itu adalah apa yang diajarkan kepada saya sebelum aku tahu apa-apa tentang optimasi.
Ini adalah contoh klasik dari dini optimasi, dan isu-isu seperti ini memiliki potensi untuk mengalihkan perhatian kita dari masalah-masalah serius dalam desain. Hal ini masih sebuah pertanyaan yang bagus untuk bertanya, namun, karena tidak ada keseragaman dalam penggunaan atau konsensus di "praktek terbaik."
++i
: adalah pre-increment yang lain adalah post-increment.
i++
: mendapat elemen dan kemudian bertahap itu.
++i
: bertahap saya dan kemudian kembali elemen.
Contoh:
int i = 0;
printf("i: %d\n", i);
printf("i++: %d\n", i++);
printf("++i: %d\n", ++i);
Output:
i: 0
i++: 0
++i: 2
++i
(Awalan operasi): Bertahap dan kemudian memberikan nilai
(misalnya): int i = 5
, int b = ++i
Dalam kasus ini, 6 ditugaskan untuk b pertama dan kemudian bertahap ke 7 dan seterusnya.
i++
(Postfix operasi): Menetapkan dan kemudian menambahkan nilai
(misalnya): int i = 5
, int b = i++
Dalam hal ini, 5 ditugaskan untuk b pertama dan kemudian bertahap ke 6 dan seterusnya.
Memetikan untuk loop: i++
adalah sebagian besar digunakan karena, biasanya kita menggunakan nilai awal dari aku
sebelum incrementing dalam loop for. Tapi tergantung pada logika program ini dapat bervariasi.
Ini sedikit kode yang dapat membantu untuk memvisualisasikan perbedaan dari sudut yang berbeda dari yang sudah diposting jawaban:
int i = 10, j = 10;
printf ("i is %i \n", i);
printf ("i++ is %i \n", i++);
printf ("i is %i \n\n", i);
printf ("j is %i \n", j);
printf ("++j is %i \n", ++j);
printf ("j is %i \n", j);
Hasilnya adalah:
//Remember that the values are i = 10, and j = 10
i is 10
i++ is 10 //Assigns (print out), then increments
i is 11
j is 10
++j is 11 //Increments, then assigns (print out)
j is 11
Memperhatikan sebelum dan setelah situasi.
Seperti yang salah satu dari mereka harus digunakan dalam suatu incrementation blok untuk loop, saya pikir itu yang terbaik yang bisa kita lakukan untuk membuat keputusan menggunakan contoh yang baik:
int i, j;
for (i = 0; i <= 3; i++)
printf (" > iteration #%i", i);
printf ("\n");
for (j = 0; j <= 3; ++j)
printf (" > iteration #%i", j);
Hasilnya adalah:
> iteration #0 > iteration #1 > iteration #2 > iteration #3
> iteration #0 > iteration #1 > iteration #2 > iteration #3
Saya don't tahu tentang anda, tapi aku don't melihat ada perbedaan dalam penggunaannya, setidaknya dalam loop for.
Saya berasumsi bahwa anda memahami perbedaan semantik sekarang (meskipun jujur saya bertanya-tanya mengapa orang-orang bertanya 'apa operator X berarti' pertanyaan pada stack overflow daripada membaca, anda tahu, buku atau tutorial web atau sesuatu.
Tapi bagaimanapun, sejauh mana yang akan digunakan, mengabaikan pertanyaan dari kinerja, yang tidak penting bahkan dalam C++. Ini adalah prinsip yang harus anda gunakan ketika memutuskan yang digunakan:
Katakan apa yang anda maksud dalam kode.
Jika anda don't perlu nilai-sebelum-kenaikan dalam pernyataan anda, don't menggunakan formulir itu dari operator. It's sebuah masalah kecil, tetapi jika anda bekerja dengan panduan gaya yang melarang satu versi yang mendukung lainnya sama sekali (alias tulang berkepala panduan gaya), anda harus menggunakan bentuk yang paling tepat mengungkapkan apa yang sedang anda coba untuk lakukan.
QED, gunakan pre-increment versi:
for (int i = 0; i != X; ++i) ...
Perbedaan dapat dipahami dengan sederhana C++ kode di bawah ini:
int i, j, k, l;
i = 1; //initialize int i with 1
j = i+1; //add 1 with i and set that as the value of j. i is still 1
k = i++; //k gets the current value of i, after that i is incremented. So here i is 2, but k is 1
l = ++i; // i is incremented first and then returned. So the value of i is 3 and so does l.
cout << i << ' ' << j << ' ' << k << ' '<< l << endl;
return 0;
Tak lama:
++i
dan i++
bekerja sama jika anda tidak menulis mereka dalam suatu fungsi. Jika anda menggunakan sesuatu seperti fungsi(i++)
atau fungsi(++i)
anda dapat melihat perbedaannya.
fungsi(++i)
kata pertama kenaikan i dengan 1, setelah itu masukan ini aku
ke dalam fungsi dengan nilai baru.
fungsi(i++)
mengatakan menempatkan pertama aku
menjadi fungsi setelah itu increment aku
dengan 1.
int i=4;
printf("%d\n",pow(++i,2));//it prints 25 and i is 5 now
i=4;
printf("%d",pow(i++,2));//it prints 16 i is 5 now
Pra crement anda berarti kenaikan pada baris yang sama. Post-increment berarti kenaikan setelah baris mengeksekusi.
int j=0;
System.out.println(j); //0
System.out.println(j++); //0. post-increment. It means after this line executes j increments.
int k=0;
System.out.println(k); //0
System.out.println(++k); //1. pre increment. It means it increments first and then the line executes
Ketika datang dengan ATAU, DAN operator, itu menjadi lebih menarik.
int m=0;
if((m == 0 || m++ == 0) && (m++ == 1)) { //false
/* in OR condition if first line is already true then compiler doesn't check the rest. It is technique of compiler optimization */
System.out.println("post-increment "+m);
}
int n=0;
if((n == 0 || n++ == 0) && (++n == 1)) { //true
System.out.println("pre-increment "+n); //1
}
Dalam Array
System.out.println("In Array");
int[] a = { 55, 11, 15, 20, 25 } ;
int ii, jj, kk = 1, mm;
ii = ++a[1]; // ii = 12. a[1] = a[1] + 1
System.out.println(a[1]); //12
jj = a[1]++; //12
System.out.println(a[1]); //a[1] = 13
mm = a[1];//13
System.out.printf ( "\n%d %d %d\n", ii, jj, mm ) ; //12, 12, 13
for (int val: a) {
System.out.print(" " +val); //55, 13, 15, 20, 25
}
Dalam C++ post/pre-increment dari variabel pointer
#include <iostream>
using namespace std;
int main() {
int x=10;
int* p = &x;
std::cout<<"address = "<<p<<"\n"; //prints address of x
std::cout<<"address = "<<p<<"\n"; //prints (address of x) + sizeof(int)
std::cout<<"address = "<<&x<<"\n"; //prints address of x
std::cout<<"address = "<<++&x<<"\n"; //error. reference can't re-assign because it is fixed (immutable)
}
Satu-satunya perbedaan adalah urutan operasi antara kenaikan variabel dan nilai operator kembali.
Ini kode dan output menjelaskan perbedaan:
#include<stdio.h>
int main(int argc, char* argv[])
{
unsigned int i=0, a;
a = i++;
printf("i before: %d; value returned by i++: %d, i after: %d\n", i, a, i);
i=0;
a = ++i;
printf("i before: %d; value returned by ++i: %d, i after: %d\n", i, a, i);
}
Output adalah:
i before: 1; value returned by i++: 0, i after: 1
i before: 1; value returned by ++i: 1, i after: 1
Jadi pada dasarnya ++i
mengembalikan nilai setelah itu bertambah, sedangkan ++i
mengembalikan nilai sebelum bertambah. Pada akhirnya, dalam kedua kasus aku
akan memiliki nilai yang bertambah.
Contoh lain:
#include<stdio.h>
int main ()
int i=0;
int a = i++*2;
printf("i=0, i++*2=%d\n", a);
i=0;
a = ++i * 2;
printf("i=0, ++i*2=%d\n", a);
i=0;
a = (++i) * 2;
printf("i=0, (++i)*2=%d\n", a);
i=0;
a = (++i) * 2;
printf("i=0, (++i)*2=%d\n", a);
return 0;
}
Output:
i=0, i++*2=0
i=0, ++i*2=2
i=0, (++i)*2=2
i=0, (++i)*2=2
Perbedaan yang jelas ketika kembali nilai yang diberikan ke variabel lain atau ketika kenaikan ini dilakukan dalam rangkaian dengan operasi lain di mana operasi didahulukan diterapkan (i++*2
berbeda dari ++i*2
, tapi (i++)*2
dan (++i)*2
mengembalikan nilai yang sama) dalam banyak kasus, mereka yang dipertukarkan. Contoh klasik adalah untuk loop sintaks:
for(int i=0; i<10; i++)
memiliki efek yang sama dari
for(int i=0; i<10; ++i)
Untuk tidak membuat kebingungan di antara dua operator saya mengadopsi aturan ini:
Mengasosiasikan posisi operator ++
sehubungan dengan variabel i
untuk perintah ++
operasi sehubungan dengan penugasan
Kata dalam kata lain:
++
sebelum aku
berarti incrementation harus dilakukan sebelum tugas;++
setelah aku
berarti incrementation harus dilakukan setelah tugas: