Ist Rekursion ohne Nebenwirkungen undefiniertes Verhalten?
In C 11 gelten Endlosschleifen ohne Nebenwirkungen, wie die folgenden, als undefiniert Verhalten (UB):
<code class="cpp">int main() { while (true) {} }</code>
Das Verhalten ist UB aufgrund einer Bestimmung im ISO C 11-Standard (1.10p24), die besagt:
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.
Diese Bestimmung gilt sowohl für Schleifenbeispiel und das folgende rekursive Programm:
<code class="cpp">void foo() { foo(); } int main() { foo(); }</code>
In diesem rekursiven Programm gibt es keine Nebenwirkungen, es wird jedoch auch als UB betrachtet, da es gegen die Annahme verstößt, dass jeder Thread irgendwann eine der aufgeführten Aktionen ausführen wird in 1.10p24.
Beachten Sie, dass die Rekursion auch dann undefiniertes Verhalten aufweisen könnte, wenn diese Bestimmung nicht vorhanden wäre, wenn sie den in der Implementierung definierten Grenzwert für verschachtelte rekursive Funktionsaufrufe überschreitet. Dies war in C immer der Fall, unabhängig von der Version.
Das obige ist der detaillierte Inhalt von## Ist Rekursion ohne Nebenwirkungen ein undefiniertes Verhalten in C?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!