2013-08-26 68 views
2

我有一個char指針在程序開始時初始化爲NULL,在程序中進一步發現char *用於函數調用,它可能指向一個char字符串,它可能指向空字符,並且它可能保持不變。 所以下面的陳述是正確的,應該是如果從左到右評估表達式。如果沒有,那麼的strlen(charpointer)是不確定的行爲,如果charpointer == NULL如果(...)中的if語句的語句評估順序是什麼?

if ( charpointer == NULL || strlen (charpointer) == 0 ) 

那麼,他們究竟是怎麼從從左到右進行評估?這是正確的方式去檢查像這樣?

+7

我確定這是一個重複很多次。 「||」的操作數需要從左到右進行求值,使表達式安全(只要「charpointer」是空指針或指向字符串的有效指針)。對於大多數其他運營商而言,評估的順序是未指定的。 –

+2

請注意,評估順序與表達式用作if語句中的條件無關;它完全關於'||'運算符。 –

回答

11

||的評估順序是從左到右,正如Eric提到的這是||&&的一個特殊屬性,大多數操作員不會執行從左到右的審覈。如果左邊的一個成功,從C99標準草案部分6.5.14第4它不會計算右邊的表達式:

不同的是按位|運算符||運營商保證從左到右評估;評估第一個操作數後有一個序列點。 如果第一個操作數不等於0,則不評估第二個操作數

C++標準草案具有第5.15第1段類似的語言。

0

從左到右的評估順序。

在你的情況,如果循環將檢查從左到右的第一個條件。如果第一個條件失敗,它將會從左到右檢查第二個條件。

+2

'if'不是一個循環。 –

+0

評價的順序是由邏輯或運算符決定的,與「if」或一般規則無關(如編輯所示)。 –

+0

@SebastianRedl感謝您的評論 – sujin

2

正如其他人從左到右所指出的那樣,評估的順序很重要,但是要認識到評估停止在可以確定邏輯表達式的真值(或缺乏)的點上是非常重要的。

這是兩種情況||和& &。

這是特別重要的,因爲您不能假定整個表達式將被評估,因此如果邏輯表達式的任何組件都有副作用(例如函數調用,增量,賦值等),它們不會都必須執行。

2

測試charpointer以查看它是否爲空。

if (charpointer == NULL) { // etc. 

如果你想測試,如果charponter指向一個NULL字符,則:

if ((charpointer != NULL) && (strlen(charpointer) == 0) { // etc. 

您可以將這些語句組合爲:

if (charpointer == NULL) { 

    } else { 
     if (strlen(charpointer) == 0) { // etc. 

或爲:

if ((charpointer != NULL) && (strlen(charpointer) == 0)) {// etc. 

或者你可以依靠短路這就是你的代碼在做什麼。但是,對於charpointer的測試== NULL 必須是,因爲表達式從左到右進行評估。

你寫的C代碼相當數量後,最後,你將瞭解到:

if (! charpointer) { // etc. 

相同測試它等於NULL。所以,僅僅是幻想和寫不可讀的代碼,然後:

if (!charpointer || !(strlen(charpointer)) { // etc. 
4

評估過程的特點有絕對無關,與if聲明。評估由表達式本身的屬性決定。它在if中使用的事實沒有任何區別。

在你的情況有問題的表達是

charpointer == NULL || strlen (charpointer) == 0 

其行爲primaruly由||運營商,這是保證評估由左到右,與第一個操作數的評價的屬性定義之前被測序第二操作數的評估,以及在第一操作數評估爲true的情況下爲「過早完成」(「短路」)。

這意味着您的原始文章中的控制表達式是完全安全的。