質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

21171閲覧

C++ bool値の演算は論理演算を使わずにビット演算でも大丈夫でしょうか?

退会済みユーザー

退会済みユーザー

総合スコア0

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2016/08/30 06:05

コードとしては下記の様な感じです。

C++

1bool result = true; 2 3// bool値を論理演算で比較して結果を代入 4result = result && true; 5 6// 上記だと result 2回出てきてなんかスッキリしないので、ビット演算でも結果が同じなら使いたい 7result &= true;

C++ の bool型は、内部的に 0/1 のint値管理のイメージがあるので、
ビット演算でも論理演算と同じ結果が得られそうなのですが、
実際のところ全てのコンパイラで問題無いのでしょうか?

一応下記で確認した限りでは、論理演算でもビット演算でも同じ結果が得られました。
http://ideone.com/e.js/zVWZKA

C++

1#include <iostream> 2using namespace std; 3 4int main() { 5 // your code goes here 6 bool is_true = true; 7 bool is_false = false; 8 cout << "is_true : " << is_true << endl; 9 cout << "is_false : " << is_false << endl; 10 cout << endl; 11 12 // bool値の演算は、論理演算ではなくbit演算子でも良いのだろうか? 13 // C++的に boot値は 0/1 で内部的には持ってそうなので行けそう? 14 // ビット演算子だと代入が簡単なので使いたいなーというお話 15 16 // is_true true 17 cout << "is_true && true : " << (is_true && true) << endl; 18 cout << "is_true & true : " << (is_true & true) << endl; // これが使える is_true &= true 19 cout << "is_true || true : " << (is_true || true) << endl; 20 cout << "is_true | true : " << (is_true | true) << endl; // これが使える is_true |= true 21 cout << endl; 22 23 // is_false true 24 cout << "is_false && true : " << (is_false && true) << endl; 25 cout << "is_false & true : " << (is_false & true) << endl; // これが使える is_false &= true 26 cout << "is_false || true : " << (is_false || true) << endl; 27 cout << "is_false | true : " << (is_false | true) << endl; // これが使える is_false |= true 28 cout << endl; 29 30 // is_true false 31 cout << "is_true && false : " << (is_true && false) << endl; 32 cout << "is_true & false : " << (is_true & false) << endl; // これが使える is_true &= false 33 cout << "is_true || false : " << (is_true || false) << endl; 34 cout << "is_true | false : " << (is_true | false) << endl; // これが使える is_true |= false 35 cout << endl; 36 37 // is_false false 38 cout << "is_false && false : " << (is_false && false) << endl; 39 cout << "is_false & false : " << (is_false & false) << endl; // これが使える is_false &= false 40 cout << "is_false || false : " << (is_false || false) << endl; 41 cout << "is_false | false : " << (is_false | false) << endl; // これが使える is_false |= false 42 43 return 0; 44}

stdout

1is_true : 1 2is_false : 0 3 4is_true && true : 1 5is_true & true : 1 6is_true || true : 1 7is_true | true : 1 8 9is_false && true : 0 10is_false & true : 0 11is_false || true : 1 12is_false | true : 1 13 14is_true && false : 0 15is_true & false : 0 16is_true || false : 1 17is_true | false : 1 18 19is_false && false : 0 20is_false & false : 0 21is_false || false : 0 22is_false | false : 0

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

実際のところ全てのコンパイラで問題無いのでしょうか?

質問にあるコード例であれば、全てのC++コンパイラで期待通り動作します。

少し気になるのは、本当にそのようなことをしたいのでしょうか?例えばbool型の変数resultがあったとき、result &= true;は「何もしないこと」と同義です。他パターンも同様に:

C

1result &= true; // 何もしない 2result &= false; // result = false;と同義 3result |= true; // result = true;と同義 4result |= false; // 何もしない

投稿2016/08/30 06:22

yohhoy

総合スコア6191

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/08/30 06:38

ご回答ありがとうございます。 >少し気になるのは、本当にそのようなことをしたいのでしょうか? 具体的には、JSONをパースする処理内で利用する想定です。 JSONデータの仕様的に状況によって型が変わる箇所があるので、 その箇所で型チェックをして想定外なら全パース失敗とする処理を行う想定です。 そもそも、JSONデータの仕様的に型が変わって変える場合があること自体、 違和感ありありなのですが、そのように返ってきてしまうので・・・ ```C++ bool result = true; result &= [JSONの項目1].isDouble(); // double型想定。 result &= [JSONの項目2].isString(); // string型想定。 // 上記で [JSONの項目1] が stringとかが来ていたらfalse にしてしまう ... ... ... ```
yohhoy

2016/08/30 06:42

質問中にあるtrue/falseリテラル部分は、実際にはプログラム実行時に決まる値なんですね。それなら意味はあると思います。
guest

0

x、y がbool型の変数とします。もし、これらが局所変数でうっかり初期化を忘れてしまった場合などでは、値がtrueでもfalseでもないゴミである可能性があります。その場合、x && y と x & y は同じとは限りません。
もうひとつ、f(z)がbool型の副作用のある式だとします。この場合、

x = x && f(z);

はxがfalseの場合、f(z)は評価されませんので副作用はありません。しかし、

x &= f(z); の場合は、xの値が何であってもf(z)は評価されますので必ず副作用があることになります。

そのため、論理演算子をビット演算子に置き換えた場合に挙動が異なる可能性があります。

投稿2018/12/14 22:39

myoon

総合スコア100

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問