nav

       HOME    BINUS EVENT   HOW TO   KBP   THOUGHTS

About



Monday, April 6, 2015

Penjumlahan i++ + i++ + ++i + ++i


Pada bulan Oktober 2014 lalu, saya mendapat tugas dari dosen algoritma saya untuk penghitungan pre-increment dan post-increment. Lalu ketika saya browsing, masih banyak kebingungan dan keambiguan mengenai logika pre-increment dan post-increment di website-website maupun forum. Untuk pengertian secara harafiah, sudah benar, bahwa pre-increment menambahkan nilai sebelum melakukan proses sementara post-increment menambahkan nilai sesudah proses. Hal yang serupa juga berlaku pada pre-decrement dan post-decrement. Akan tetapi, saya cukup beruntung diajar oleh seorang dosen algoritma yang bisa dibilang ahli dalam programming DAN banyak maunya... nyebelin sih tapi saya sadar tugas itu berguna untuk menganalisa seberapa jauh pengertian mahasiswanya. Sayang sekali soal yang cukup menarik ini hampir tidak dapat saya temukan jawabannya di internet. Mungkin ada, di halaman terakhir google.. atau diantara halaman-halaman google... pokoknya jawabannya tidak saya temukan sejauh saya menelusuri halaman -halaman pencarian google berdasarkan batas kesabaran saya.. dan semua mahasiswa juga bingung, sampai akhirnya dosen kami pun "berbaik hati" menjelaskan di kelas.

Untuk compiler, kami menggunakan visual studio c++, dan menggunakan bahasa c. Untuk compiler lain mungkin akan berbeda hasilnya.

Soal:

#include<stdio.h>

int main(){
int i=1;

printf("%d", ++i + i++ + i++ + i++ + ++i + ++i + i++);
getchar();
return 0;
}


ketika dijalankan, hasilnya adalah 28. Pertanyaannya, darimanakah nilai i bisa menjadi 28???

Kalau saya search di internet, katanya sebenernya multi-increment seperti ini ga boleh dilakukan karena pada tiap compiler hasilnya bisa berbeda. Lalu ada juga pemikiran karena incrementnya ada 7 buah, jadi 28 itu berasal dari 7x4, jadi tiap nilai i dikali dengan 4. Banyak sekali teori dan hipotesa berlalu-lalang antar mahasiswa kelas algo saya. Mungkin benar, mungkin salah. Namun, untuk logika dalam compiler visual studio yang dijelaskan oleh dosen saya, kira-kira seperti ini cara pengerjaannya:

1. kumpulkan semua i++ ke kiri. total, ada 4 i++. Ingat, i++ adalah bentuk post-increment. Untuk ++i akan kita hitung kemudian, tinggalkan dulu saja ++i nya. Lalu agar tidak bingung, saya tetapkan: nilai eksplisit adalah nilai yang seharusnya berdasarkan definisinya, sedangkan nilai implisit adalah nilai yang menyimpang berdasarkan definisinya.


2. ada 2 nilai pada i, nilai implisit dan nilai eksplisit. Karena i adalah post increment, yaitu melakukan proses barulah menambahkan nilai, dan proses di sini adalah printf, jadi nilai eksplisit dari post-increment harusnya TIDAK BERUBAH dari nilai awal. Yang akan tercetak adalah nilai awal i itu sendiri, yaitu 1. Jadi, nilai eksplisitnya adalah 1 + 1 + 1 + 1 = 4. Kalau nilai awal i adalah 2, berarti nilai eksplisitnya 2 + 2 + 2 + 2 = 8.


diketahui : int i = 1
 
printf("%d", ++i  +  i++  +  i++  +  i++  +  ++i  +  ++i  +  i++);
                            1         1        1                           1        

nilai eksplisit post-increment i = 1 + 1 + 1 + 1 = 4                


Untuk nilai implisit, nilainya bertambah selalu tanpa memperhatikan itu adalah post-increment, jadi tiap menemukan i++, nilai i akan bertambah. Karena nilai awal i adalah 1, jadi nilai implisit i++ adalah 2 → 3 → 4 → 5. Tapi ini nilai implisit, jadi tidak dijumlah ya, yang diambil nilai akhirnya saja sebanyak jumlah i++, sehingga nilai implisit akhir adalah 5. Kalau jumlah i++ nya ada 7 dan nilai awal i adalah 1, berarti nilai implisit i adalah 2 → 3 → 4 → 5 → 6 → 7 → 8, nilai implisit i yang kita pegang adalah 8.


printf("%d", ++i  +  i++  +  i++  +  i++  +  ++i  +  ++i + i++);
                           1→2   2→3    3→4                     4→5        

nilai eksplisit post-increment i = 4 
nilai implisit post-increment i = 5    


3. Nah sekarang kita sudah punya nilai implisit i++ dan nilai eksplisit i++, mari berlanjut ke nilai implisit dan eksplisit ++i. Berbeda dari i++, ++i akan menggunakan nilai awal i dari hasil nilai implisit i++. Jadi nilai awal pada ++i dari soal ini adalah 5, bukan 1. 

Lalu sekarang kita masuk ke pre-increment dimana definisinya adalah melakukan pertambahan nilai sebelum melakukan proses, dan proses yang dimaksud pada soal ini adalah printf. Jadi nilai eksplisit di sini seharusnya SELALU BERTAMBAH TIAP MENEMUKAN ++i.

Mari kita lihat. ++i pada soal di atas, ada 3 buah. Berarti untuk nilai eksplisit ++i, mulai dari 5, menjadi 6 → 7 → 8. Nilai eksplisit akhir ++i adalah 8.

ingat: nilai implisit post-increment i = 5


printf("%d", ++i  +  i++  +  i++  +  i++  +  ++i  +  ++i + i++);
                 5→6                                  6→7   7→8       

nilai eksplisit pre-increment i = 8  



Lalu untuk nilai implisit, karena ++i ada 3 buah, maka memakai nilai eksplisit ++i dikali 3. Jadi nilai implisit ++i adalah 3 x 8 = 24.



ingat:
- nilai implisit post-increment i = 5
- nilai eksplisit pre-increment i = 8  


printf("%d", ++i  +  i++  +  i++  +  i++  +  ++i  +  ++i + i++);
                   8                                       8         8      

nilai implisit pre-increment i = 8 + 8 + 8 = 24  


4. Nilai akhir yang ditunjukkan oleh compiler berasal dari nilai eksplisit i++ ditambah nilai implisit ++i, yaitu 4 + 24, maka hasilnya 28. Nah kalau kamu masih belum begitu mengerti, coba ubah nilai int i=1 menjadi int i=2, jika kamu memakai visual studio c++, harusnya jawabannya adalah 35, berasal dari 8 + 27.


Kira-kira begitu hal yang dapat saya share kali ini, semoga tidak membuat kamu pusing dan bisa bermanfaat jika bertemu dosen sejenis dosen saya :)


No comments:

Post a Comment