Я постараюсь объяснить это как можно проще: когда функция в программе C вызывает другую функцию (даже саму себя), она должна «ждать», пока функция, которую она вызвала, завершила sh выполнение своего код перед продолжением выполнения оставшихся инструкций. Итак, в этом случае:
1. void invertSeq(void){
2. int c;
3. c = getchar();
4. if(c == '\n'){
5. printf("Inverted seq: ");
6. return;
7. }
8. invertiSeq();
9. putchar(c);
10. return;
11. }
Когда invertSeq()
вызывается main()
, выполняются инструкции в строках 2-7, а затем вызывается invertSeq()
. В это время был прочитан первый символ из ввода, и, если этот символ не \n
, то вызывается invertSeq()
(в строке 8). Прежде чем инструкции в строках 9 и 10 будут выполнены, недавно вызванный invertSeq()
должен выполнить свои инструкции. Теперь, если следующий символ из ввода не \n
, то снова вызывается invertSeq()
(имейте в виду, что в этот момент второй символ из ввода был прочитан). Этот процесс, во время которого invertSeq()
вызывает себя несколько раз в строке 8 после выполнения инструкций из предыдущих строк, повторяется до тех пор, пока \n
не будет считан из ввода. Когда это происходит, «последний» вызванный invertSeq()
(тот, который читает \n
из ввода) выполняет инструкции в строках 5 и 6 и, таким образом, печатает «Inverted seq:» и завершает работу. Вызываемый «предпоследний» invertSeq()
(тот, который читает последний символ строки) печатает последний символ, выполняя putchar(c)
в строке 9, и завершается после выполнения return;
в строке 10. Этот процесс продолжается до «каждого». invertSeq()
выполняет инструкции в строках 9 и 10, таким образом печатая символы строки в обратном порядке.