1. ホーム
  2. c++

[解決済み] ブール演算子 ++ と --

2022-11-27 12:34:05

質問

今日、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");

どのように解決するのですか?

整数値をブール値として使用した歴史からきています。

もし xint のようにブーリアンとして使用しています。 if(x)... のようにブールとして使っている場合、インクリメントすると、操作前の真理値が何であれ、その真理値が true になることを意味します(オーバーフローを除く)。

しかし、その結果を予測することは不可能であり、そのため -- の真偽値だけを知っていれば x になる可能性があるため false (積分値が 1 の場合) または true (積分値がそれ以外の場合 - 特に0を含む [ ]) false と2以上の [ true ]).

ということで、ショートハンドとして ++ が機能し -- は動作しませんでした。

++ はこれとの互換性のために bools で許可されていますが、その使用は標準では非推奨であり、C++17 で削除されました。


これは、私が だけ 使用する x をブール値として使うことで、 オーバーフローが起こらないようにすることができます。 ++ をそれ自体がオーバーフローを引き起こすのに十分な回数行うまで、オーバーフローは起こらないということです。たとえchar型が使われ CHAR_BITS が 5 のような低い値であったとしても、これが動作しなくなるまでに 32 回もあります (これでも十分に悪い習慣であることを証明しています。 int を使用する場合は、もちろん ++ を 2^32 回使用しなければなりません。とは -- になるだけですが。 false の値を 1 から始めると true に 1 を指定するか、0 から始めて ++ を正確に一度だけ使用したことがあります。

これは、0よりほんの少し下の値から始める場合は異なります。実際、そのような場合、私たちは ++ を結果的に false のように最終的に値を指定します。

int x = -5;
while(++x)
  doSomething(x);

しかし,この例では xint と等価であるように、条件付き以外のあらゆる場所で

int x = -5;
while(++x != 0)
  doSomething(x);

のみを使用するのとは異なり x をブール値として使用することとは異なります。