Tingkah Laku Tidak Tertakrif dan Titik Urutan Disemak Semula
Dalam sekuel topik ini "Tingkah Laku Tidak Tertakrif dan Titik Urutan," kami menyelidiki tingkah laku ungkapan yang melibatkan ditentukan pengguna jenis.
Jenis Ditentukan Pengguna dan Kelakuan Tidak Ditakrifkan
Pertimbangkan ungkapan berikut yang melibatkan Indeks jenis yang ditentukan pengguna:
i += ++i;
Tingkah laku ungkapan ini dengan jenis terbina dalam tidak ditentukan. Walau bagaimanapun, adakah ia masih menggunakan gelagat yang tidak ditentukan jika i adalah jenis Indeks?
Tidak, tidak. Ini kerana ungkapan menjadi bersamaan dengan:
i.operator+=(i.operator++());
Memandangkan operator terlampau beban adalah fungsi, peraturan penjujukan biasa digunakan. Titik jujukan wujud selepas penilaian i.operator (), jadi pengubahsuaian seterusnya bagi i dalam i.operator =() tidak melanggar mana-mana peraturan tingkah laku yang tidak ditentukan.
Begitu juga, ungkapan i.add(i .inc()); dan saya jelas. Ungkapan pertama bersamaan dengan:
i.operator+=(i.operator++());
Dan ungkapan kedua bersamaan dengan:
(i.operator++()).operator++()).operator++();
Setiap ungkapan ini mempunyai titik urutan selepas penilaian ekspresi operator () , memastikan objek i tidak diubah suai dua kali antara titik jujukan berturut-turut.
Subskrip Operator Overload
Ungkapan:
a[++i] = i;
di mana a ialah jenis yang ditentukan pengguna yang melebihkan operator subskrip, juga ditakrifkan dengan baik. Operator kenaikan mengembalikan objek Indeks, yang kemudiannya digunakan untuk mengindeks tatasusunan. Operator tugasan = adalah bersamaan dengan kaedah operator[](), iaitu panggilan fungsi. Oleh itu, peraturan penjujukan digunakan, dan titik jujukan wujud selepas penilaian i. Akibatnya, ungkapan itu ditakrifkan dengan baik.
Mata Tambahan
Atas ialah kandungan terperinci Adakah Operator Lebih Muatan dalam C Menghapuskan Gelagat Tidak Ditakrifkan dalam Ungkapan seperti `i = i`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!