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キーワードは単なる!の代替なので、このような優先順位の違いなどはない。