Rumah > pembangunan bahagian belakang > C++ > Mengapa pengkompil membenarkan permulaan kendiri pembolehubah dalam C/C?

Mengapa pengkompil membenarkan permulaan kendiri pembolehubah dalam C/C?

Susan Sarandon
Lepaskan: 2024-11-16 06:50:03
asal
579 orang telah melayarinya

Why does the compiler allow self-initialization of variables in C/C  ?

Pembolehubah Tidak Dimulakan dalam Permulaan Kendiri: Tingkah Laku dan Piawaian

Dalam bidang pengaturcaraan, selalunya menjadi kebimbangan untuk menggunakan pembolehubah yang tidak dimulakan kes pembolehubah yang tidak dimulakan digunakan sebagai pemulanya sendiri, senario unik timbul.

Pertimbangkan kod berikut:

int main(void) {
    int i = i;
}
Salin selepas log masuk

Anehnya, kod ini ialah Ia boleh disusun dengan clang/gcc /clang /g menggunakan piawaian seperti 11. Selain itu, pengkompil tidak mengeluarkan sebarang amaran apabila anda menentukan pilihan -Wall -Wextra.

Walau bagaimanapun, jika anda menukar kod anda kepada int i = i 1 dan menentukan pilihan -Wall, anda mungkin menerima amaran yang serupa dengan yang berikut:

why.c:2:13: warning: variable 'i' is uninitialized when used within its own initialization [-Wuninitialized]
    int i = i + 1;
        ~   ^
1 warning generated.
Salin selepas log masuk

Jadi mengapa pengkompil membenarkan kod ini? Selain itu, bagaimanakah piawaian C/C menentukan perkara ini?

Toleransi Pengkompil

Pembolehubah i tidak dimulakan apabila ia dimulakan sendiri, jadi ia mempunyai nilai bukan khusus pada ketika itu. Nilai bukan khusus ialah sama ada nilai tidak ditentukan atau ungkapan perangkap.

Jika pelaksanaan menyokong bit pemadat untuk jenis integer dan nilai tidak khusus adalah ungkapan perangkap, menggunakannya akan mengakibatkan gelagat tidak ditentukan.

Jika pelaksanaan tidak mempunyai bit padding integer, nilainya hanya tidak ditentukan dan tiada gelagat tidak ditentukan berlaku.

Peruntukan Standard

Seksyen 6.3.2.1p2 butiran standard C11:

lvalue mewakili objek dengan tempoh storan automatik, objek boleh diisytiharkan dengan kelas storan daftar (alamat tidak pernah diambil), dan objek tidak diinisialisasi ( Jika ia tidak diisytiharkan dalam pemula dan tidak tugasan dilakukan sebelum digunakan), tingkah lakunya tidak ditentukan.

Jadi jika anda tidak pernah mendapatkan alamat i, anda akan mendapat tingkah laku yang tidak ditentukan. Jika tidak, pernyataan di atas terpakai.

Atas ialah kandungan terperinci Mengapa pengkompil membenarkan permulaan kendiri pembolehubah dalam C/C?. 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