[C言語入門] 演算子の使い方(12)
高木です。こんにちは。
WordPressをバージョンアップしたところ、投稿画面がガラッと変わってしまって戸惑っているところです。
もう少し慣れれば、WordPressの新しい投稿画面についても書いてみたいと思いますが、今回は目先の投稿を行うのが精一杯なのでいつも通りの内容でいきます(それができるかどうかが一番の不安ですけど)。
今回解説するのは等価演算子です。
前回も書いたように、関係演算子といっしょに解説してもよかったのですが、オペランドに要求するものが異なるなど、関係演算子と等価演算子は似て非なるものなので、あえて回を分けました。
ところで、多言語では「等価」ではなく「等値」と呼ぶことも多いようです。
Cではあくまでも「等価演算子」であり、それは値が等しいかどうかを判定するためのものです。
等価演算子
等価演算子は、オペランドの値が等しいか、等しくないかを判別するための演算子です。
数学であれば等号「=」を使うところですが、単なる等号は代入演算子に使っているため、Cでは連続した2つの等号==
を等しいかどうかの判定に使います。
また、等しくないかどうかの判定には!=
を使います。
等価演算子の評価結果はint型で、真の場合は1、偽の場合は0になります。
等価演算子のオペランドは次のどれかでなければなりません。
- 両方のオペランドが算術型
- 両方のオペランドが適合する型の修飾版または非修飾版へのポインタ
- 一方のオペランドがオブジェクト型または不完全型へのポインタで、もう一方のオペランドがvoid型の修飾版または非修飾版へのポインタ
- 一方のオペランドがポインタ型でもう一方が空ポインタ定数
両方のオペランドが算術型の場合、評価に先立って「通常の算術型変換」が行われます。
符合付き整数型と符合無し整数型を比較する場合、もとの値が異なっていても「等しい」と判定されることがあるので要注意です。
また、オペランドが浮動小数点型であり、その値が何らかの演算結果である場合には、誤差によって期待する結果にならないことがあります。
両方のオペランドがポインタの場合、「等しい」と判定されるのは以下の条件のいずれかを満たす場合だけです。
- 両方が空ポインタ
- 両方が同じオブジェクトまたは関数を指す。
- 両方が同じ配列の末尾要素をひとつ越えたところを指す。
- 一方が配列の末尾要素をひとつ越えたところを指し、もう一方がその配列の直後に配置された配列の先頭要素を指す。
「空ポインタ定数」は確か今回はじめて登場したはずですので、少し捕捉しておきます。
「空ポインタ定数」というのは、値0に評価される整数定数式、またはそれをvoid*型にキャストした定数式のことです。