[英]goto statement leading to an infinite loop
我們正在進行各種測驗,並提出以下問題,我們必須在哪里找到錯誤,或者如果沒有錯誤,則為給定代碼的 output:
#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 != 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,8,7,6,5,4,3,2,1]
#include <stdio.h>
int main(void) {
int n = 012;
b: printf("%d\n",n--);
if(n>0){
//n--;
goto b;
}
return 0;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.