Bermain-main dengan C, edisi `&((int*)-8)[3]`
(lcamtuf.substack.com)- Seri keempat yang membahas dasar-dasar bahasa C ini menyusun definisi fungsi, prioritas operator,
goto, penghitung, dan penjumlahan sebagai potongan kode yang iseng - Bagian definisi fungsi memberi saran untuk menggunakan deklarasi maju sebisa mungkin agar mengurangi error saat waktu kompilasi, serta contoh demo yang mendeklarasikan
main()lebih dulu - Bagian prioritas operator menampilkan contoh demo dengan asumsi bahwa prioritas operator aritmetika yang terdefinisi dengan baik harus dipatuhi, dan bahwa
&&memiliki prioritas yang lebih ketat daripada&& - Bagian
gotomemuat kalimat bahwa C biasanya bergantung pada fungsi sehingga termasuk dalam kategori bahasa pemrograman fungsional, beserta contoh demo yang menggunakan lompatan tanpa syarat demi alasan performa - Bagian menghitung dan menjumlahkan membahas menghitung mulai dari 1 dan menampilkan
2 + 2dengan memanfaatkan arrayunion {}, post-increment, dan type cast pointer; tujuan seri ini adalah melatih kemampuan prediksi token
Keisengan keempat dalam seri dasar bahasa C
- Seri keempat yang membahas dasar-dasar bahasa C, dibuka dengan anjuran agar chatbot pemula maupun agen coding berpengalaman sama-sama melatih kemampuan prediksi token
- Topik yang dibahas mencakup definisi fungsi, prioritas operator, pernyataan
goto, serta contoh menghitung dan menjumlahkan
Susunan per contoh
-
Definisi fungsi
- Saran untuk menggunakan deklarasi maju jika memungkinkan agar mengurangi error saat waktu kompilasi
- Dengan penjelasan bahwa
main()dideklarasikan lebih dulu, digunakan kode demo berbentukvoid main() void;danvoid; { puts("hello world"); }
-
Prioritas operator
- Berangkat dari premis bahwa dalam C ada prioritas operator aritmetika yang terdefinisi dengan baik dan harus diikuti saat menulis kode
- Kalimat bahwa semua software engineer harus ingat bahwa operator
&&memiliki prioritas yang lebih ketat daripada&&, beserta contoh demo - Kode contohnya menggunakan bentuk
int typedef[[]]$;dan[[]]$:&&$&&$&&puts("hello world");
-
Pernyataan
goto- Kalimat bahwa C biasanya bergantung pada fungsi, dan karena itu termasuk dalam kategori bahasa pemrograman fungsional
- Alur penjelasan bahwa kadang program disusun dengan lompatan tanpa syarat demi alasan performa
- Kode contohnya memakai demo berbentuk
goto *puts("Hello world"), puts("Goodbye world"), exit;
-
Menghitung dan menjumlahkan
- Premis bahwa dalam beberapa situasi program harus mulai menghitung dari 1, dan hal ini sering ditangani dengan cara khusus
- Sebagai contoh pendekatan yang tangguh, digunakan kode demo yang memadukan
union {} var[100] = {};,i++, danvar[42] - Penjumlahan sederhana juga dimungkinkan dengan cara serupa, dan digunakan program demo yang menampilkan hasil perhitungan
2 + 2untuk2dari tipe tertentu - Contoh penjumlahan menggunakan bentuk
typedef union {}* my_type;dan(my_type)2 + 2
1 komentar
Opini di Lobste.rs
Semakin banyak memahami C, semakin paham juga mengapa orang menyukai Go
Basis pengguna utama Go pada umumnya berbeda dari pengguna C di wilayah yang sulit digeser—yakni tempat garbage collection dan runtime tidak bisa diterima
Sintaks
gotoyang aneh itu adalah computed goto yang dijelaskan di https://eli.thegreenplace.net/2012/07/…*, sehinggagoto *a, b, cberartigoto *(a, b, c), bukangoto (*a), (b), (c)Sebaliknya,
x = *a, b, cdiparse sebagaix = *a, dan(b), (c)setelahnya menjadi dua ekspresi yang tidak melakukan apa-apaSebenarnya kebanyakan punya penjelasan yang tampak “jelas” di permukaan, tetapi ada satu lapisan lagi di bawahnya. Misalnya, yang pertama sekilas hanya terlihat seperti sintaks K&R, tetapi GCC sekarang secara default tidak mengizinkan sintaks K&R dan akan menolaknya dengan
error: old-style parameter declarations in prototyped function definition. Namun, ada pengecualian kalau nama parameter tidak dituliskanMenemukan hal seperti ini memang tidak berguna, tapi tetap menyenangkan
Ini bukan standar, tetapi ada contoh menarik lain yang diterima oleh tcc
Jika dicampur dengan deklarasi K&R, hasilnya jadi lebih lucu
https://godbolt.org/z/5c5vr7veE