aとbの結果は何ですか?質問する

aとbの結果は何ですか?質問する

これは厄介ですが、ビット単位の AND 演算子は C++ 標準で次のように定義されています (強調は筆者による)。

通常の算術変換が実行されます。結果はそのオペランドのビットごとのAND関数である演算子は整数またはスコープなしの列挙オペランドにのみ適用されます。

これは私には意味がないように思えます。私が見る限り、「ビット AND 関数」は標準のどこにも定義されていません。

AND 関数はよく理解されているので、説明は不要かもしれないことは理解しています。「ビット単位」という言葉の意味もかなり明確です。関数は、そのオペランドの対応するビットに適用されます。ただし、オペランドのビットを構成するものが明確ではありません。

何が起こったのですか?

ベストアンサー1

これは十分に指定されていません。ビット単位の演算について言及する場合、標準が何を意味するかという問題は、いくつかの欠陥レポートの対象となっています。

例えば欠陥レポート 1857: ビットに関する追加の質問:

5.11 [expr.bit.and]、5.12 [expr.xor]、および 5.13 [expr.or] のビット演算の仕様では、演算の説明に未定義の用語「ビット単位」が使用されていますが、対象としているのが値なのかオブジェクト表現なのかは指定されていません。

この問題を解決するには、「ビット」(C++ では現在定義されていません)を 2 の累乗の値として定義することが考えられます。

そして返答はこうでした。

CWG は、ビットへの言及を避けるために操作自体の説明を書き直すことを決定し、「ビット」の定義などのより大きな問題を 1943 号に分割してさらに検討することとしました。

そして欠陥報告書 1943言う:

CWG は、2014-06 (ラッパースヴィル) 会議で、問題 1857 および 1861 で提起された質問の限定されたサブセットのみに対処することを決定しました。この問題は、2 nの値で「ビット」を定義すること、ビット フィールドに符号ビットがあるかどうかを指定することなど、残りの質問のプレースホルダーです。

このことからわかるのは欠陥レポート 1796: ヌル文字のすべてのビットがゼロであることは意味のある要件ですか?、影響を受けるビットを参照する場合に標準が何を意味するかというこの問題は、他のセクションにも影響します。

2.3 [lex.charset] 3項によれば、

基本実行文字セットと基本実行ワイド文字セットには、それぞれ、基本ソース文字セットのすべてのメンバーに加えて、アラート、バックスペース、およびキャリッジリターンを表す制御文字と、すべてのビットがゼロであるヌル文字 (それぞれヌルワイド文字) が含まれます。

移植可能なプログラムが表現のビットを調べることができるかどうかは明らかではありません。代わりに、値表現に対応する数値のビットを調べることに限定されているようです (3.9.1 [basic.fundamental] 段落 1)。表現のビット パターンを指定するのではなく、ヌル文字値が 0 または '\0' と等しいことを要求する方が適切かもしれません。

シフト演算子、ビット単位の AND 演算子、ビット単位の OR 演算子の定義にも同様の問題があります。これらの仕様は、表現のビット パターンに対する制約なのでしょうか、それとも、これらのパターンを数値として解釈した結果の値に対する制約なのでしょうか。

この場合、解決策は次のように変更することでした。

表現はすべてゼロビットである

に:

値は0です。

ご了承くださいecatmurの回答で述べたように5.2.4.2.1C++標準草案はC標準のセクションに従っている。3.9.1 [基本.基礎]この段落では、少なくとも結果が実装定義であることを教えてくれる C 標準の3セクションを参照していません6.5/4。以下のコメントで、C++ 標準では規範的な参照からのテキストのみを明示的に組み込むことができると説明しています。

おすすめ記事