重新審視未定義的行為和序列點
在主題「未定義的行為和序列點」的續集中,我們深入研究了涉及使用者定義類型的表達式。
使用者定義類型和未定義的行為
考慮以下涉及使用者定義類型索引的表達式:
i += ++i;
此具有內建類型索引的表達式:
此具有內建類型索引的表達式:i.operator+=(i.operator++());此具有內建的表達式的行為未定義。但是,如果 i 是 Index 類型,它是否仍然會呼叫未定義的行為? 不,它不會。這是因為表達式等效於:
i.operator+=(i.operator++());由於重載運算子是函數,因此應用正常的排序規則。 i.operator() 求值後存在序列點,因此後續 i.operator =() 中對 i 的修改不會違反任何未定義的行為規則。
(i.operator++()).operator++()).operator++();
同樣,表達式 i.add(i .inc());和 i 定義明確。第一個表達式相當於:
第二個表達式相當於:
這些表達式中的每一個在運算子() 表達式求值之後都有一個序列點,確保物件i 在連續的序列點之間不會被修改兩次。
a[++i] = i;
下標運算子重載
表達式:
以上是C 中的重載運算子是否可以消除「i = i」等表達式中的未定義行為?的詳細內容。更多資訊請關注PHP中文網其他相關文章!