[解決済み] ブール演算子 ++ と --
質問
今日、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
になる可能性があるため
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);
しかし,この例では
x
を
int
と等価であるように、条件付き以外のあらゆる場所で
int x = -5;
while(++x != 0)
doSomething(x);
のみを使用するのとは異なり
x
をブール値として使用することとは異なります。
関連
-
[解決済み】 unsigned int vs. size_t
-
[解決済み】Visual Studio 2015で「非標準の構文。'&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】Visual C++で "Debug Assertion failed "の原因となる行を見つける。
-
[解決済み】C++の余分な資格エラー
-
[解決済み] 1ビットのセット、クリア、トグルはどのように行うのですか?
-
[解決済み] static_cast, dynamic_cast, const_cast, reinterpret_cast はいつ使うべきですか?
-
[解決済み] コピーアンドスワップ慣用句とは?
-
[解決済み] スマートポインターとは何ですか?
-
[解決済み】C/C++の"-->"演算子とは何ですか?
-
[解決済み】boolのprintfフォーマット指定子とは?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】coutはstdのメンバではない
-
[解決済み】C++のGetlineの問題(オーバーロードされた関数 "getline "のインスタンスがない
-
[解決済み】C++ 式はポインタからオブジェクトへの型を持っている必要があります。
-
[解決済み】'cout'は型名ではない
-
[解決済み】C++エラー:の初期化に一致するコンストラクタがありません。
-
[解決済み] 非常に基本的なC++プログラムの問題 - バイナリ式への無効なオペランド
-
[解決済み】C++プログラムでのコンソールの一時停止
-
[解決済み】c++でstd::vectorを返すための効率的な方法
-
[解決済み] to_string は std のメンバーではない、と g++ が言っている (mingw)
-
[解決済み] 一発勝負の'if'を書くための最もエレガントな方法