Anda di halaman 1dari 5

Programming Language Concept Summary Session 5

- Expression merupakan cara mendasar untuk menentukan komputasi di bahasa pemrograman


- Untuk mengerti evaluasi expression, haruslah akrab dengan urutan operator dan evaluasi
operand
- Esensi dari imperative language adalah peran pernyataan assignment yang dominan

Arithmetic Expression

- Arithmetic expression berisi operator, operand, parentheses, dan function call


- Operator yang memiliki satu operand disebut unary
- Operator dengan dua operand disebut binary
- Operator yang memiliki tiga operand disebut ternary
- Tingkat precedence
 Kurung (parentheses)
 Unary operator
 **
 *,/
 +,-
- Associativity rule menjelaskan urutan operator dengan level precedence yang sama
- Precedence dan associativity dapat di overridden dengan parentheses
- Pernyataan if-then-else dapat digunakan untuk melakukan conditional expression assignment,
contoh:
if (count == 0)
average = 0;
else
average = sum / count;

atau dalam bahasa berbasis C bisa menggunakan


average = (count == 0) ? 0 : sum / count;

- Urutan evaluasi operand:


 Variable: mengambil nilai dari memori
 Constant: terkadang diambil dari memori; terkadang constant tersebut di instruksi bahasa
mesin
 Parenthesized expression: evaluasi semua operand dan operator terlebih dahulu
 Jika operand dan operator keduanya tak memiliki side effect (terjadi ketika function
merubah salah satu parameternya atau suatu variable global), makan urutan evaluasi
operand ini tak relevan

Fuctional Side Effect

- Functional side effect merupakan kejadian ketika suatu fungsi mengganti parameter dua-arah
atau non-local variable
- Masalah terkait fuctional side effect:
 Ketika suatu function direferensikan di suatu expression mengubah operand lain di
expression tersebut, contoh:
int a = 5;
int fun1() {
a = 17;
return 3;
} /* end of fun1 */
void main() {
a = a + fun1();
} /* end of main */

- Dua solusi yang mungkin:


 Menulis definisi bahasa untuk melarang functional side effect
 Tidak ada parameter dua-arah di function
 Tidak ada alamat non-local di function
 Keuntungan: bekerja
 Kelemahan: ketidakfleksibelan parameter satu-arah dan kekurangan alamat non-local
 Menulis definisi bahasa untuk meminta urutan evaluasi order diperbaiki
 Kelemahan: membatasi beberapa optimisasi compiler
 Java memerlukan operand dievaluasi dengan urutan kiri ke kanan

Overloaded Operator

- Penggunaan sebuah operator untuk lebih dari satu maksud dikenal dengan operator
overloading
- Beberapanya umum, seperti operator penambahan (+)
- Beberapa lainnya berpotensi menimbulkan masalah,, seperti operator * di C dan C++
 Menghilangkan pendeteksi compiler error
 Kehilangan beberapa readability
- Beberapa bahasa seperti C++, C#, dan F# memperbolehkan user-defined overloaded operator
 Ketika digunakan dengan bijak, operator semacam itu dapat membantu readability
(menghindari method call, expression muncul natural)
 Dapat memunculkan masalah seperti, user dapat mendefinisikan operation yang tak masuk
akal; readability bisa berkurang, bahkan ketika operator tersebut masuk akal

Type Conversion

- Narrowing conversion merupakan conversion yang meng-konversi suatu objek ke tipe yang tak
dapat memasukkan seluruh nilai dari tipe originalnya, missal float menjadi int
- Widening conversion merupakan conversion yang objeknya dikonversii ke suatu tipe yang dapat
memasukkan setidaknya perkiraan semua nilai dari tipe originalnya seperti int menjadi float
- Mixed-mode expression merupakan expression yang operatornya dapat memiliki operand dari
tipe yang berbeda
- Coercion merupakan tipe conversion implisit
 Kelemahan: mengurangi kemampuan pendeteksi error compiler
- Di kebanyakan bahasa, semua numeric type dipaksa (coerced) di expression, menggunakan
widening conversion
- Explicit type conversion dikenal casting di bahasa berbasis C
 C: (int)angle
 F#: (float)sum
