2013-01-16 53 views
2
gcc 4.7.2 
c89 

你好被使用,毫無意義的三元運算符在此聲明

我有這樣的功能,一個指針分配給一個另一個指針是一個字符串結構的元素。

這個字符串結構的目的是獲取和設置實際字符串的長度。

但是,我不明白他們爲什麼使用三元運算符。這對我沒有意義。除了str->len = src之外似乎沒有任何條件。其中只分配和不比較任何東西。

typedef struct tag_str_t str_t; 
struct tag_str_t { 
    char *buf; 
    size_t len; 
}; 

static void string_set(str_t *str, const char *src) 
{ 
    str->buf = (char*)src; 
    str->len = src ? strlen(src) : 0; 
} 

這樣做是否簡單易讀?

str->len = strlen(src); 

非常感謝您的任何建議,

回答

4

的代碼:

str->len = src ? strlen(src) : 0; 

相當於:

str->len = ((src != 0) ? strlen(src) : 0); 

我已經添加了括號和額外的表達指示在其中表達的組分。您的評論似乎表明您認爲str->len = src是三元運算符中的條件,但這是錯誤的;分配的優先級很低。

由於Jesus Ramosexplained,測試的目的是確保strlen()不用NULL指針調用,這將導致崩潰。

+0

謝謝,便士終於下降了。通常情況下,我總是將自己的情況放在括號內以避免混淆。 – ant2009

4

調用strlen(NULL)會產生一個段錯誤,代碼簡單地說,如果將src字符串爲NULL長度爲零,如果不計算使用strlen長度。

+0

@alk真的,我不知道實現的地方會在很多平臺上爲NULL空間現在包括一個足夠大的範圍,或者,除非strlen的做一個空檢查(這從我可以在代碼中看不到的東西)。 –

+0

謝謝,我現在明白了,它像這樣str-> len =(src!= NULL)? strlen(src):0; – ant2009

+0

@ ant2009是的,這是正確的。 C中的正常值可以評估爲布爾表達式。 –

1

三元運算符用於那裏不去比較,但檢查src。假設您通過NULL作爲src,那麼代碼將調用Undefined Behavior。因此,三元運算符支票:

if(src != NULL) 
    str->len = strlen(src) ; 
else 
    str->len = 0 ; 
+1

與_does調用未定義的behaviour_相比,可能會出現未定義的行爲。調用一個沒有明確允許的空指針的庫函數會調用未定義的行爲,而'strlen()'沒有被記錄爲接受一個空指針,因此用空指針調用它會調用未定義的行爲。 –

+1

@ JonathanLeffler-感謝您的澄清。這就是我喜歡的東西,人們可以在這裏學習很多方面:-) – Abhineet