Valori ottenuti in caso di una funzione ricorsiva

Qualcuno può spiegarmi il motivo dietro l’output di questo programma per essere 0 0 0 0 0 ?

Qui stiamo usando una static variable var cui valori non cambieranno a causa delle chiamate di funzione. I valori di var saranno 4, 3, 2, 1 durante le chiamate ricorsive. Quando var diventa zero, la ricorsione termina e il controllo passa all’istruzione printf .

Perché l’output non è 1,2,3,4 ?

  main(){ static int var=5; if(--var) main(); printf(" %d ",var); } 

Ancora una volta se si usa se condition var-- allora l’output del programma sarà -1 -1 -1 -1 -1 -1 ?

Nella tua chiamata di ricorsione printf() viene eseguito quando restituisce main() . E poiché var è una static variable suo valore rimane 0 (ultimo valore = 0 uguale per tutte le chiamate di funzioni)

Nota if() condizione false quando var diventa 0 (ultimo valore, dopo main (); chiama non modificare var – notice diagram).

Spero che il seguente schema ti aiuti a capire (leggi i commenti):

 main() <---------------+ { | static int var=5; | <----"Declared only one/first time with value 5" if(--var) | ---- main(); ---------+ // called if var != 0 | // main called for var = 4, 3, 2, 1 |// recursion stooped |// return with 0 value |// now no operation applied on `var` so it remain 0 +--> printf(" %d ",var); // called when return ed } 

La durata residua della funzione statica è finché il programma non termina (quindi i valori non perdono) e Scope è in funzione.

14.1.6 Variabili statiche

L’ambito delle variabili statiche automatiche è identico a quello delle variabili automatiche, cioè è locale al blocco in cui è definito; tuttavia, la memoria allocata diventa permanente per la durata del programma. Le variabili statiche possono essere inizializzate nelle loro dichiarazioni; tuttavia, gli inizializzatori devono essere espressioni costanti e l’inizializzazione viene eseguita una sola volta al momento della compilazione quando viene allocata memoria per la variabile statica * .

Seconda domanda:

Ancora una volta se usi var-- allora il risultato sarà -1 -1 -1 -1 -1 -1 ?

Supponiamo che se la vostra condizione sarà var-- allora if() condizione pugno controlla true o false prima di decremento -- . (perché nell’espressione var-- , -- è postfix).
E poiché if() interrompe quando var == 0 chiamata ricorsiva si arresta e la funzione ritorna con valore decrementato da 0 a -1 . E poiché dopo il ritorno la var non cambia, quindi l’output è -1 per tutti.

I valori di var saranno 4, 3, 2, 1 durante le chiamate ricorsive. Quando var diventa zero, la ricorsione termina e il controllo passa all’istruzione printf() Perché l’output non è 1, 2, 3, 4 ?

Una variabile statica è una variabile che è stata allocata staticamente, la cui durata o “estensione” si estende per l’intera esecuzione del programma.

Quindi il valore di var cambia ogni volta e infine diventa 0 e printf() viene eseguito dopo il ritorno di main e poiché il valore di var è 0 , ogni istruzione printf() stamperà 0 .

Le variabili statiche sono quelle variabili il cui tempo di vita rimane uguale alla durata del programma. Le variabili statiche vengono inizializzate una volta . Il valore della variabile cambierà dopo ogni chiamata di sistema. Se non avessi dichiarato la variabile come statica, ci sarebbe stata una ricorsione infinita risultante in un errore di segmentazione .