无法理解C程序的输出

时间:2014-07-24 13:44:05

标签: c output

这个代码在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。 ......无限循环任何人都可以解释一下吗?

6 个答案:

答案 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()已经评估过一次,因此num39。第二次进入循环时,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循环被终止。