首頁 > 後端開發 > C++ > C 中 `i = i` 總是未定義行為嗎?

C 中 `i = i` 總是未定義行為嗎?

Patricia Arquette
發布: 2024-12-07 03:00:11
原創
873 人瀏覽過

Is `i  =   i` Always Undefined Behavior in C  ?

重新檢視未定義的行為和序列點

內建類型的未定義行為

在上一部分中,「未定義的行為和序列點」我們討論了與相關的潛在未定義行為表達式:

i += ++i;
登入後複製

當 i是內建類型時,此表達式會呼叫未定義的行為,因為物件 i 在連續序列點之間被修改兩次。

使用者定義類型的未定義行為

但是,如果i是使用者自訂類型,例如定義的Index類別下面:

class Index
{
    int state;

    public:
        Index(int s) : state(s) {}
        Index& operator++()
        {
            state++;
            return *this;
        }
        Index& operator+=(const Index & index)
        {
            state+= index.state;
            return *this;
        }
        operator int()
        {
            return state;
        }
        Index & add(const Index & index)
        {
            state += index.state;
            return *this;
        }
        Index & inc()
        {
            state++;
            return *this;
        }
};
登入後複製

表達式i = i是否仍會呼叫未定義的行為?

重載運算子的明確定義的行為

令人驚訝的是,不會。具有使用者定義類型 i 的表達式 i = i 不會呼叫未定義的行為,因為重載運算子被視為 C 中的函數。根據C ISO 標準第1.9.17 節:

呼叫函數時(無論函數是否內聯),在所有函數參數求值之後都有一個序列點...

因此,對運算子和運算子= 函數的呼叫會引入序列點,從而防止未定義的行為。

a[ i] = 的未定義行為i

當a 是帶有重載下標運算子的使用者定義型別時,表達式a[ i] = i 也是明確定義的,因為在評估i 表達式後,它被視為帶有序列點的函數調用.

i 的明確定義行為

在 C 03 中,表達式 i 是明確定義的,因為它實際上是等價的to:

((i.operator++()).operator++()).operator++();
登入後複製

每個函數呼叫都會引入一個序列點,使表達式定義良好。

以上是C 中 `i = i` 總是未定義行為嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板