Mengapa i = i 1; Menjadi Undang-undang dalam C 17
Dalam C 11, coretan kod "i = i 1;" menimbulkan tingkah laku yang tidak ditentukan. Walau bagaimanapun, dalam C 17, kod ini boleh diterima di sisi undang-undang. Perubahan ini berpunca daripada jaminan penjujukan yang dipertingkatkan yang diperkenalkan dalam C 17.
Menurut piawaian C 11 [N3337 basic.exec], penjujukan kesan sampingan adalah tidak berjujukan melainkan dinyatakan secara jelas. Dalam kod contoh, pengendali tugasan (=) dan operator kenaikan postfix ( ) kedua-duanya mempunyai kesan sampingan yang boleh membawa kepada tingkah laku yang tidak ditentukan jika tidak disusun dengan betul.
Dalam C 17, ayat baharu telah ditambahkan pada [ N4659 expr.ass] yang menjelaskan peraturan penjujukan untuk pengendali tugasan:
The right operand is sequenced before the left operand.
Pernyataan tambahan ini memastikan bahawa semua kesan sampingan dalam operan kanan dilaksanakan sebelum sebarang kesan sampingan dalam operan kiri, termasuk tugasan sendiri.
Dalam kes "i = i 1;", operan kanan (i 1) terdiri daripada pengendali kenaikan postfix (i ) dan pemalar 1. Jaminan penjujukan yang diperkenalkan dalam C 17 memastikan bahawa kenaikan postfix dilakukan dan kesan sampingannya berlaku sebelum tugasan dilaksanakan. Ini menghapuskan gelagat tidak jelas yang terdapat dalam C 11.
Oleh itu, jaminan penjujukan yang dipertingkatkan dalam C 17 telah menjadikan "i = i 1;" sah dengan memastikan bahawa kesan sampingan operan kanan dan kiri disusun dengan betul, menghalang tingkah laku yang tidak ditentukan.
Atas ialah kandungan terperinci Mengapakah \'i = i 1;\' Menjadi Operasi yang Sah dalam C 17?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!