意外に理解されていない"通常の算術型変換"

昨日、とある場所で目にした二項演算子の評価結果の型についての説明に対して、思わずツッコミを入れてしまったので、ここでもその内容を紹介しておきます。

二項演算子といっても、CやC++にはかなりの数があります。ここで対象にするのは、. 演算子や -> 演算子、関数呼出し演算子、配列の添字演算子などではなく、算術演算子などです。昨日目にした説明は、簡単にいえば次のようなものでした。

A op B という式があった場合、この式の評価結果の型はAおよびBの型によって決まる。AとBの型が同じであれば、評価結果もそれらと同じ型になる。AとBの型が異なれば、大きい方の型にあわす。

今回ツッコミを入れたのはこの前半部分です。後半部分は、元は型の大小関係まで説明があったので上記の記述はかなり省略していますが、今回は対象外なのでこの程度にとどめておくことにします。本当はここにも問題があるのですが...。

さて、前半部分、すなわち AとBの型が同じであれば、評価結果もそれらと同じ型になる。 という説明のどこが問題かというと、この説明を文字通り解釈すれば、char型の値とchar型の値の足し算では、結果の型もchar型になるはずです。ところが、実際にはそんなことにはなりません。

算術演算子などの多くの二項演算子では、演算に先駆けて両辺のオペランドに対して"通常の算術型変換(usual arithmetic conversions)"を行います。"通常の算術型変換"では、オペランドが整数型の場合、最初に整数拡張(汎整数昇格)を行います。つまり、char型やshort型のオペランドは、最初にint型に型変換されてしまいます(厳密には、CHAR_MAX==UINT_MAXの処理系では、char型はunsigned int型に変換されます)。

つまり、両辺のオペランドの型が同じであっても、式の評価結果の型がオペランドの型と同じになるとは限らないのです。

この記事のトラックバックURL:

http://www.kijineko.co.jp/trackback/746
このエントリーを含むはてなブックマーク