goto 语句导致无限循环

问题描述

我们进行了各种各样的测验,并有以下问题,我们必须找出错误,或者如果没有,则找出给定代码输出

#include <stdio.h>

int main(void) {
  int n = 012;

  b: printf("%d\n",n--);

  if(n!=0){
    n--;
    goto b;
  }
  
  return 0;
}

理论上我看不出这有什么问题,但这会导致变量远低于 0 的无限循环。有人能帮我解决这个问题吗?

解决方法

您应该只有一个 n-- 语句。否则即使它达到0,当它得到第一个n--它会再递减一次并变为-1。 (所以它永远不会匹配 0)。

因此,请将您的代码更改为

#include <stdio.h>

int main(void) {
  int n = 012;

  b: printf("%d\n",n--);

  if(n!=0){
   goto b;
  }
  
  return 0;
}
,
#include <stdio.h>

int main(void) {
  int n = 012;

  b: printf("%d\n",n);

  if(n!=0){
    n--;
    goto b;
  }
  
  return 0;
}

这行得通。您发布的版本不起作用,因为它永远不会变为 0。它在 if 语句中减去一次,在 printf 中减去一次。

,

条件 if (n != 0) 总是得到满足。

在每次迭代中,数字 n 减少 2。

所以当 n = 2 时,它会在 printf("%d\n",n--) 之后递减一次

则条件 if (n != 0) 为真,如 n = 1

条件块内n再次递减,n = 0

所以下一次达到条件if (n != 0)之前,n等于-1,

导致无限循环。

,

C 中的 012 是八进制基数,十进制等于 10。

此代码:

#include <stdio.h>

int main(void) {
  int n = 012;

  b: printf("%d\n",n--);

  if(n!=0){
    n--;
    goto b;
  }
  
  return 0;
}

这样做:

print n (10)
subtract 1 of n (n = 10 - 1 = 9)
check if n != 0 (9 != 0 -> true)
subtract 1 of n (n = 9 - 1 = 8)
jump to b

print n (8)
subtract 1 of n (n = 8 - 1 = 7)
check if n != 0 (7 != 0 -> true)
subtract 1 of n (n = 7 - 1 = 6)
jump to b

print n (6)
subtract 1 of n (n = 6 - 1 = 5)
check if n != 0 (5 != 0 -> true)
subtract 1 of n (n = 5 - 1 = 4)
jump to b

print n (4)
subtract 1 of n (n = 4 - 1 = 3)
check if n != 0 (3 != 0 -> true)
subtract 1 of n (n = 3 - 1 = 2)
jump to b

print n (2)
subtract 1 of n (n = 2 - 1 = 1)
check if n != 0 (1 != 0 -> true)
subtract 1 of n (n = 1 - 1 = 0)
jump to b

print n (0)
subtract 1 of n (n = 0 - 1 = -1)
check if n != 0 (-1 != 0 -> true)
subtract 1 of n (n = -1 - 1 = -2)
jump to b

print n (-2)
...
...
... goes on infinitely

请注意,当程序检查是否 n 时,when 0 永远不会等于 n != 0,因为在此评估中,n 始终是奇数,因为两次减 1每次都制作。

,

b: printf("%d\n",n--); 更改为 b: printf("%d\n",n);

更改自

  if(n!=0){
    n--;
    goto b;

  if(n!=0){
    n;
    goto b;

因为 n-- 等于 n = n - 1

您的程序:

#include <stdio.h>

int main(void) {
  int n = 012;

  b: printf("%d\n",n--); // n = n - 1

  if(n!=0){
    n--; // n = n - 1
    goto b;
  }
  
  return 0;
}
,

用于输出 [10,8,6,4,2,0]

    #include <stdio.h>

    int main(void) {
      int n = 012;

      b: printf("%d\n",n--);

      if(n>0){
        n--;
        goto b;
      }

      return 0;
    }

对于 [10,9,7,5,3,1]

    #include <stdio.h>

    int main(void) {
      int n = 012;

      b: printf("%d\n",n--);

      if(n>0){
        //n--;
        goto b;
      }

      return 0;
    }