[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.2 C++ の最小と最大演算子

二つの引数の「最小値」や「最大値」を返す演算子があると大変 便利である。GNU C++ では(GNU C は除く)、

a <? b

これは、最小値、すなわち、数値 ab の小さいほうを 返す。

a >? b

これは、最大値、すなわち、数値 ab の大きいほうを 返す。

この二つの演算子は通常の C++ ではプリミティブではない。 以下の例で示すように、C++ では二つの値の最小値を返すのにマクロを 使うことができるからである。

 
#define MIN(X,Y) ((X) < (Y) ? : (X) : (Y))

そうすると、‘int min = MIN (i, j);’ とすることで、 ‘min’ に変数 ij の最小値を設定することができる。

しかし、XY に副作用が含まれていると 予期しない動作を起こすことがある。 例えば、MIN (i++, j++) は期待とは違って、 小さいほうのカウンタを二回インクリメントしてしまう。 GNU C の拡張を使うと、この手の問題を回避する安全なマクロを書くことが 可能になる(see section Naming an Expression's Type)。 だが、MINMAX をマクロとして書いてしまうと、 基本的な算術演算に関数呼び出し形式の記法を使うことを強制することにもなる。 GNU C++ の拡張を使えば、代わりに ‘int min = i <? j;’ と 書ける。

<?>? はコンパイラに組み込みなので、 副作用のある式も正しく扱う。 ‘int min = i++ <? j++;’ は正しく動作する。


This document was generated using texi2html 1.78.