这是我的问题的示例程序,我使用的是VisualStudio 2008
void abc()
{
static int i = 0;
if (i==0)
{
xyz();
i++;
}
abc();
}
静态变量也在下一个调试会话中保留一个值,因此不调用xyz()
,如何在不使用静态变量的情况下调用一次函数?
答案 0 :(得分:3)
这个怎么样:
void abc(int init)
{
if(init == 1) xyz();
abc(0);
}
int main(void) {
abc(1);
}
它具有清楚显示正在发生的事情的优点。你甚至可以声明一个枚举:
enum INIT {FIRST_TIME, RECURSING};
并做
void abc(enum INIT init) {
if(init == FIRST_TIME) xyz();
abc(RECURSING):
}
您可以在http://codepad.org/7euiC5LQ
看到完整的示例#include <stdio.h>
enum INIT {FIRST, RECURSING};
void abc(enum INIT init) {
if(init == FIRST) {
printf("first time\n");
abc(RECURSING);
}
else {
printf("last time\n");
}
}
int main(void) {
abc(FIRST);
}
在此示例中,第二次是最后一次。显然你可以从那里修饰;通常你会想要将一个参数传递给你的abc
函数,这个函数可能随着每次调用而减少,直到你达到某个点“这是递归的结束”(想想factorials,Fibonacci等)。在这种情况下,为初始调用传递“无效”参数(例如-1
)将是一个很好的解决方案。你仍然只有一个参数。
最后 - 当您使用C ++时,您可以考虑重载您的功能。使用参数调用它,并包含xyz
;没有,你没有,所以称之为。有点像其他答案之一的abcStart
。但是既然你用C和C ++标记了你的问题,并且你的代码中没有证据表明你真的想要C ++,我甚至都不去那里......
答案 1 :(得分:1)
不确定这是你正在寻找的但它有效
void abc(){
abc();
}
void abcStart(){
xyz();
abc();
}
int main(){
abcStart();
}
执行此操作时,您无需指定任何标记或使用任何if
。您只需调用递归的“开始”功能
答案 2 :(得分:1)
您可以将callflag
传递给abc()
函数,作为是否调用xyz()
函数的指示。
void abc(int callflag){
// do somwork
if(callflag)
xyz(); // xyz() willbe called when callflag = !0
// do other stuff
abc(0)
}
void abcStart(){
abc(1);
//abc(0); If you don't want to call xzy even for first time.
}
我认为,只要您愿意,xyz()
内就可以灵活调用abc()
。
答案 3 :(得分:0)
在调用者中使用布尔变量并将其传递给被调用函数。
#include <stdbool.h> // C99 and latter supports.
void abc(bool flag)
{
if (flag)
{
xyz();
flag = false;
}
abc(flag);
}
int main(void) // T is return type
{
...
bool flag = true;
abc(flag);
...
}
答案 4 :(得分:0)
这是一个解决方案,它不会硬编码一次运行xyz
,也就是说你以后可以轻易地改变它来运行它任意次数(感谢Floris的答案我改编):
void abc(int i)
{
if(i > 0)
{
xyz();
i--;
}
abc(i);
}
int main()
{
abc(1);
}