Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa pembolehubah tidak diinisialisasi dalam C mencetak nilai yang kelihatan rawak?

Mengapa pembolehubah tidak diinisialisasi dalam C mencetak nilai yang kelihatan rawak?

DDD
DDDasal
2024-11-09 08:29:02405semak imbas

Why do uninitialized variables in C   print seemingly random values?

Menyelami Enigma Pembolehubah Tidak Dimulakan: Mengapa Nilai Pelik Muncul

Dalam bidang pengekodan, pembolehubah yang tidak dimulakan boleh mengeluarkan hasil yang membingungkan. Satu teka-teki sedemikian timbul apabila cuba mencetak pembolehubah sedemikian, yang membawa kepada output berangka misterius.

Untuk membongkar misteri ini, mari kita periksa kod C yang disediakan:

int var;
cout << var << endl;

Ia mengisytiharkan pembolehubah integer var tanpa sebarang nilai awal. Apabila mencetak var, ia menghasilkan nombor arbitrari seperti 2514932. Ini kerana pembolehubah tanpa nilai awal menyimpan data sampah, yang mewakili bit rawak yang disimpan dalam ingatan.

Begitu juga, apabila mencetak var pembolehubah berganda yang tidak diinisialisasi, var yang tidak dijangka sama. nilai seperti 1.23769e-307 boleh muncul. Ini juga berpunca daripada sifat kandungan awalnya yang tidak ditentukan.

Perils of Undefined Behavior

Isu asasnya terletak pada konsep "tingkah laku yang tidak ditentukan." Dalam C , mengakses pembolehubah yang tidak dimulakan melanggar peraturan ini, mengakibatkan akibat yang tidak dapat diramalkan. Penyusun tidak diwajibkan untuk mengendalikan situasi sedemikian dengan anggun, pada dasarnya berkata, "Lakukan apa yang anda kehendaki; Saya melepaskan diri saya daripada sebarang tanggungjawab."

Akibat dalam Amalan

Mari kita menggambarkan ini dengan contoh dunia sebenar:

#include <iostream>

const char* test()
{
    bool b; // uninitialized

    switch (b) // undefined behavior!
    {
    case false:
        return "false";      // garbage was zero (zero is false)
    case true:
        return "true";       // garbage was non-zero (non-zero is true)
    default:
        return "impossible"; // options are exhausted, this must be impossible...
    }
}

int main()
{
    std::cout << test() << std::endl;
}

Secara intuitif, seseorang mungkin menjangkakan ujian fungsi tidak akan kembali "mustahil" kerana kedua-dua pilihan untuk nilai kebenaran dan palsu dilindungi. Walau bagaimanapun, tingkah laku yang tidak ditentukan boleh menjadikan yang mustahil menjadi mungkin. Menyusun kod dengan g -02 mungkin menunjukkan fenomena ini.

Kesimpulan

Untuk mengelakkan tingkah laku yang tidak dapat diramal yang dikaitkan dengan pembolehubah yang tidak dimulakan, adalah penting untuk memulakannya dengan nilai yang sesuai . Amalan mudah ini memastikan kod anda tidak menyelidiki alam keruh tingkah laku yang tidak ditentukan, memastikan program anda berfungsi seperti yang dimaksudkan.

Atas ialah kandungan terperinci Mengapa pembolehubah tidak diinisialisasi dalam C mencetak nilai yang kelihatan rawak?. 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