Rumah >pembangunan bahagian belakang >C++ >Mengapa Menggunakan Rentetan Format Tidak Betul dalam Kelakuan Tidak Ditakrifkan `printf`?

Mengapa Menggunakan Rentetan Format Tidak Betul dalam Kelakuan Tidak Ditakrifkan `printf`?

Susan Sarandon
Susan Sarandonasal
2024-11-17 22:03:02585semak imbas

Why is Using Incorrect Format Strings in `printf` Undefined Behavior?

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn