2014-12-23 64 views
0

它是不好的做法,使用這樣的:使用* str ++是不好的做法嗎?

*str++; 

VS

*str; 
str++; 

str被定義爲char str[];

雖然他們做同樣的事情,這似乎是第一個可能更容易出錯,因爲做這樣的事情(*str)++例如,導致編譯器錯誤,即使它似乎喜歡這就是我們正在做的事情。

+3

'( * str)++!= *(str ++)' –

+1

你知道'* str ++'的含義嗎?你是否期望你的代碼的消費者知道? – juanchopanza

+0

@juanchopanza是的。我知道我們解引用str,然後增加指針。我只是想知道是否使用* str ++是不好的做法,因爲我在這裏看到的許多答案似乎使用第二種方法。 –

回答

3

就其本身而言,它不是不好的做法

strcpy的規範定義是一樣的東西

while (*src) 
    *dst++ = *src++; 

你只是想知道它真的做你想要什麼;您正在獲取str指向的值,並且作爲副作用您正在增加指針。

您還想知道*str++(*str)++之間的區別;第二個遞增str指向的值,而不是str本身。

您還希望知道在評估表達式後不必立即應用副作用;它只需要在下一個序列點(所有表達式已被評估並且所有副作用已被應用的點)之前應用。在上面的示例中,dstsrc都會在語句結尾增加,但不能保證它們按任何特定順序遞增,或者在分配發生之前或之後遞增。你想避免寫出像*str = *str++這樣的表達式;行爲是不確定的。

3

*str++是idomatic。希望程序員知道沒有括號的含義是安全的。

這個符號已經存在了,並且意味着要被使用。給K & R:

/* strcpy: copy t to s; pointer version 3 */ 
void strcpy(char *s, char *t) 
{ 
    while (*s++ = *t++) 
     ; 
} 

儘管這似乎一見鍾情神祕,記法 方便是相當大的,而成語應該掌握,因爲你 會經常看到它在C程序。

2

*str++;遞增str指針。在C中,數組名稱是靜態指針,所以你不能增加它。並且(*str)++遞增在索引零的值。

+3

唯一一位提到過OP聲明'char str []' –

+0

很好的答案..沒有人觀察過OP部分.. – Outlier

1

這不是非常糟糕的做法,因爲它在較舊的代碼中大量使用。作爲一種個人觀點,我對最終的讀者保持保守態度,因爲這些讀者不會成爲C運營商優先考慮的專家(我承認我屬於這一類別......)

所以我幾乎總是使用括號來消除歧義:

(*str)++; 

但我只做到這一點與真正的指針,從不使用數組,即使它們與未知大小聲明,仍然避免可能的錯誤後,當維護代碼。

所以恕我直言,這是確定的

char *str; 

,但我不會用它

char str[]; 

(如果我(或其他程序員),後來寫char str[SIZE]?)

相關問題