Dalam sebuah wawancara saya dihadapkan pada pertanyaan seperti ini:
Teman Anda telah memberi Anda satu file kode sumber yang mencetak angka Fibonacci di konsol. Perhatikan bahwa blok main () kosong dan tidak memiliki pernyataan apa pun di dalamnya.
Jelaskan bagaimana ini mungkin (petunjuk: contoh global!)
Saya benar-benar ingin tahu tentang ini, bagaimana hal seperti itu bisa menjadi mungkin!
assert
atau#pragma message
dll. Ini akan mengarahkan keluaran ke konsol selama kompilasi. Program ini mungkin tidak pernah sepenuhnya dikompilasi, tetapi ini pasti cara yang menyenangkan untuk menunjukkan pemikiran "out-of-the-box" Anda selama wawancara. Ini memenuhi pertanyaan yang dikutip karena TIDAK menyebutkan apa pun tentang biner yang dihasilkan; melainkan hanya berbicara tentang file C yang dapat menampilkan "barang" di konsol. ;-)Jawaban:
Ini kemungkinan besar diterapkan sebagai (atau varian dari itu):
void print_fibs() { //implementation } int ignore = (print_fibs(), 0); int main() {}
Dalam kode ini, variabel global
ignore
harus diinisialisasi sebelum masuk kemain()
fungsi. Sekarang untuk menginisialisasi global,print_fibs()
perlu dijalankan di mana Anda dapat melakukan apa saja - dalam hal ini, hitung nomor fibonacci dan cetak! Hal serupa yang saya tunjukkan dalam pertanyaan berikut (yang sudah lama saya tanyakan):Perhatikan bahwa kode seperti itu tidak aman dan sebaiknya dihindari secara umum. Misalnya,
std::cout
objek mungkin tidak diinisialisasi saatprint_fibs()
dijalankan, jika demikian maka apa yang akanstd::cout
dilakukan dalam fungsinya? Namun, jika dalam keadaan lain, tidak bergantung pada urutan inisialisasi, maka aman untuk memanggil fungsi inisialisasi (yang merupakan praktik umum di C dan C ++).sumber
std::ios_base::Init
objek. Dan<iostream>
dijamin untuk berperilaku "seolah-olah" itu berisi instance daristd::ios_base_Init
objek pada lingkup namespace.(print_fibs(), 0)
adalahint
. Ini Demo Online .bool
, dan variabelbool fibsPrinted
. Itu mungkin sedikit lebih bersih jika fungsinya hanya berfungsi di sini. (Tapi perbedaannya mungkin tidak cukup untuk dikhawatirkan.)std::cout
ada di suatu tempat di perpustakaan. Tapi seperti yang telah saya tunjukkan, standar mengharuskannya untuk diinisialisasi sebelum konstruktor pertama dari suatustd::ios_base::Init
objek selesai, dan itu mengharuskan termasuk<iostream>
berperilaku seolah-olah sebuahstd::ios_base::Init
objek didefinisikan pada ruang lingkup namespace. Jika unit terjemahan termasuk<iostream>
sebelum definisi objek yang diinisialisasi,std::cout
dijamin akan dibangun.Semoga ini membantu
class cls { public: cls() { // Your code for fibonacci series } } objCls; int main() { }
Jadi segera setelah variabel global kelas dideklarasikan, konstruktor dipanggil dan di sana Anda menambahkan logika untuk mencetak deret Fibonacci.
sumber
Ya itu mungkin. Anda perlu mendeklarasikan instance global dari suatu objek yang menghitung bilangan Fibonacci dalam konstruktor objek.
sumber
Saya tahu beberapa contoh seperti yang Anda ceritakan. Salah satu cara mendapatkannya adalah dengan menggunakan template metaprogramming. Dengan menggunakannya, Anda dapat memindahkan beberapa proses komputasi ke kompilasi.
Di sini Anda bisa mendapatkan contoh dengan angka Fibonacci
Jika Anda menggunakannya dalam konstruktor kelas statis dan Anda dapat menulis angka tanpa perlu menulis kode apa pun di fungsi utama.
Semoga membantu Anda.
sumber
Hal-hal dapat terjadi selama inisialisasi variabel global / statis. Kode akan dipicu saat aplikasi dimulai.
sumber
Semua konstruktor [*] untuk objek cakupan file dipanggil sebelum mencapai
main
, seperti halnya semua ekspresi penginisialisasi untuk variabel cakupan file non-objek.Sunting: Juga, semua penghancur [*] untuk semua objek lingkup file dipanggil dalam urutan terbalik konstruksi setelah
main
keluar. Anda bisa, secara teoritis, meletakkan program fibonacci Anda pada sebuah penghancur benda.[*] Perhatikan bahwa 'semua' mengabaikan perilaku pemuatan dan pembongkaran pustaka secara dinamis yang tidak ditautkan secara langsung oleh program Anda. Mereka secara teknis berada di luar bahasa C ++ dasar.
sumber
main
?main
kosong, jadi DLL / DSO tersebut harus dimuat oleh destruktor, yang sangat menyimpang. Tapi, karena ilmu komputer, saya kira kita harus berhati-hati dengan kata-kata seperti "semua".