単項+演算子も使いよう

高木です。おはようございます。

私は結構いい歳になってきましたが、それでも現役のプログラマーであり、そのことを良しとしています。
そういうこともあって、また、実際に手がけている案件に関わる具体的な話題に触れるのも気が引けることから、プログラミングに関するマニアックな話題をブログで書くようにしています。
今回もそういうネタです。

コーディングをしていると、ふと気になることがときどきあります。
単項の+演算子もそのひとつです。

多くのプログラミング言語では+演算子は2種類あって、ひとつは加算を行うための二項演算子です。
もうひとつが、今回取り上げる単項の+演算子です。

同じ仲間の演算子には単項-演算子がありますが、こちらは符号を反転させることでオペランドとは異なる値に評価されることになりますから、使い方ははっきりしていますね。
それに対して、単項+演算子を使っても値が変わるわけではなく、いまひとつ使い道がわからないという人も多いのではないでしょうか?

今回もいくつかの言語について考察したいと思います。
例によって、対象となる言語はC、C++、Java、C#、そしてPHPです。

まず、CとC++について見ていきます。

これらの言語では、単項+演算子を使うと、オペランドが汎整数型であれば汎整数拡張が適用されます。
つまり、オペランドがint型より小さい型で、かつint型の表現範囲を超えなければ、int型に暗黙的に型変換されます。
また、unsigned int型と表現範囲が同じであれば、unsigned int型に暗黙的に型変換されます。

このように、単項+演算子で値は変わりませんが、明示的に汎整数拡張を適用させる効果があります。
Cの場合はそんなに有用ではありませんが、C++の場合には多重定義やテンプレートを解決する上で重要です。

次にJavaとC#を見ていきます。

この二つの言語は別物ですが、こと単項+演算子に関しては同じように振る舞うと考えてよいでしょう。
単項+演算子を使うと、オペランドにはunary numeric promotionが適用されます。
CやC++と同様、int型より小さい型はint型に暗黙的に変換されます。

C#の場合には、byte型やushort型のような符号無し整数型もint型に型変換されるので注意が必要です。
この辺りもCやC++と同じですね。

最後にPHPを見ていきましょう。

PHPには、表現範囲は異なる細かい型の違いはそんなにありません。
ですので、汎整数拡張やunary numeric promotionの類いが発生することはありません。

しかし、PHPではもっとすごい型変換が単項+演算子によって引き起こされます。
具体的には、文字列に対して単項+演算子を適用した場合、浮動小数点数に変換できればfloat型に、整数値に変換できればint型に型変換されます。
これは使えますね。

ざっと見てきたように、単項+演算子を使っても値が変わらないから無意味ということはなさそうです。
単項+演算子を使うことで、暗黙の型変換を適用することができます。
しかも、記述するのはたった1文字です。

このように、言語仕様の細かいところまで事前に把握しておくことには価値があります。
効率よくコーディングできるようになるのはもちろん、ソースコードを読んだだけで実際に動かさなくても詳細な動作を追跡できるようになります。