Error di Expression

- Klausa
 Batasan inheren dari aritmatika (seperti pembagian ke nol)
 Batasan aritmatika komputer (seperti overflow)
- Terkadang diacuhkan oleh system run-time

Relational Expression

- Relational operator merupakan operator yang membandingkan nilainya dengan kedua


operandnya
- Nilai dari relation operator adalah Boolean, kecuali ketika Boolean tidak didukung dibahasa
tersebut
- JavaScript dan PHP memiliki dua operator relational tambahan, === dan !==, mirip dengan
saudaranya, == dan !=, namun menghindari operandnya dipaksakan (coerced), contoh:

"7" == 7
Bernilai true, sedangkan
"7" === 7
Bernilai false

Boolean Expression

- Boolean operator hanya mengambil Boolean operand dan menghasilkan nilai Boolean
- C89 tidak memiliki tipe Boolean, sehingga ia menggunakan tipe integer dengan 0 sebagai false
dan nonzero sebagai true
- Tingkat precedence:
postfix ++, --
unary +, -, prefix ++, --, !
*, /, %
binary +, -
<, >, <=, >=
=, !=
&&
||  lowest

Short Circuit Evaluation

- Short circuit evaluation merupakan evaluasi yang mana hasilnya dapat ditentukan tanpa
mengevaluasi semua operand dan atau operator, misal:

(13 * a) * (b / 13 - 1)
Jika salah satu (13 * a atau b / 13 - 1) menghasilkan nilai nol, maka hasil dari ekspresi tersebut
bisa diketahui merupakan nol

- Short circuit evaluation di beberapa bahasa:


 C, C++, dan Java : menggunakan short-circuit evaluation untuk operator Boolean biasa (&&
dan ||), namun juga menyediakan operator Boolean bitwise yang tidak short circuit (& dan
|)
 Semua operator logika di Ruby, Perl, ML, F#, dan Python dievaluasi secara short-circuit
 Ada : programmer dapat memilih
 Short circuit evaluation menampilkan masalah side effect yang mungkin muncul di
expression, seperti
(a > b) || (b++ / 3)

Assignment Statement

- Syntax umum
<target_var> <assign_operator> <expression>
- Operator assignment:
 = Fortran, Basic, bahasa berbasis C
 := Ada
- = dapat berbahaya ketika di-overload untuk operator relational sebagai equality, sehingga
bahasa berbasis C menggunakan == sebagai operator relational
- Compound assignment operator merupakan metode cepat menjelaskan bentuk umum yang
diperlukan assignment, missal:
sum = sum + value;
ekuivalen dengan
sum += value;
- Unary assignment operator di bahasa berbasis C menggabungkan operasi increment dan
decrement dengan assignment, contoh:

sum = ++count (count ditambah, lalu di-assign ke sum)

sum = count++ (count di-assign ke sum, lalu ditambahkan)

count++ (count ditambahkan)

-count++ (count ditambahkan lalu di negasikan)

- Di bahasa berbasis C, Perl, dan JavaScript, pernyataan assignment menghasilkan suatu hasil dan
dapat digunakan sebagai operand, contoh:

while ((ch = getchar())!= EOF){…}

ch = getchar()

- Perl, Ruby, dan Lua memperbolehkan multiple-target multiple-source assignment, seperti:


($first, $second, $third) = (20, 30, 40);
- Identifier di bahasa fungsional hanya nama nilai, karena itu nilainya tak pernah berubah, misal di
bahasa ML:
 Name diikat ke nilai dengan val
val fruit = apples + oranges;
 Jika ada val lain untuk fruit, itu merupakan name baru dan berbeda
- Pernyataan assignment juga dapat mixed-mode
 Di Fortran, C, Perl, dan C++, semua numeric type value dapa di-assign ke numeric type
variable apapun
 Di java dan C#, hanya ketika coercionnya widening
 Tak ada mixed-mode assignment di bahasa fungsional

Anda mungkin juga menyukai