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
Lepaskan: 2024-12-04 00:22:09
asal
659 orang telah melayarinya

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;
Salin selepas log masuk

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++());
Salin selepas log masuk
Salin selepas log masuk

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++());
Salin selepas log masuk
Salin selepas log masuk

Dan ungkapan kedua bersamaan dengan:

(i.operator++()).operator++()).operator++();
Salin selepas log masuk

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;
Salin selepas log masuk

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!

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