Aturan Searah Jarum Jam/Spiral

(Ini telah diposting ke comp.lang.c oleh penulisnya, David Anderson, pada 06-05-1994.)

Oleh David Anderson

Ada teknik yang dikenal sebagai “Aturan Searah Jarum Jam/Spiral” yang memungkinkan programmer C mana pun untuk mengurai deklarasi C apa pun di kepalanya!

Ada tiga langkah sederhana yang harus diikuti:

  1. Dimulai dengan elemen yang tidak diketahui, gerakkan secara spiral/searah jarum jam; ketika menemukan elemen berikut, gantilah dengan pernyataan bahasa Inggris yang sesuai:

    (X) atau ()

    => Array berukuran X… atau Array berukuran tidak terdefinisi…

    (tipe1, tipe2)

    => fungsi meneruskan tipe1 dan tipe2 kembali…

    *

    => penunjuk ke…

  2. Terus lakukan ini dalam arah spiral/searah jarum jam sampai semua token tertutup.

  3. Selalu selesaikan apa pun yang ada di dalam tanda kurung terlebih dahulu!

Contoh #1: Deklarasi sederhana

                     +-------+
                     | +-+   |
                     | ^ |   |
                char *str(10);
                 ^   ^   |   |
                 |   +---+   |
                 +-----------+

Pertanyaan yang kita tanyakan pada diri kita sendiri: Apa itu str?

