C++の代替トークン

目次

C++ではnotを!の代わりに使用できる

C++で珍しいコードにあった。

次のようなコードである。

bool ok = true;

if (not ok)
{
    // ...
}

通常のC++のコードでは次のようであろう。つまり、C++の論理否定演算子としては通常"!“を使用する。

if (!ok)
{
    // ...
}

しかし、notも実のところ使用可能である。これは、代替トークン(alternative tokens) と呼ばれている。

このようなものとしては次が定義されている。

キーワード定義
and&&
and_eq&=
bitand&
bitor|
compl~
not!
not_eq!=
or||
or_eq|=
xor^
xor_eq^=

C言語の場合はiso646.hにマクロとして定義されているので、使用したければそれをインクルードすれば良い。

類似物

類似したものとしては、ダイグラフ(digraph)や、既にC++17で廃止されたトライグラフ(trigraph)がある。

ダイグラフ

キーワード定義
<:[
:>]
<%{
%>}
%:#

トライグラフ

キーワード定義
??=#
??/\
??'^
??([
??)]
??!|
??<{
??>}
??-~

これらの使用について

基本的に、これらを使用する必要はない。 通常使われるものでもなく、読み手に細かい知識を要求するので、使う必要がないときに使うべきでもない。

ただし、「notは!よりも読みやすい」という主張はわからなくもない。

Perlとの比較

Perlなどではnotも!も使用することができるが、優先順位が異なる。 notなどキーワード型のもののほうが、!など記号型のものの方よりも優先順位が低くなっている。 なので、Perlのプログラマーは次のようなコードを書くことがある。

if (not $isSaturday || $isSunday) {
    # 平日の場合の処理
}

これは、次と同じ意味である。

if (!($isSaturday || $isSunday)) {
    # 平日の場合の処理
}

優先度の高低を利用して、カッコを省略できている。

つまり、Perlでは「記号で繋がれた述語が1つのブロックをなし、それをキーワード型の演算子で修飾する」というモデルになっている。

C++のnotキーワードは単なる!の代替なので、このような優先順位の違いなどはない。