如何解决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;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。