((*strDest++ = *strSrc++) != '\0')
關鍵區分:表達式的值 vs 變量的值。後增 i++ 的表達式值是 i 變化前的值,但 i 何時真正加 1 由編譯器決定(序列點前),導致依賴該變量的其他表達式值不確定。
() 最高優先級 → 整體為 != 運算,左邊為 *strDest++ = *strSrc++,右邊為 '\0'。= 優先級低,結合性右向左 → 先求右邊 *strSrc++,再求左邊 *strDest++,最後執行賦值。*strSrc++:++ 優先級高於 * → 等價 *(strSrc++)。strSrc++:表達式值為 strSrc 舊值,副作用:strSrc 加 1(具體時間不確定)。* 取值操作。*strDest++ 同理分析。*strDest++ = *strSrc++ 的值等於左邊表達式的值(即賦值後 *strDest 的值)。!= 比較,結果為布爾值(0 或 1)。strSrc 指向的內存值拷貝到 strDest 指向的內存。\0(字符串結束標誌)。strDest 和 strSrc 同時後移一位,指向下一字符。雖然標準保證該表達式行為確定,但可讀性極差,易導致維護誤解。除非項目規範允許,否則建議拆分為多語句:
*strDest = *strSrc;
bool not_end = (*strDest != '\0');
strDest++; strSrc++;
清晰、無歧義、同樣高效(編譯器優化後機器碼一致)。