今日、いくつかのVisual C++コードを書いている間に、私は驚きました。 C++はboolの++(増分)をサポートしているようですが、-(減分)はサポートしていないようです。これは単なるランダムな決定ですか、またはこの背後に何らかの理由がありますか?
これはコンパイルします:
static HMODULE hMod = NULL;
static bool once = false;
if (!once++)
hMod = LoadLibrary("xxx");
これはしません:
static HMODULE hMod = NULL;
static bool once = true;
if (once--)
hMod = LoadLibrary("xxx");
これは、ブール値として整数値を使用した歴史から来ています。
x
がint
であるが、if(x)...
に従ってブール値として使用している場合、インクリメントすると、操作前の真理値に関係なく、true
の真理値を持つことになります(オーバーフローを除く) )。
ただし、x
(積分値が1の場合)またはfalse
(積分値が他の値の場合-特に)になる可能性があるため、true
の真理値のみを知っている--
の結果を予測することは不可能です。これには、0 [false
]と2つ以上の[true
]が含まれます)。
したがって、ショートハンド++
は機能し、--
は機能しませんでした。
++
は、これとの互換性のためにブールで許可されていますが、その使用は標準では廃止されています。
これは、I onlyがx
をブール値として使用することを前提としています。つまり、オーバーフローを引き起こすのに十分な頻度で++
を完了するまで、オーバーフローは発生しません。使用される型としてcharがあり、CHAR_BITS
が5のように低い場合でも、これが機能しなくなる前に32倍になります(これは悪い習慣であるために十分な議論です。 32ビットのint
の場合、これが問題になる前に++
を2 ^ 32回使用する必要があります。 --
では、false
の値を1で始めた場合、または0で始めて++
を1回だけ使用した場合にのみtrue
になります。
0を少し下回る値で開始する場合、これは異なります。実際、このような場合、++
の結果としてfalse
値が最終的に次のようになる場合があります。
int x = -5;
while(++x)
doSomething(x);
ただし、この例では、条件を除くすべての場所でx
をint
として処理するため、次と同等です。
int x = -5;
while(++x != 0)
doSomething(x);
これは、x
をブール値としてのみ使用することとは異なります。
ANSI ISO IEC 14882 2003(c ++ 03):
5.2.6-2
Postfix-のオペランドは、postfix ++演算子と同様にデクリメントされますが、オペランドはbool型ではありません。 [注:プレフィックスのインクリメントとデクリメントについては、5.3.2を参照してください。 ]
そして当然のことながら...
5.3.2-2
プレフィックス-のオペランドは、1を減算することにより変更されます。オペランドはブール型であってはなりません。それ以外の場合、prefixのオペランドの要件と結果のプロパティは、prefix ++の要件と同じです。 [注:後置インクリメントとデクリメントについては、5.2.6を参照してください。 ]
また、5.6.2-1および5.3.2-1では、boolの++が真であると言及されており、Annex D-1では、boolの++は廃止される予定です。
歴史的な理由により、これはサポートされていました。ただし、...++演算子でのbool型のオペランドの使用は推奨されないことに注意してください。C++標準のセクション5.3.2を参照してください(n3092)
5.3.2増分および減分[expr.pre.incr]