【发布时间】:2017-10-25 23:28:49
【问题描述】:
这两段代码的功能有什么不同吗?主要区别是在第一个示例中使用“静态”来保存每次调用 function1 时 x 的值。但是第二个示例通过在 for 循环的每次迭代中将 i 的值从 main 传递给 function1,从而完全不需要使用“静态”。两者的输出完全相同。使用一种方式比另一种方式有什么隐藏的优势吗?
注意:第一个示例是我见过的一段代码的简化版本。只是想知道为什么使用它而不是替代方法。
第一个例子:
void function1()
{
static int x = 0;
printf("function1 has now been called %d times\n", ++x);
}
int main(void)
{
for (int i = 0; i < 5; i++)
function1();
return 0;
}
第二个例子:
void function1(int i)
{
printf("function1 has now been called %d times\n", ++i);
}
int main(void)
{
int i;
for (i = 0; i < 5; i++)
function1(i);
return 0;
}
如果有任何共享知识,我将不胜感激。
【问题讨论】:
-
假设
function1在代码的不同地方被调用。现在选择是局部静态变量或全局变量。你觉得哪个更好? -
啊,我明白他们为什么现在使用静态变量了,这在更大的程序的上下文中是明智的。谢谢!
-
在您的测试中,运行该函数几次(例如,调用它们[复制/粘贴实际的函数调用])以查看不同的结果。这里没有“更好”,它只取决于您希望该功能实际做什么!您是否希望该函数记住它在哪里,或者您是否希望有一个可以使用输入调用的函数并将其传回一个输出,而与您调用它的次数无关?
-
因为静态变量赋值只发生一次。在第一个代码中,在第一次调用函数时,x 被初始化为零,并且对于进一步的调用链,零增量为 1。一加一,二加一,以此类推。
-
在第二个例子中,
function1不会修改main中的i;这两个例子做不同的事情