download

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