Rumah >pembangunan bahagian belakang >C++ >Adakah Operator Lebih Muatan dalam C Menghapuskan Gelagat Tidak Ditakrifkan dalam Ungkapan seperti `i = i`?

Adakah Operator Lebih Muatan dalam C Menghapuskan Gelagat Tidak Ditakrifkan dalam Ungkapan seperti `i = i`?

Barbara Streisand
Barbara Streisandasal
2024-12-04 00:22:09660semak imbas

Does Overloading Operators in C   Eliminate Undefined Behavior in Expressions like `i  =   i`?

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

  • Bilangan titik jujukan yang dikaitkan dengan ungkapan bergantung pada jenis operan yang terlibat, seperti yang ditunjukkan oleh kes i = i.
  • Dalam C 03, ungkapan i ialah jelas.

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!

Kenyataan:
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