本記事は「C言語の単純代入演算子」、その一点のみを解説するものです。
なお、本記事における規定は「プログラム言語C JISX3010-1993 (ISO/IEC 9899:1990)」に準拠しています(一部を除く。後述)。
#はじめに
代入式のポイントは以下です。
- 構文規則
左オペランド = 右オペランド
- オペランドの型は、算術型・構造体型・共用体型・ポインタ型である。
- 結果の型は、左オペランドの型(非修飾版)とする。
- 左オペランドで表現される値を右オペランドに代入する時に、型変換が行われる。
- 代入式の評価にともなう副作用は、直近前後の副作用完了点の間に起こらなければならない。
- 左オペランド・右オペランドの評価の順序は未規定とする。
- 左右の両オペランドの記憶域が重なるオブジェクトを通してアクセスされる場合、その重なりは完全に一致している必要がある。そうでない場合、未定義の動作。
#オペランドの型
単純代入演算子のオペランドの型の組合せには制約があります。規格票からそのまま引用します。
制約 次の条件のいずれか一つが成立しなければならない。
- 左オペランドの型が修飾又は非修飾の算術型であり, かつ右オペランドの型が算術型である。
- 左オペランドの型が右オペランドの型に適合する構造体型又は共用体型の修飾版又は非修飾版である。
- 両オペランドが適合する型の修飾版又は非修飾版へのポインタであり, かつ左オペランドで指される型が右オペランドで指される型の修飾子をすべてもつ。
- 一方のオペランドがオブジェクト型又は不完全型へのポインタであり, かつ他方が
void
の修飾版又は非修飾版へのポインタである。更に, 左オペランドで指される型が, 右オペランドで指される型の修飾子をすべてもつ。 - 左オペランドがポインタであり、かつ右オペランドが空ポインタ定数である。
(「プログラム言語C JISX3010-1993 (ISO/IEC 9899:1990)」「6.3.16 代入演算子」より引用)
上記より、左右のオペランドに要求する型の組合せは、大きく分けて以下の3パターンが存在します。
- 両方が算術型
- 両方が構造体型又は共用体型
- 両方がポインタ型
##両方が算術型の場合
オーバーフローやラップアラウンド等を除けば、特筆すべきことはありません。
##両方が構造体型や共用体型の場合
左右の両オペランドが適合する型である必要があります。
##両方がポインタの場合
両方のオペランドのポインタの指す型が適合型(修飾子を除く)である場合、あるいは片方のポインタの指す型がvoid
の場合、左オペランドの型は、右オペランドの型の修飾子をすべて持つ必要があります。
#参考文献
- 「プログラム言語C JISX3010-1993 (ISO/IEC 9899:1990)」