大阪市中央区 システムソフトウェア開発会社

営業時間:平日09:15〜18:15
MENU

プログラミング言語C – 単項演算子

株式会社クローバーフィールドの経営理念
著者:津路高広
公開日:2019/02/05
最終更新日:2019/02/05
カテゴリー:技術情報
タグ:

津路です。
引き続き、プログラミング言語C 第2版 ANSI規格準拠 K&R著(共立出版)を読んで、気になるところを書いています。
付録A 参照マニュアルの以下のページを取り上げます。
A7.4 単項演算子 249ページ
「単項演算子をもつ式は、右から左へまとめて評価される。」の後、以下が訳されていません。
unary-expression:
postfix-expression
++ unary-expression
— unary-expression
unary-operator cast-expression
sizeof unary-expression
sizeof (type-name )
unary-operator: one of
& * + – ~ !

私は、つぎのように訳してみました。
単項演算子を含む式
後置式
++ 後置式
— 後置式
単項演算子 キャスト式
sizeof 単項式
sizeof (型名)
単項演算子は、以下のうちいずれか
&, *, +, -, ~, !

A7.4.1 前置インクリメント演算子
「++あるいは–演算子が前に付いている単項式は、やはり単項式である。被演算数は、1だけインクリメント(++)あるいはデクリメント(–)される。」
書籍ではインクレメント、デクレメントと表記されていますが、当時の直訳でしょう。
少し飛んで、「被演算数は左辺値でなければならない。」とあります。ここで言われても、意味不明と言わないでくださいね。この式を解釈すると、オペランドは左辺値なのですから。
最後に、「この結果は左辺値ではない。」とあります。つまり、式の結果は、値ですから、左辺値ではないのです。

A7.4.2 アドレス演算子 250ページ
「単項の&演算子は、その被演算数のアドレスを求めるのにつかわれる。この被演算数は、左辺値または関数型であり、左辺値の場合は、ビット・フィールドであったり、registerとして宣言されたオブジェクトを参照するものであったりしてはいけない。」
ここでは、被演算数というより、被演算子と呼ぶほうがいいでしょう。

A7.4.3 間接演算子
「単項の*演算子は、間接指定を表すもので、その被演算数が指すオブジェクトあるいは関数を返す。その被演算数が算術型、構造体型、共用体型、ポインタ型のオブジェクトであれば、これは左辺値である。当の式の型が”Tへのポインタ”であれば、結果の型もTとなる。」
最後の文は、例として、被演算子がポインタだったら、それが参照するメモリの型となるということです。

A7.4.4 単項のプラス演算子
「単項の+演算子の被演算数は、算術型をもたねばならない。その結果は、被演算数の値となる。整数の被演算数は、整数の格上げを受ける。結果の型は、格上げされた被演算数の型である。」
ちょっと難しい説明ですが、単に単項マイナス演算子と対称になる演算子を作っただけです。使うとすれば、変数の型をチェックする場合とかですね。

    上に戻る