Mengapa Adakah `int i = i;` Menyusun dengan Gelagat Tidak Ditakrifkan?

Linda Hamilton
Lepaskan: 2024-11-11 07:21:03
asal
593 orang telah melayarinya

Why Does `int i = i;` Compile with Undefined Behavior?

Gelagat Pembolehubah Tidak Dimulakan Digunakan Sebagai Pemula Sendiri

Kod dalam C/C ini menimbulkan persoalan tentang kelakuannya:

int i = i;
Salin selepas log masuk

Walaupun terdapat pembolehubah yang tidak dimulakan, kod ini disusun tanpa amaran dan ralat. Mengapa ini berlaku, dan apakah yang dikatakan piawai tentang kelakuannya?

Nilai Tidak Tentu dan Kebergantungan Pelaksanaan

Apabila pembolehubah seperti i digunakan untuk memulakan dirinya sendiri, ia mengandungi nilai yang tidak tentu. Nilai ini sama ada boleh menjadi nilai yang tidak ditentukan atau perwakilan perangkap. Nilai yang tidak ditentukan tidak ditakrifkan oleh standard dan bergantung kepada pelaksanaan. Perwakilan perangkap, jika disokong oleh pelaksanaan, mencetuskan gelagat yang tidak ditentukan apabila digunakan.

Gelagat Tidak Ditakrifkan dengan Padding

Jika pelaksanaan memperuntukkan bit padding dalam jenis integer, dan jika nilai tak tentu ialah perwakilan perangkap, kemudian menggunakannya menghasilkan tingkah laku yang tidak ditentukan. Ini kerana mengakses perwakilan perangkap menyebabkan hasil yang tidak dijangka.

Nilai Tidak Ditentukan tanpa Padding

Walau bagaimanapun, jika pelaksanaan tidak memperuntukkan bit padding dalam integer, nilai tak tentu ialah hanya tidak ditentukan. Dalam kes ini, tiada gelagat yang tidak ditentukan dan nilai sebenar i ditentukan oleh pelaksanaan.

Gelagat Tidak Ditakrifkan dengan Alamat Diambil

Selain itu, tingkah laku itu boleh menjadi tidak ditakrifkan walaupun saya tidak mengambil alamatnya, seperti yang dinyatakan dalam piawaian C11:

"Jika nilai nilai menetapkan objek tempoh storan automatik yang boleh diisytiharkan dengan kelas storan daftar (tidak pernah alamat diambil), dan objek itu tidak dimulakan, tingkah lakunya tidak ditentukan."

Oleh itu, kelakuan kod ini bergantung kepada pelaksanaan dan boleh tidak ditentukan bergantung pada pelbagai faktor.

Atas ialah kandungan terperinci Mengapa Adakah `int i = i;` Menyusun dengan Gelagat Tidak Ditakrifkan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan