2014-02-06 23 views
0

爲什麼在每個case語句之後放置count ++時,下面的代碼會給我25而不是10?另外,是否有內置函數在C中確定數組的長度,就像在Python中一樣?素數計數器使用開關語句(輸出中的錯誤)?

#include <stdio.h> 
#include <stdlib.h> 

int count_prime(int X[], int size); 

int main() { 
    int X[] = {4,5,3,7,9,65,17,8,7,4,2,5,6,8,5,3,3,245,10,9,4,2,9}; 
    int size = 23; 
    count_prime(X,size); 
    return 0; 
} 

int count_prime(int X[], int size) { 
    int i; 
    int count=0; 
    for (i = 0; i < size; i++) { 
     switch(X[i]) { 
      case 2:count++; 
      case 3:count++; 
      case 5:count++; 
      case 7:count++; 
     } 
    } 
    printf("%d",count); 
    return count; 
} 

回答

1

你缺少break語句,所以你的代碼屬於通(即:級聯)爲每個語句。此外,您錯過了一個default的情況,這種情況很糟糕,應該糾正。作出這樣的轉變是:

switch(X[i]) { 
     case 2:count++; 
       break; 
     case 3:count++; 
       break; 
     case 5:count++; 
       break; 
     case 7:count++; 
       break; 
     default: 
       break; 
    } 

最後,你可以讓你的代碼更加安全的替代:

int size = 23; 

有了:

int size = sizeof(X)/sizeof(int); 

使用sizeof功能時,一個謹慎的詞:如果你在函數參數上使用它,它會因爲「指針衰減」而失敗,這是一個值得閱讀的話題。

1

您錯過了break聲明,因此只要符合其中一種情況,它就會通過以下所有情況。

switch(X[i]) { 
     case 2:count++;break; 
     case 3:count++;break; 
     case 5:count++;break; 
     case 7:count++;break; 
    }