Adakah Rekursi Tanpa Kesan Sampingan Kelakuan Tidak Ditakrifkan?
Dalam C 11, gelung tak terhingga tanpa kesan sampingan, seperti berikut, dianggap tidak ditentukan tingkah laku (UB):
<code class="cpp">int main() { while (true) {} }</code>
Tingkah laku tersebut adalah UB disebabkan oleh peruntukan dalam standard ISO C 11 (1.10p24) yang menyatakan:
The implementation may assume that any thread will eventually do one of the following: - terminate, - make a call to a library I/O function, - access or modify a volatile object, or - perform a synchronization operation or an atomic operation.
Peruntukan ini terpakai kepada kedua-dua contoh gelung dan atur cara rekursif berikut:
<code class="cpp">void foo() { foo(); } int main() { foo(); }</code>
Dalam atur cara rekursif ini, tiada kesan sampingan, tetapi ia juga dianggap UB kerana ia melanggar andaian bahawa mana-mana benang akhirnya akan melaksanakan salah satu tindakan yang disenaraikan dalam 1.10p24.
Perhatikan bahawa walaupun peruntukan ini tidak wujud, rekursi masih boleh menunjukkan gelagat yang tidak ditentukan jika ia melebihi had yang ditentukan pelaksanaan untuk panggilan fungsi rekursif bersarang. Ini selalu berlaku dalam C , tanpa mengira versinya.
Atas ialah kandungan terperinci ## Adakah Rekursi Tanpa Kesan Sampingan Kelakuan Tidak Ditakrifkan dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!