Rumah >pembangunan bahagian belakang >C++ >Mengapa pengkompil membenarkan permulaan kendiri pembolehubah dalam C/C?
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; }
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.
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!