Rumah >pembangunan bahagian belakang >C++ >Mengapa Menggunakan Rentetan Format Tidak Betul dalam Kelakuan Tidak Ditakrifkan `printf`?
Gelagat Tidak Dijangka dalam printf dengan Rentetan Format Tidak Betul
Dalam pengaturcaraan C, fungsi printf ialah alat yang berkuasa untuk mencetak output berformat. Walau bagaimanapun, penggunaan rentetan format yang tidak betul boleh membawa kepada akibat yang tidak dapat diramalkan.
Pertimbangkan baris kod berikut:
#include <iostream> #include <cstdio> int main() { std::cout << sizeof(int) << std::endl << sizeof(long) << std::endl; long a = 10; long b = 20; std::printf("%d, %d\n", a, b); return 0; }
Walaupun program ini secara amnya menghasilkan hasil yang diharapkan, kelakuannya sebenarnya tidak ditentukan apabila dipanggil dengan rentetan format yang salah. Seperti yang dinyatakan oleh Piawaian C99 (7.19.6.1:9):
Jika spesifikasi penukaran tidak sah, tingkah laku itu tidak ditentukan. Jika mana-mana argumen bukan jenis yang betul untuk spesifikasi penukaran yang sepadan, gelagat itu tidak ditentukan.
Dalam contoh ini, rentetan format "%d" menjangkakan argumen integer, manakala argumen yang disediakan adalah jenis yang panjang. Ketidakpadanan ini boleh membawa kepada keluaran yang salah, ranap sistem atau gelagat lain yang tidak dapat diramalkan.
Perlu ambil perhatian bahawa gelagat yang tidak ditentukan tidak terhad kepada kes yang hujahnya tidak betul. Walaupun hujah adalah jenis yang betul, menggunakan rentetan format yang tidak sah masih boleh mendatangkan akibat yang memudaratkan. Sebagai contoh, menggunakan "%s" (rentetan) untuk mencetak integer boleh membawa kepada tingkah laku yang tidak ditentukan.
Oleh itu, adalah penting untuk menyemak rentetan format dengan teliti sebelum menggunakan printf dan memastikan ia sepadan dengan jenis argumen yang sedang lulus. Kegagalan berbuat demikian boleh mengakibatkan tingkah laku program yang tidak dijangka dan tidak boleh dipercayai.
Atas ialah kandungan terperinci Mengapa Menggunakan Rentetan Format Tidak Betul dalam Kelakuan Tidak Ditakrifkan `printf`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!