“str adalah…

  • Kita bergerak dalam arah spiral searah jarum jam dimulai dengan `str’ dan karakter pertama yang kita lihat adalah `(‘ jadi, itu berarti kita memiliki sebuah array, jadi…

    “str adalah larik 10 dari…

  • Lanjutkan dalam arah spiral searah jarum jam, dan hal berikutnya yang kita temui adalah `*’ jadi, itu berarti kita punya petunjuk, jadi…

    “str adalah array 10 pointer ke…

  • Lanjutkan dalam arah spiral dan kita melihat ujung garis (`;’), jadi teruskan dan kita sampai pada tipe `char’, jadi…

    “str adalah array 10 pointer ke char”

  • Kami sekarang telah “mengunjungi” setiap token; oleh karena itu kita selesai!

Contoh #2: Deklarasi Pointer ke Fungsi

                     +--------------------+
                     | +---+              |
                     | |+-+|              |
                     | |^ ||              |
                char *(*fp)( int, float *);
                 ^   ^ ^  ||              |
                 |   | +--+|              |
                 |   +-----+              |
                 +------------------------+

Pertanyaan yang kita tanyakan pada diri kita sendiri: Apa itu fp?

“fp adalah…

  • Bergerak dalam arah spiral searah jarum jam, hal pertama yang kita lihat adalah `)’; oleh karena itu, fp ada di dalam tanda kurung, jadi kita lanjutkan spiral di dalam tanda kurung dan karakter berikutnya yang terlihat adalah `*’, jadi…

    “fp adalah penunjuk ke…

  • Kita sekarang keluar dari tanda kurung dan melanjutkan dalam arah spiral searah jarum jam, kita melihat `(‘; oleh karena itu, kita memiliki fungsi, jadi…

    “fp adalah penunjuk ke fungsi yang meneruskan int dan penunjuk ke float kembali…

  • Melanjutkan secara spiral, kita kemudian melihat karakter `*’, jadi…

    “fp adalah penunjuk ke fungsi yang meneruskan int dan penunjuk ke float mengembalikan penunjuk ke…

  • Melanjutkan secara spiral kita melihat `;’, tetapi kita belum mengunjungi semua token, jadi kita melanjutkan dan akhirnya mendapatkan tipe `char’, jadi…

    “fp adalah penunjuk ke fungsi yang meneruskan int dan penunjuk ke float mengembalikan penunjuk ke char”

Contoh #3: Yang “Ultimate”

                      +-----------------------------+
                      |                  +---+      |
                      |  +---+           |+-+|      |
                      |  ^   |           |^ ||      |
                void (*signal(int, void (*fp)(int)))(int);
                 ^    ^      |      ^    ^  ||      |
                 |    +------+      |    +--+|      |
                 |                  +--------+      |
                 +----------------------------------+

Pertanyaan yang kita tanyakan pada diri kita sendiri: Apa itu `sinyal’?

Perhatikan sinyal itu di dalam tanda kurung, jadi kita harus menyelesaikannya terlebih dahulu!

  • Bergerak di a searah jarum jam arah yang kita lihat `(‘ jadi kita punya…

    “sinyal adalah fungsi yang meneruskan int dan…

  • Hmmm, kita bisa menggunakan aturan yang sama pada `fp’, jadi… Apa itu fp? fp juga ada di dalam tanda kurung jadi selanjutnya kita melihat `*’, jadi…

    fp adalah penunjuk ke…

  • Lanjutkan dalam arah spiral searah jarum jam dan kita sampai pada `(‘, jadi…

    “fp adalah penunjuk ke fungsi yang meneruskan int kembali…”

  • Sekarang kita melanjutkan keluar dari tanda kurung fungsi dan kita melihat kekosongan, jadi…

    “fp adalah penunjuk ke fungsi yang meneruskan int tidak mengembalikan apa pun (batal)”

  • Kita telah selesai dengan fp jadi mari kita lanjutkan dengan `sinyal’, sekarang kita punya…

    “sinyal adalah fungsi yang meneruskan int dan penunjuk ke fungsi yang meneruskan int tidak mengembalikan apa pun (batal) kembali…

  • Kita masih berada di dalam tanda kurung jadi karakter berikutnya yang terlihat adalah `*’, jadi…

    “sinyal adalah fungsi yang meneruskan int dan penunjuk ke fungsi yang meneruskan int tidak mengembalikan apa pun (batal) mengembalikan penunjuk ke…

  • Kami sekarang telah menyelesaikan item dalam tanda kurung, jadi melanjutkan searah jarum jam, kami kemudian melihat `(‘ lainnya, jadi…

    “sinyal adalah fungsi yang meneruskan int dan penunjuk ke suatu fungsi yang meneruskan int yang tidak mengembalikan apa pun (batal) mengembalikan penunjuk ke fungsi yang meneruskan int yang mengembalikan…

  • Akhirnya kita lanjutkan dan satu-satunya yang tersisa hanyalah kata `void’, jadi definisi lengkap akhir untuk sinyal adalah:

    “sinyal adalah fungsi meneruskan int dan pointer ke fungsi meneruskan int tidak menghasilkan apa pun (batal) mengembalikan pointer ke fungsi meneruskan int tidak mengembalikan apa pun (batal)”

Aturan yang sama diterapkan untuk const dan volatil. Misalnya:

	const char *chptr;
  • Sekarang, apa itu chptr??

    “chptr adalah penunjuk ke konstanta char”

Bagaimana dengan yang ini:

	char * const chptr;
  • Sekarang, apa itu chptr??

    “chptr adalah penunjuk konstan ke char”

Akhirnya:

	volatile char * const chptr;
  • Sekarang, apa itu chptr??

    “chptr adalah penunjuk konstan ke char yang mudah menguap.”

Praktekkan aturan ini dengan contoh yang terdapat di K&R II di halaman 122.


Hak Cipta © 1993,1994 David Anderson

Artikel ini boleh didistribusikan secara bebas selama nama penulis dan pemberitahuan ini tetap dipertahankan.


Sumber

Krystian Wiśniewski
Krystian Wiśniewski is a dedicated Sports Reporter and Editor with a degree in Sports Journalism from He graduated with a degree in Journalism from the University of Warsaw. Bringing over 14 years of international reporting experience, Krystian has covered major sports events across Europe, Asia, and the United States of America. Known for his dynamic storytelling and in-depth analysis, he is passionate about capturing the excitement of sports for global audiences and currently leads sports coverage and editorial projects at Agen BRILink dan BRI.