[解決済み] 偽<真」という演算はきちんと定義されているのでしょうか?
質問
C++の仕様で定義されているのか。
- 真偽値のパラメータに対する'less than'演算子の存在、および存在する場合。
- 4つのパラメータを並べ替えた結果は?
つまり、以下の操作による結果は、仕様で定義されているか?
false < false
false < true
true < false
true < true
私のセットアップ (Centos 7, gcc 4.8.2) では、以下のコードは私が期待するものを吐き出します (C が false を 0、true を 1 と表現する歴史を考慮しています)。
false < false = false
false < true = true
true < false = false
true < true = false
ほとんどの(すべての?)コンパイラが同じ出力をすることは間違いないと思いますが、これはC++の仕様で決められているのでしょうか?それとも、難読化しても仕様に準拠したコンパイラであれば、trueはfalseより小さいと判断してよいのでしょうか?
#include <iostream>
const char * s(bool a)
{
return (a ? "true" : "false");
}
void test(bool a, bool b)
{
std::cout << s(a) << " < " << s(b) << " = " << s(a < b) << std::endl;
}
int main(int argc, char* argv[])
{
test(false, false);
test(false, true);
test(true, false);
test(true, true);
return 0;
}
解決方法は?
TL;DR。
C++標準のドラフトによると、操作はよく定義されています。
詳細
にアクセスすることで確認できます。
C++規格のドラフト
セクション
5.9
関係演算子
というもので、(
今後ともよろしくお願いします
):
は オペランドは算術演算が可能でなければならない。 またはポインタ タイプ またはstd::nullptr_t型です。演算子 < (以下)、 > (以上)、 <= (以下)、 >= (以上)は、すべて以下の結果をもたらします。 偽または真。結果の型はboolである
とboolsは3.9.1 Fundamental typesにあるarithematic typesです。
タイプ ブール char, char16_t, char32_t, wchar_t, および符号付き整数型と符号なし整数型は、一括して 積分型といいます。
そして
積分型と浮動型を総称して算術型と呼びます。 という型があります。
と
true
そして
false
はブーリアンリテラルで
2.14.6
ブーリアンリテラルです。
boolean-literal:
false
true
セクションに戻る
5.9
を読んで、さらに関係演算子の仕組みを見てみると、こう書いてあります。
通常の算術変換は、算術型または列挙型のオペランドに対して行われます。
その
通常の算術変換
は、セクション
5
というのがある。
そうでなければ、積分促進(4.5)は、両方のオペランドに実行されなければならない
およびセクション
4.5
は言う。
bool型のprvalueはint型のprvalueに変換することができ、falseは0、trueは0になります。 が1になります。
というように、式があります。
false < false
false < true
true < false
true < true
となり、このルールが適用されます。
0 < 0
0 < 1
1 < 0
1 < 1
関連
-
[解決済み] [Solved] Error C1083: Cannot open include file: 'stdafx.h'
-
[解決済み】C++でランダムな2倍数を生成する
-
[解決済み】Eclipse IDEでC++エラー「nullptrはこのスコープで宣言されていません」が発生する件
-
[解決済み】'std::cout'への未定義の参照
-
[解決済み] explicit キーワードの意味は?
-
[解決済み] 文字列の単語を反復処理するにはどうすればよいですか?
-
[解決済み] ルール・オブ・スリーとは?
-
[解決済み] 文字列が空かどうかを確認する方法は?
-
[解決済み] not(True) in [False, True]」はなぜFalseを返すのですか?
-
[解決済み】C/C++の"-->"演算子とは何ですか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】構造体のベクター初期化について
-
[解決済み】C++ クラスヘッダが含まれているときに「不明な型」があるのはなぜですか?重複
-
[解決済み】Visual Studio 2015で「非標準の構文; '&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】デバッグアサーションに失敗しました。C++のベクトル添え字が範囲外
-
[解決済み】fpermissiveフラグは何をするのですか?
-
[解決済み】エラー:free(): 次のサイズが無効です(fast)。
-
[解決済み】浮動小数点数の乱数生成
-
[解決済み] gdbを使用してもデバッグシンボルが見つからない
-
[解決済み】std::cin.getline( ) vs. std::cin
-
[解決済み] to_string は std のメンバーではない、と g++ が言っている (mingw)