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
603 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!

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