Rumah > pembangunan bahagian belakang > C++ > Adakah `i = i` Mendapat Gelagat Tidak Ditakrifkan dengan Jenis Ditentukan Pengguna dalam C ?

Adakah `i = i` Mendapat Gelagat Tidak Ditakrifkan dengan Jenis Ditentukan Pengguna dalam C ?

Mary-Kate Olsen
Lepaskan: 2024-12-05 10:36:15
asal
815 orang telah melayarinya

Does `i  =   i` Invoke Undefined Behavior with User-Defined Types in C  ?

Tingkah Laku Tidak Tentu Disemak Semula: Titik Urutan dan Jenis Ditentukan Pengguna

Soalannya:

Dalam ansuran sebelumnya mengenai tingkah laku dan titik urutan yang tidak ditentukan, ungkapan i = i telah dianggap untuk menggunakan gelagat yang tidak ditentukan untuk jenis terbina dalam. Walau bagaimanapun, persoalan timbul: bagaimana jika jenis i ditentukan oleh pengguna? Secara khusus, katakan kita mempunyai Indeks kelas dengan pengendali terlampau beban.

Jawapan: Tingkah Laku yang Tidak Ditakrifkan vs. Tingkah Laku yang Ditakrifkan dengan Baik

Bertentangan dengan gerak hati, ternyata bahawa ungkapan i = i tidak menggunakan tingkah laku yang tidak ditentukan untuk jenis yang ditentukan pengguna seperti Indeks. Ini adalah kerana pengendali terlampau beban dalam Indeks dianggap sebagai fungsi. Menurut piawaian ISO C, penilaian fungsi memperkenalkan titik jujukan selepas penilaian argumen fungsi dan satu lagi selepas menyalin nilai yang dikembalikan.

Titik Jujukan dan Operator Terlebih Beban

Dalam kes i = i, ungkapan i dinilai sebelum ia diluluskan sebagai hujah kepada operator =. Ini bermakna terdapat titik jujukan selepas penilaian i, memastikan objek i diubah suai hanya sekali antara titik jujukan berturut-turut.

Oleh itu, ungkapan i = i untuk jenis yang ditentukan pengguna seperti Indeks adalah setara. untuk menulis i.operator =(i.operator ());, yang merupakan ungkapan yang jelas tanpa tingkah laku yang tidak ditentukan. Perkara yang sama berlaku pada ungkapan yang lebih ringkas secara sintaksis i.add(i.inc());.

Perbezaan Halus:

Adalah penting untuk ambil perhatian bahawa i = i bukan ungkapan dalam erti kata tatabahasa C. Sebaliknya, ia adalah "ungkapan pernyataan," yang merupakan gabungan sintaksis bagi ungkapan dan pernyataan. Ungkapan penyataan dilaksanakan sebagai penyataan biasa, tetapi hasilnya juga boleh ditugaskan kepada pembolehubah.

Gelagat a[ i] = i

Jika a ialah tatasusunan daripada jenis terbina dalam, ungkapan a[ i] = i menimbulkan gelagat yang tidak ditentukan kerana nilai l a[ i] dinilai dua kali: sekali dalam ungkapan i dan sekali lagi dalam tugasan i = i.

Walau bagaimanapun, jika a ialah jenis yang ditentukan pengguna yang membebankan operator subskrip, ungkapan mungkin berkelakuan berbeza bergantung pada pelaksanaan operator subskrip. Contohnya, jika operator subskrip dilaksanakan menggunakan const Index& operator[](Index i), maka ungkapan akan ditakrifkan dengan baik kerana nilai l a[ i] dinilai sekali sahaja, sebelum operator subskrip dipanggil.

Kesahan i;

Ungkapan i; ditakrifkan dengan baik dalam C 03, kerana ia bersamaan dengan ((i.operator ()).operator ()).operator (). Ini kerana setiap operator memperkenalkan titik jujukan, memastikan objek i diubah suai sekali sahaja antara titik jujukan berturut-turut.

Atas ialah kandungan terperinci Adakah `i = i` Mendapat Gelagat Tidak Ditakrifkan dengan Jenis Ditentukan Pengguna dalam C ?. 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