Rumah > pembangunan bahagian belakang > C++ > Mengapa Menetapkan Nilai Peta dalam C Menghasilkan Keputusan Yang Tidak Dijangka?

Mengapa Menetapkan Nilai Peta dalam C Menghasilkan Keputusan Yang Tidak Dijangka?

DDD
Lepaskan: 2024-10-28 15:10:02
asal
622 orang telah melayarinya

 Why Does Assigning a Map Value in C   Produce Unexpected Results?

Tertib Penilaian dalam Penyata Tugasan C

Apabila memberikan nilai pada peta dalam C , susunan penilaian boleh membawa kepada hasil yang berlawanan dengan intuitif. Pertimbangkan kod berikut:

peta mp;
printf("%d ", mp.size());
mp[10]=mp.size();
printf("%dn", mp[10]);

Kod ini mencetak 0 dan kemudian 1, manakala seseorang mungkin menjangkakan 0 dan 0. Ini kerana:

  1. Kanan-ke-Kiri Penilaian: Pengendali tugasan dalam C mengaitkan dari kanan ke kiri, bermakna mp[10] dinilai sebelum mp.size().
  2. Rujukan Sementara: Bahagian kiri daripada tugasan mp[10] mencipta rujukan sementara kepada elemen peta asas. Elemen ini pada mulanya tidak dimulakan, jadi mp.size() pada mulanya mengembalikan 0.
  3. Pengubahsuaian Nilai: Tugasan mp[10]=mp.size() menetapkan nilai mp[10 ] kepada saiz semasa peta, iaitu 0.
  4. Pelanjutan Hayat Rujukan: Tugasan memanjangkan jangka hayat rujukan sementara yang dibuat oleh mp[10].
  5. Penilaian Akhir: mp[10] kini menunjuk kepada elemen yang diubah suai, jadi printf("%d", mp[10]); mencetak nilai 1 yang dikemas kini.

Tingkah Laku Tidak Ditentukan

Tingkah laku tertentu ini tidak dinyatakan dalam piawaian C. Walau bagaimanapun, cadangan baru-baru ini (N4228) bertujuan untuk menjelaskan susunan penilaian dalam kes sedemikian.

Bahagian [expr.ass]p1 cadangan yang disemak menyatakan bahawa:

"Operan yang betul ialah dijujukan sebelum operan kiri."

Ini bermakna dalam contoh di atas, mp.size() akan dinilai sebelum mp[10], menghasilkan output yang dijangkakan 0 dan 0.

Kemas kini

Adalah penting untuk ambil perhatian bahawa dalam C 17, tingkah laku ini telah dinyatakan dalam standard, seperti dalam semakan 3 cadangan p0145. Operan kanan kini disusun secara eksplisit sebelum operan kiri dalam pernyataan tugasan.

Atas ialah kandungan terperinci Mengapa Menetapkan Nilai Peta dalam C Menghasilkan Keputusan Yang Tidak Dijangka?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan