2015-06-17 30 views
1

爲什麼當我這樣做:Ç - 三元操作符

int  ft_is_alpha(char *str, int i) 
{ 
    return (((str[i] >= 'a' && str[i] <= 'z') || (str[i] >= 'A' && str[i] <= 'Z')) ? 0 : 1); 
} 

它崩潰,但是,當我這樣做:

int  ft_is_alpha(char *str, int i) 
{ 
    if ((str[i] >= 'a' && str[i] <= 'z') || (str[i] >= 'A' && str[i] <= 'Z')) 
    { 
     return (1); 
    } 

    return (0); 
} 

它不會崩潰..
我調用這樣的功能

for (i = 0; str[i] != '\0'; ++i) 
    { 
     if (ft_is_equal_to(str, i)) 
     { 
      ++count; 
      int  j; 

      j = i - 1; 
      while (str[++j] != '\0' && ft_is_alpha(str, j)) 
      { 
       ++length; 
      } 
     } 
    } 
+0

如果發生崩潰,可能是調用未定義的行爲。或者你的'我'超出了'障礙'範圍,或者問題在別處。 –

+0

'我'是什麼?或者你如何調用這個函數? – Gopi

+0

呼叫者正在崩潰嗎?由於你的兩個版本返回相反的結果。 –

回答

2

我不知道你的意思是crashin g,第一個函數正確執行測試,但返回正確值的相反值。三元運算符的分支應該與if (cond) {} else {}聲明中的順序相同。它應該閱讀:

int ft_is_alpha(const char *str, int i) { 
    return (str[i] >= 'a' && str[i] <= 'z') || (str[i] >= 'A' && str[i] <= 'Z'); 
} 

刪除括號的最後一集可以是:

int ft_is_alpha(char *str, int i) { 
    return (((str[i] >= 'a' && str[i] <= 'z') || (str[i] >= 'A' && str[i] <= 'Z')) ? 1 : 0); 
} 

由於條件已經計算結果爲布爾,你可以通過刪除不必要的三元運算符和一些括號簡化代碼完成,但可讀性較差。

請注意,str應聲明爲const char *,因爲字符串未被函數修改。同樣去除return (1);中的括號,它們不是必需的,並被認爲是不好的風格。

此外,爲什麼不分別通過str[i]而不是stri? API的這種改變將使得代碼更容易閱讀,執行更快並且更安全使用。

+0

噢,謝謝你:p – Linsap