Matakuliah : KONSEP BAHASA PEMROGRAMAN Tahun : 2010 EKSPRESI DAN PERNYATAAN PENUGASAN Pertemuan 5 Outline Materi •Pendahuluan •Ekspresi aritmatika •Operator overloaded •Konversi tipe •Ekspresi relasional dan Boolean •Evaluasi short-circuit •Pernyataan assignment •Mixed-Mode Assignment Bina Nusantara University 3 Pendahuluan • Ekspresi adalah alat untuk melakukan komputasi di bahasa pemrograman • Untuk memahami evaluasi ekspresi, kita perlu familiar dengan urutan operator dan evaluasi operan • Esensi bahasa imperatif adalah dominannya peran pernyataan penugasan Bina Nusantara University 4 Ekspresi Aritmatika • Ekspresi aritmatika adalah motivasi utama pengembangan bahasa pemrograman • Ekspresi aritmatika terdiri dari operator, operan, parentheses, pemanggilan fungsi • Isu desain – – – – • Peringkat (precedence) operator dan asosiativitas operator Urutan evaluasi operan Potensi efek samping evaluasi operan Operator overloading dan ekspresi mode mixing Operator – Operator uner mempunyai satu operan – Operator biner mempunyai dua operan – Sebagian besar infix kecuali Perl yang prefix – Operator terner mempunyai tiga operan Bina Nusantara University 5 Peringkat Operator • Peringkat operator untuk evaluasi ekspresi mendefinisikan urutan operator mana yang dievaluasi lebih dulu jika mereka berbeda peringkat • Tipikal aras peringkat – parentheses – – – – – – postfix ++, -- (jika bahasa mendukungnya) prefix ++, -- (jika bahasa mendukungnya) operator uner +, ** (jika bahasa mendukungnya) *, / operator biner +, - Bina Nusantara University 6 Asosiatifitas Operator • Aturan asosiatifitas operator untuk evaluasi ekspresi mendefinisikan urutan evaluasi operator yang berdekatan dengan peringkat yang sama • Aturan asosiatifitas – Kiri ke kanan kecuali ** yang kanan ke kiri – Kadang-kadang asosiasi operator uner dari kanan ke kiri (e.g., in FORTRAN) – FORTRAN: 2**3**2 samadengan 512 • APL berbeda; semua operator sama peringkatnya dan asosiasinya adalah kanan ke kiri – 3 * 4 + 5 samadengan 27 • Aturan peringkat dan asosiasi dapat di-override dengan parentheses Bina Nusantara University 7 Ekspresi Kondisional • Ekspresi kondisional – Bahasa berbasis C (e.g., C, C++ dan Java) – Contoh: average = (count == 0)? 0 : sum / count dievaluasi sebagai berikut if (count == 0) average = 0 else average = sum /count Bina Nusantara University 8 Evaluasi Operan • Urutan evaluasi operan 1. Variabel: fetch nilai dari memori 2. Konstan: kadang-kadang di-fetch dari memori; kadang-kadang ia ada di dalam instruksi bahasa mesin 3. Parenthesized expressions: evaluasi semua operan dan operator Bina Nusantara University 9 Potensi Efek Samping • Efek samping fungsional, terjadi jika fungsi mengubah two-way parameter atau variabel non-local • Masalah dengan efek samping fungsional : – Jika fungsi yang merujuk ke ekspresi mengubah operan lain dari ekspresi; e.g., untuk perubahan parameter : a = 10; /* assume that fun changes its parameter */ b = a + fun(a); • Jika nilai a di-fetch duluan, nilainya 10 dan nilai b = 15 • jika operan kedua dievaluasi duluan, maka nilai operan pertama adalah 20 dan nilai b = 25 Bina Nusantara University 10 Potensi Efek Samping (lanjutan) • int a = 5; int fun1() { a = 17; return 3; } void fun2() { a = a + fun1(); } void main() { fun2(); } • Nilai a di fun2() tergantung pada urutan evaluasi dari operan di ekspresi a + fun1() Bina Nusantara University 11 Efek Samping Fungsional • Dua solusi yang mungkin 1. Desain bahasa yang tidak membolehkan adanya efek samping • • • • Tak ada two-way parameters di fungsi Tak ada referensi ke non-local di fungsi Keuntungan : pasti jalan Kerugian : tak flleksibel 2. Tulis bahasa yang menginginkan bahwa urutan evaluasi adalah tetap Kerugian: membatasi optimasi kompilator . Java : urutan kiri ke kanan . Bina Nusantara University 12 Overloaded Operator • Penggunaan operator untuk lebih dari satu tujuan disebut operator overloading • Beberapa biasa digunakan (e.g., + for int and float) • Beberapa punya potensi menimbulkan masalah (e.g., * di C dan C++) – – – – Kehilangan deteksi eror oleh kompilator Sebagian kehilangan readability Simbol operator berbeda akan meningkatkan readability Dapat dihindari dengan mengenalkan simbol baru (e.g., Pascal’s div untuk pembagian integer, sedangkan / untuk pembagian floating point) Bina Nusantara University 13 Overloaded Operator (lanjutan) • C++ dan Ada membolehkan overloaded operator yang didefinisikan oleh user. • Dapat membantu readability – + dan – di-overloaded untuk matriks ADT – (A * B) + (C * D) dapat digunakan selain matrixAdd(matrixMult(A,B),matrixMult(C,D)) • Potensi masalah – Pengguna dapat mendefinisikan nonsense operations – Readability mungkin terganggu , meskipun operatornya make sense – Tidak ada yang bisa mencegah user untuk mendefinisikan + sebagai multiplikasi Bina Nusantara University 14 Konversi Tipe dan Lost Error Detection • Bentuk : implisit (coercion), eksplisit (cast) dan error di ekspresi. • Narrowing conversion adalah konversi obyek ke tipe baru yang tidak mengakomodasi semua nilai dari tipe asli e.g., float to int • Widening conversion adalah obyek dikonversi ke tipe baru yang mencakup paling sedikit aproksimasi semua nilai dari tipe asli e.g., int to float • Potensi masalah dengan widening conversion, i.e. sejumlah akurasi mungkin hilang – Int disimpan dalam 32 bits: presisi paling sedikit sembilan digit desimal – Float disimpan dalam 32 bits: presisi sekitar tujuh digit desimal Bina Nusantara University – Sehingga int ke float widening conversion dapat kehilangan 15 Ekspresi Mixed-Mode • Mixed-mode expression adalah ekspresi yang mempunyai operan berbeda tipe • Coercion adalah konversi tipe implisit • Dilakukan oleh kompilator • Kerugian coercion: – Mengurangi kemampuan kompilator untuk melakukan deteksi tipe eror • Dalam banyak bahasa, semua tipe numerik dalam ekspresi di-coerce menggunakan widening conversions • Di Ada, secara virtual tidak ada coercion di ekspresi Bina Nusantara University 16 Eksplisit Tipe Konversi • • • • Konversi tipe eksplisit Disebut casting di bahasa berbasis C Dilakukan oleh pemrogram Contoh – C: (int) angle – Ada: Float (sum) • Sintaks Ada mirip dengan pemanggilan fungsi Bina Nusantara University 17 Konversi Tipe : Eror dalam Ekspresi • Coercion dari operan dalam ekspresi • Causes – Batasan inheren dari aritmatika dengan nol – Limitasi dari aritmatika komputer • e.g., pembagian e.g. overflow Kerap diabaikan oleh run-time system Bina Nusantara University 18 Ekspresi Relasional dan Boolean • Ekspresi relasional – Mengevaluasi representasi Boolean dengan nilai True atau False – Menggunakan operator relasional dan operan berbagai tipe – Simbol operator yang digunakan sangat beragam disejumlah bahasa (!=, /=, .NE., <>, #) • Ekspresi Boolean – Operan adalah Boolean dan hasilnya Boolean – Contoh FORTRAN 77 FORTRAN 90 .AND. and && .OR. or || .NOT. not ! Bina Nusantara University C and or not xor Ada 19 Ekspresi Relasional dan Boolean (lanjutan) • C tidak punya tipe Boolean—C menggunakan tipe int dengan 0 untuk false dan nonzero untuk true • Satu karakteristik aneh dari ekspresi C : a < b < c adalah legal tetapi hasilnya mungkin tidak seperti yang kita duga: – Operator kiri dievaluasi menghasilkan 0 atau 1 – Hasil evaluasi kemudian dibandingkan dengan operan ketiga (i.e., c) Bina Nusantara University 20 Peringkat Operator • Peringkat operator di bahasa dengan basis C prefix ++, -unary +, -, prefix ++, --, ! *,/,% binary +, <, >, <=, >= =, != && || Bina Nusantara University 21 Evaluasi Short Circuit • SC : Ekspresi yang nilainya dapat ditentukan tanpa menghitung semua operan dan/atau operator. • Contoh: (13*a) * (b/13–1) Jika a = 0, tak ada kebutuhan untuk menghitung (b/13-1) • Potensi masalah dengan evaluasi non-short-circuit: table look up. index = 1; while (index <= length) && (LIST[index] != value) index++; – Jika index=length, LIST [index] akan menyebabkan masalah pengindeksan (asumsi LIST mempunayi length -1 element) Bina Nusantara University 22 Evaluasi Short Circuit (Lanjutan) • C, C++, dan Java: menggunakan evaluasi SC untuk operator Boolean (&& dan ||), tetapi juga menyediakan bitwise operator Boolean yang tidak SC (& dan |) • Ada: pemrogram dapat menspesifikasi apakah SC menggunakan and then atau or else • Evaluasi SC bisa mengekspose potensi masalah side effects dalam ekspresi e.g. (a > b) || (b++ / 3) b dapat diubah (di ekspresi kedua) hanya jika a<= b. Jika kita asumsikan bahwa b diubah setiap saat waktu kita mengevaluasi ekspresi selama eksekusi, program akan fail Bina Nusantara University 23 Pernyataan Penugasan • Bentuk umum <target_var> <assign_operator> <expression> • Operator penugasan = FORTRAN, BASIC, PL/I, C, C++, Java := ALGOLs, Pascal, Ada • = dapat jelek jika ia di-overloaded sebagai ekualitas di operator relasional Bina Nusantara University 24 Operator Majemuk • Metode shorthand untuk menspesifikasi bentuk penugasan yang kerap digunakan • Dikenalkan di ALGOL; diadopsi oleh C • Contoh a = a + b ditulis sebagai a += b Bina Nusantara University 25 Operator Penugasan Uner • Operator penugasan uner di bahasa berbasis C mengkombinasikan operasi increment dan decrement dengan penugasan • Contoh sum = ++count (count di-increment, ditambahkan ke sum) sum = count++ (count di-increment, ditambahkan ke sum) count++ (count di-increment) -count++ (count di-increment kemudian dinegasi) Bina Nusantara University 26 Penugasan sebagai Ekspresi • Di C, C++, dan Java, pernyataan penugasan menghasilkan nilai yang dapat digunakan sebagai operan • Contoh: - while ((ch = getchar())!= EOF){…} ch = getchar() dikerjakan; hasilnya digunakan sebagai nilai kondisional dipernyataan while Bina Nusantara University 27 Penugasan Mode Campur • Pernyataan penugasan dapat juga bermode campur, sebagai contoh int a, b; float c; c = a / b; • Di Pascal, variabel integer dapat di-assign ke variabel real, tetapi variabel real tidak dapat diassign ke integer. • Di Java, hanya widening assignment coercions • Di Ada, tidak ada assignment coercion Bina Nusantara University 28 LATIHAN A. SOAL PILIHAN 1. Di bahasa Perl ekspresi biner berbentuk a. infix b. prefix c. postfix d. suffix 2. Banyak fitur C++ yang di-copy oleh Java. Opsi-opsi berikut ini adalah fitur-fitur C++ yang tidak di-copy oleh Java kecuali a. union b. pointer c. operator overloading d. reference 3. Functional side effect terjadi saat fungsi mengganti a. tipe datanya b. variable lokalnya c. variable globalnya d. parameter atau variable globalnya Bina Nusantara University 29 LATIHAN 4. Di C++/Java a. operator && dan || short circuit, & dan | short circit b. operator && dan || short circuit, & dan | not short circit c. operator && dan || not short circuit, & dan | short circit d. operator && dan || not short circuit, & dan | not short circit 5. Coercion adalah a. explicit type conversion c. widening conversion Bina Nusantara University b. implicit type conversion d. narrowing conversion 30 LATIHAN B. SOAL URAIAN 1. Uraikan, berikut contoh jika perlu, apa yang kamu ketahui tentang short-circuitevaluation. Modifikasilah fungsi berikut ini untuk mengimplementasikan short-circuitevaluation sesuai dengan uraian Anda sebelumnya. // return 1 if y is a leap year, 0 otherwise int isLeapYear(int y) { return y % 4 == 0 && y % 100 != 0 || y % 400 == 0; } 2. What is a C++ reference type and what is its common use? Why are reference variables in C++ better than pointers for formal parameters? What advantages do Java reference type variables have over the pointers in other languages? What are the differences between C++ and Java references variables? Why wouldn’t arithmetic on Java references make sense? Bina Nusantara University 31 Ringkasan • • • • • Ekspresi Peringkat operator dan asosiatifitas Operator overloading Ekspresi tipe-campur Berbagai bentuk pernyataan penugasan Bina Nusantara University 32
© Copyright 2024 Paperzz