Saya baru saja mengambil tes pemrograman menengah, dan salah satu pertanyaan saya salah adalah sebagai berikut:
Tanda titik koma (';') tidak diperlukan setelah deklarasi fungsi.
Benar atau salah.
Saya memilih "false" (dan tolong perbaiki saya jika saya salah karena saya merasa seperti gila), deklarasi fungsi adalah apa yang Anda tulis sebelum definisi (di bagian atas kode) sehingga kompiler mengetahui fungsi tersebut panggilan bahkan sebelum memanggilnya, dan definisi fungsi adalah apa yang membentuk fungsi secara keseluruhan.
Yaitu,
Pernyataan:
int func();
Definisi:
int func() {
return 1;
}
Bukankah seharusnya jawabannya salah?
c++
function
syntax
declaration
Logan
sumber
sumber
Jawaban:
Anda dapat memiliki situasi di mana Anda mendeklarasikan dan mendefinisikan fungsi dalam satu langkah, yaitu jika Anda memasukkan definisi fungsi pada titik di mana Anda mendeklarasikannya. Jadi secara teknis saya kira benar itu benar. Tetapi pertanyaan itu diucapkan sedemikian rupa sehingga saya akan menjawabnya seperti yang Anda lakukan.
sumber
Selain hal "definisi juga pernyataan", berikut ini adalah hukum C ++:
Ini menyatakan dua fungsi,
f
dang
, keduanya tanpa argumen dan dengan tipe pengembalianint
, tetapi definisif
tidak diikuti (segera) oleh tanda titik koma. Demikian juga, ini legal:Tetapi memang tidak diperbolehkan untuk menghilangkan titik koma sepenuhnya dalam kasus-kasus ini, sehingga akan agak mengejutkan jika diambil sebagai contoh deklarasi tanpa titik koma berikut. Faktanya, yang berikut ini ilegal:
Selain deklarasi fungsi (hanya), definisi fungsi tidak dapat digabungkan dengan deklarasi atau definisi lain apa pun dengan tipe-specifier yang sama . (Jika ini legal, itu akan menentukan a
void *p
dan avoid f() {}
.)Bagaimanapun, ini tampaknya merupakan jenis pertanyaan "gotcha" yang tidak boleh dalam tes pemrograman tingkat menengah.
(Oh, omong-omong, tolong jangan benar-benar menulis kode seperti
int f(), i = 42;
.)sumber
typedef int fooProc(int); fooProc a,b.c.d.e;
saya tidak yakin mengapa header standar untuk kompiler berbasis floppy-drive tidak melakukan itu kembali di hari, karena saya akan berpikir itu akan memungkinkan file header menjadi jauh lebih kecil dan dengan demikian lebih cepat untuk diproses.int f(int(&g)(),int(*h)()){return g()+h();}
Ini memiliki tiga deklarasi fungsi, salah satunya diikuti oleh kurung kurawal terbuka, yang lain dengan koma, dan yang ketiga oleh kurung tutup.int f(stuff)
. Bahkan dalam lingkup fungsi,g
adalah variabel otomatis tipe referensi ke fungsi , danh
merupakan pointer ke fungsi .Jawaban dan komentar lain menyebut beberapa dari banyak cara bahwa ini adalah pertanyaan yang mengerikan, menyesatkan, dan ditulis dengan buruk. Tetapi ada masalah lain yang belum diidentifikasi orang lain. Pertanyaannya adalah:
OK, mari kita lihat deklarasi fungsi:
Semuanya adalah deklarasi . Deklarasi tidak
int func()
dan kemudian diikuti oleh a;
. Deklarasiint func();
kemudian diikuti oleh spasi putih.Jadi, pertanyaannya adalah: apakah titik koma diperlukan setelah deklarasi ? Tentu saja tidak. Deklarasi tersebut sudah memiliki titik koma di dalamnya yang mengakhiri itu. Titik koma setelah deklarasi tidak ada gunanya. Sebaliknya,
int func(); ;
akan menjadi titik koma setelah deklarasi fungsi .Pertanyaan itu hampir pasti dimaksudkan untuk mengajukan pertanyaan "benar atau salah: token terakhir dalam deklarasi fungsi selalu merupakan titik koma" Tapi itu bukan pertanyaan yang mereka tulis, karena penulis kuis itu tidak berpikir jernih tentang masalah tersebut.
Saran saya adalah untuk menghindari kuis bahasa pemrograman sama sekali. Mereka sangat mengerikan.
Fakta yang menyenangkan, sementara kita membahasnya. Dalam C #, ini semua legal:
Dalam C #, deklarasi kelas atau struct dapat diakhiri dengan tanda titik koma, atau tidak, sesuai kebijakan Anda. Fitur kecil yang aneh ini ditambahkan untuk kepentingan pemrogram C / C ++ yang datang ke C # yang memilikinya di ujung jari mereka bahwa deklarasi tipe diakhiri dengan titik koma; tim desain tidak ingin menghukum mereka karena memiliki kebiasaan ini. :-)
sumber
Anda dapat mendeklarasikan fungsi seperti ini juga:
Pernyataan itu sangat ambigu. Jawaban yang benar adalah: itu tergantung pada bagaimana Anda mendeklarasikan fungsinya.
Lagi pula, saya akan memilih salah juga, dan mungkin Anda dapat melaporkan pertanyaan itu kepada seseorang.
sumber
Benar . Titik koma tidak diperlukan setelah deklarasi apa pun. Atau setelah definisi apa pun. Atau setelah pernyataan apa pun.
Banyak jenis deklarasi harus diakhiri dengan titik koma, seperti sintaks pada bagian 7 [dcl.dcl] yang ditentukan. Tetapi tidak perlu menulis yang kedua setelah itu.
sumber
Ini tergantung pada apakah kita mendeklarasikan atau mendefinisikan fungsi. Jika kita mendeklarasikan fungsinya, kita perlu menyertakan tanda titik koma (
;
), dan jika kita mendefinisikan fungsi, tanda titik koma tidak diperlukan.Deklarasi seperti ini:
Dan definisi adalah seperti ini:
sumber
Meskipun saya setuju dengan hampir semua jawaban lain, menyatakan bahwa pertanyaannya sangat ambigu, dan bahwa jawaban Anda secara teknis benar, izinkan saya untuk memberikan perspektif yang berbeda:
Beginilah saya selalu memanggil mereka:
Saya berasumsi pertanyaan itu dibuat dengan terminologi ini dalam pikiran.
Definisi dan deklarasi adalah konsep yang sama di mata saya. "Saya mendefinisikan x = y" == "Saya menyatakan x = y".
Tapi tentu saja, ada perbedaan besar antara prototipe fungsi (di atas) dan definisi fungsi yang sebenarnya.
sumber
void func();
persis sama denganvoid func(void);
. Ini sangat berbeda dari C , di manavoid func();
tidak memberitahu kompiler apa pun tentang args, dan tidak sama denganvoid func(void);
. Prototipe atau definisi yang lebih baru adalah ide yang bagus, jika tidak, penelepon harus menerapkan promosi arg default (misalnya float -> double, dan tipe integer sempit untukint
. Aturan yang sama seperti untuk args ke fungsi variadic.)Sayang sekali pertanyaan yang Anda ambil tidak mengatakan "langsung setelah". Misalnya kita bisa menulis ini:
Atau saya bisa menulis:
Dalam kasus pertama, titik koma tidak secara langsung setelah deklarasi, tetapi itu tidak masalah.
Dalam kasus kedua ada tanda koma "setelah" deklarasi, tetapi tidak secara langsung setelahnya.
Saya pikir Eric Lippert memiliki ide yang tepat dalam jawabannya .
Itu seperti mengatakan "haruskah ada periode setelah akhir kalimat dalam bahasa Inggris?". Bisa dibilang, kalimat sudah memiliki periode di akhir (kalau tidak itu tidak akan menjadi kalimat) dan karenanya tidak boleh ada periode setelah kalimat ..
sumber
int func() int a=42;
tidak dikompilasi. Anda perlu koma, bukan yang lainint
. Lihat jawaban @ Arne yang diposting sehari sebelum ini. Satu-satunya hal baru dalam jawaban ini adalah paragraf terakhir, dengan analogi kalimat bahasa Inggris.Anda dapat menggunakan
;
hanya untuk prototipe.sumber
Ini semacam pertanyaan rumit, tetapi mereka menggunakan kata deklarasi yang artinya kira-kira seperti ini:
Jadi benar dalam kasus ini.
Jika mereka menggunakan implementasi kata maka itu salah.
sumber
Titik koma (;) digunakan untuk memberi tahu kompiler bahwa setelah titik koma (;) ini, sebuah pernyataan baru dimulai.
Jadi saya pikir titik koma (;) diperlukan selama deklarasi fungsi saja. Jadi menurut saya, jawabannya akan benar.
sumber
Ketika fungsi didefinisikan sebelum main () :
Ketika fungsi didefinisikan setelah main () :
sumber