C++ 为什么在递减函数后更改cout位置时输出会发生变化?

C++ 为什么在递减函数后更改cout位置时输出会发生变化?,c++,recursion,output,C++,Recursion,Output,这是我的密码: #include<iostream> int x; void gad(int x) { if(x==0) return; else{ std::cout<<"geek"<<" "; std::cout<<"for geeks "; gad(x-1); } } int main() { gad(3); return 0; }

这是我的密码:

#include<iostream>
int x;
void gad(int x)
{
  if(x==0)
      return;
  else{

  std::cout<<"geek"<<" ";
  std::cout<<"for geeks ";

   gad(x-1);
  }
}
int main()
{
  gad(3);
  return 0;
}


std::cout您正在打印第一个句子,然后进入对同一函数的递归调用,作为回报,该函数将打印第一个句子并转到另一个递归调用……等等。
最后一个函数返回后,它将继续执行
x=1
,以打印第二个句子…等等。 要可视化发生的情况,这将是调用堆栈:

x=3--->打印第一条语句

x=2--->打印第一条语句

x=1--->打印第一条语句

x=0--->返回

x=1--->继续打印第二条语句并终止

x=2--->继续打印第二条语句并终止


x=3--->继续打印第二条语句并终止

您正在打印第一个句子,然后进入对同一函数的递归调用,该函数将反过来打印第一个句子并转到另一个递归调用…等等。 最后一个函数返回后,它将继续执行
x=1
,以打印第二个句子…等等。 要可视化发生的情况,这将是调用堆栈:

x=3--->打印第一条语句

x=2--->打印第一条语句

x=1--->打印第一条语句

x=0--->返回

x=1--->继续打印第二条语句并终止

x=2--->继续打印第二条语句并终止


x=3--->继续打印第二条语句并终止

在第一种情况下,在进行递归调用之前,您将打印这两条语句。
而在第二种情况下,您首先打印“geeks”,然后进行递归调用,再次打印“geeks”,以此类推,直到它返回null,然后按顺序打印“for geeks”,因为它是递归调用后的下一条语句。

在第一种情况下,您在进行递归调用之前打印这两条语句。
而在第二个场景中,您首先打印“geeks”,然后进行递归调用,再次打印“geeks”,依此类推,直到它返回null,然后按顺序打印“for geeks”,因为它是递归调用后的下一个语句。

是递归调用的,std::cout当您更改这些行的顺序时,您期望会发生什么?@JaMiT我想如果我将
cout
放在函数后面,由于递归,它不会给出“适用于极客”并且由于if而退出递归循环statement@Zoro-这应该是问题的一部分,这样人们就可以直接解决你对递归工作原理的误解。(评论随时可能消失。)这是否回答了您的问题?开始的前两段,因为gad()是递归调用的,std::cout当你改变这些行的顺序时,你期望会发生什么?@JaMiT我想如果我把
cout
放在函数后面,由于递归,它不会给出“适合极客”的结果并且由于if而退出递归循环statement@Zoro-这应该是问题的一部分,这样人们就可以直接解决你对递归工作原理的误解。(评论随时可能消失。)这是否回答了您的问题?的前两段开始,然后如果x由于递归调用而等于零,并且由于if语句而从gad()函数中退出,那么它将如何打印“for geeks”?@Zoro TheScar
return
语句将仅终止调用堆栈中的当前函数,即
gad(0)
。因此,
gad(1)
将继续工作,然后是
gad(2)
,最后是
gad(3)
。如果x由于递归调用而等于零,并且由于if语句而退出gad()函数,那么它将如何打印“for geek”?@Zoro TheScar
return
语句将仅终止调用堆栈中的当前函数,即
gad(0)
。因此,
gad(1)
将继续工作,然后是
gad(2)
,最后是
gad(3)
std::cout<<"geek"<<" ";
  std::cout<<"for geeks ";

   gad(x-1);
   std::cout<<"geek"<<" ";
   gad(x-1);
   std::cout<<"for geeks ";