簡體   English   中英

goto 語句導致無限循環

[英]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 != 0n永遠不會等於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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM