1. ホーム
  2. c++

[解決済み] 論理演算子の短絡は必須ですか?また、評価順序は?

2022-05-10 01:26:24

質問

ANSI規格は を義務づけています。 は、C または C++ のいずれにおいても、論理演算子を短絡させることを義務付けていますか?

K&R の本で、これらの演算が短絡していることにコードを依存すべきではないと書かれていたのを思い出して、混乱しています。どなたか、標準のどこで論理演算が常に短絡されていると言っているのか指摘していただけませんか。私は主に C++ に興味がありますが、C にも回答があると助かります。

私はまた、評価順序は厳密に定義されていないので、コードは式内の関数が特定の順序で実行されると依存または仮定すべきではないと読んだことを覚えています (場所は思い出せません)。

規格はこの式の評価順序を示していますか?

if( functionA() && functionB() && functionC() ) cout<<"Hello world";

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

はい、演算子には短絡と評価順序が必要です。 ||&& は、CとC++の両方の規格に含まれています。

C++標準では(C標準に同等の条項があるはずです。)

1.9.18

以下の式の評価において

a && b
a || b
a ? b : c
a , b

のように、これらの式に含まれる演算子の組み込みの意味を使っています。 の評価後にシーケンスポイントが存在します。 (12).

C++では、追加のトラップがあります:短絡は、次のことを行います。 ではない は演算子をオーバーロードする型には適用されません。 ||&& .

脚注12: この段落で示される演算子は、第5節で説明されるように組み込み演算子である。これらの演算子の1つが有効な文脈でオーバーロード(第13項)され、したがってユーザ定義演算子関数を指定する場合、式は関数呼び出しを指定し、オペランドは引数リストを形成する。 を形成し、オペランドはそれらの間に暗黙のシーケンスポイントなしで

C++でこれらの演算子をオーバーロードすることは、非常に特殊な要件がない限り、通常は推奨されません。特に、これらの演算子をオーバーロードした型のテンプレートをインスタンス化することによって、これらの演算子が間接的に使用される場合、オーバーロードすることは可能ですが、他の人のコードで期待される動作が壊れる可能性があります。