Menjadikan i = i 1 Sah dalam C 17
Dalam C 11, ungkapan "i = i 1" ialah tingkah laku yang tidak ditentukan kerana jaminan penjujukan yang tidak mencukupi. Walau bagaimanapun, dalam C 17, ungkapan ini menjadi undang-undang. Inilah sebabnya:
C 11
Dalam C 11, peraturan penjujukan untuk pengendali tugasan (=) menyatakan bahawa tugasan telah disusun selepas pengiraan nilai hak dan operan kiri. Walau bagaimanapun, tiada peraturan khusus wujud untuk penjujukan relatif tugasan dan kesan sampingan dalam operan yang betul. Kekurangan penjujukan ini membawa kepada tingkah laku yang tidak ditentukan dalam kes seperti "i = i 1," di mana kesan sampingan (bertambah i) dan tugasan berpotensi tidak tersusun.
C 17
C 17 memperkenalkan peraturan penjujukan baharu untuk pengendali tugasan: "Operan kanan disusun sebelum operan kiri." Ini bermakna semua kesan sampingan dan pengiraan nilai dalam operan kanan disusun sepenuhnya sebelum sebarang tindakan berlaku pada operan kiri, termasuk tugasan itu sendiri.
Kesan pada "i = i 1"
Dengan peraturan penjujukan baharu dalam C 17, ungkapan "i = i 1" menjadi sah kerana kesan sampingan penambahan i (dilakukan oleh operator postfix) kini dijamin berlaku sebelum tugasan. Oleh itu, tindakan memberikan nilai "i 1" kepada i diasingkan sepenuhnya daripada kesan sampingan, menghapuskan tingkah laku tidak ditentukan yang wujud dalam C 11.
Ringkasnya, perubahan dalam peraturan penjujukan untuk tugasan operator dalam C 17 memastikan bahawa penilaian "i = i 1" mengikut urutan tertentu, membenarkan kesan sampingan penambahan i mendahului tugasan itu sendiri, menyelesaikan tingkah laku tidak ditentukan yang wujud dalam C 11.
Atas ialah kandungan terperinci Mengapakah \'i = i 1\' sah dalam C 17 tetapi tingkah laku tidak ditentukan dalam C 11?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!