Dalam ansuran sebelumnya, "Tingkah Laku Tidak Tertakrif dan Titik Urutan," kami membincangkan potensi tingkah laku yang tidak ditentukan yang berkaitan dengan ungkapan:
i += ++i;
Apabila i ialah jenis terbina dalam, ungkapan ini memanggil gelagat tidak ditentukan kerana objek i diubah suai dua kali antara titik jujukan berturut-turut.
Walau bagaimanapun, jika i adalah jenis yang ditentukan pengguna, seperti kelas Indeks yang ditakrifkan di bawah:
class Index { int state; public: Index(int s) : state(s) {} Index& operator++() { state++; return *this; } Index& operator+=(const Index & index) { state+= index.state; return *this; } operator int() { return state; } Index & add(const Index & index) { state += index.state; return *this; } Index & inc() { state++; return *this; } };
Adakah ungkapan i = i masih menggunakan gelagat yang tidak ditentukan?
Anehnya, tidak. Ungkapan i = i dengan jenis yang ditentukan pengguna i tidak menggunakan gelagat yang tidak ditentukan kerana pengendali terlampau beban dianggap sebagai fungsi dalam C . Menurut seksyen 1.9.17 standard C ISO:
Apabila memanggil fungsi (sama ada fungsi itu sebaris atau tidak), terdapat titik jujukan selepas penilaian semua hujah fungsi...
Oleh itu, panggilan kepada operator dan operator = fungsi memperkenalkan titik jujukan, menghalang tingkah laku yang tidak ditentukan.
Ungkapan a[ i] = i juga ditakrifkan dengan baik apabila a ialah jenis yang ditentukan pengguna dengan operator subskrip yang terlebih beban, kerana ia dianggap sebagai panggilan fungsi dengan titik jujukan selepas menilai ungkapan i.
Dalam C 03, ungkapan i ditakrifkan dengan baik, kerana ia bersamaan dengan berkesan dengan:
((i.operator++()).operator++()).operator++();
Dengan setiap panggilan fungsi memperkenalkan titik jujukan, menjadikan ungkapan itu ditakrifkan dengan baik.
Atas ialah kandungan terperinci Adakah `i = i` Sentiasa Tingkah Laku Tidak Ditakrifkan dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!