这个代码在C
中int fun()
{
static int num = 40;
return num--;
}
int main()
{
for(fun(); fun(); fun())
{
printf("%d ", fun());
}
getchar();
return 0;
}
输出结果如下:38 35 32 29 26 23 20 17 14 11 8 5 2
我无法弄清楚为什么该程序不会继续打印超出2.即在否定中。不应该继续打印... -1 -4 -7。 ......无限循环任何人都可以解释一下吗?
答案 0 :(得分:5)
fun()
正在评估0
:
for(fun(); fun(); fun())
// ^
0
相当于C中的false
,因此循环正在退出。
代码依赖于num - 1
是3的倍数这一事实,因为fun()
在循环开始时评估一次,然后在每个循环中评估3次。例如,如果您将定义更改为
static int num = 41;
fun()
会将0
返回到错误的位置,您的循环会继续显示为负数。
答案 1 :(得分:3)
整个魔法发生在你的for()
循环中。
基本格式如下:
for (<pre-iteration>; <condition>; <post-iteration>)
<code>
预迭代中的代码将在第一次迭代/循环之前执行一次。
在每次迭代之前评估条件内的代码。如果结果值为true
,则循环继续,如果它是false
,则循环保持不变。
迭代后内的代码在每次迭代后执行。
为了使整个代码更容易理解,重要的是要知道您还可以使用for()
循环编写这样的while()
循环:
<pre-iteration>
while (<condition>) {
<code>
<post-iteration>
}
回到你的例子:
for (fun(); fun(); fun())
{
printf("%d ", fun());
}
使用while()
这可以这样写:
fun();
while (fun()) {
printf("%d ", fun());
fun();
}
由于fun()
将返回静态值num
的值,然后将其递减1
,因此第一次迭代将如下所示:
// This is going to be the first call, so the static variable is initialized: num = 40
fun(); // returns 40; num = 39
while (fun()) { // returns 39; num = 38 (true -> loop continues)
printf("%d ", fun()); // returns 38; num = 37 (-> 38 is written to console)
fun(); // returns 37; num = 36
}
下一次迭代(由于显而易见的原因,循环之前的代码不再执行):
fun(); // no longer executed
while (fun()) { // returns 36; num = 35 (true -> loop continues)
printf("%d ", fun()); // returns 35; num = 34 (-> 35 is written to console)
fun(); // returns 34; num = 33
}
这一直持续到最后一次迭代:
fun(); // no longer executed
while (fun()) { // returns 0; num = -1 (false -> loop exits)
printf("%d ", fun()); // no longer executed
fun(); // no longer executed
}
我无法弄清楚为什么程序不会继续打印超出2.即在底片中。它不会继续打印... -1 -4 -7 ....无限循环可以谁解释一下?
是的,它可能会继续,但仅当对fun()
的特定来电不会返回0
时,即将num
的初始值设置为41
并且程序将无限期地运行(或者至少在某个时刻返回值恰好为0
)。
答案 2 :(得分:2)
让我们看看在fun()
循环中对for
的第二次调用中会发生什么。第一次输入循环时,fun()
已经评估过一次,因此num
为39
。第二次进入循环时,fun()
已经执行了三次,所以它现在是36
。此过程将继续,直到最后,对fun()
的第二次调用返回0
。在C中,0
表示false
,因此循环在该阶段终止。
答案 3 :(得分:1)
for(fun(); fun(); fun())
for()
循环的第二部分是一个条件 - 如果fun()
返回0,这被解释为false,则循环终止。最近我得到了一个大脑屁并写了一个声明,条件只适用于正数。
答案 4 :(得分:1)
何时
printf("%d ", fun());
运行,fun()具有值2 然后执行下一个命令中的最后一个fun()来增加计数器(通常):
for(fun(); fun(); fun())
fun()是1。
然后执行继续for循环的条件,这是第二个fun():
for(fun(); fun(); fun())
此时,fun()为0,使for循环停止。
答案 5 :(得分:1)
当您打印fun()
时,您看不到num
的实际值,而是num+1
的值。
这是因为您使用的是后缀减量(num--
)而不是前缀减量(--num
)。
因此,当您打印2时,num
的实际值为1。
在此次迭代结束时,调用fun()
,将num
设置为0.
在下一次迭代开始时,num
被评估为false并且for
循环被终止。