は短絡論理演算子輸?評価することにあります。
-
06-07-2019 - |
質問
は、ANSI標準 任務 の論理演算子を短絡することのいずれかで、CやC++?
とても面白かったための思い出のK&R book"というコードだけに頼るこれらの操作を短絡し、彼らがいません。えっください点が標準で言論理opsは常に短絡?私の主な関心に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.これらの事業者が多重定義されています(項13に有効な文脈で、このように指定ユーザ定義のオペレーター機能の発現を指定する機能呼び出しの形式のオペランドの引数リスト な暗黙の配列をポイントです。
通常、お勧めできません過負荷にこれらの事業者のC++を持っていない場合、非常に希望に沿った対応ができます。行うことができるので、その破壊の予想の振る舞いを、他の人のコードの場合、これらの者の使用による間接スをインスタンス化のテンプレートのタイプオーバーロードされます。
他のヒント
短絡評価の上、ご注文の評価が義務のある意味標準の両方のCおよびC++.
でなかったならば、このような共通ム
char* pChar = 0;
// some actions which may or may not set pChar to something
if ((pChar != 0) && (*pChar != '\0')) {
// do something useful
}
第 6.5.13論理やオペレーター のC99仕様 (PDFリンク) という
(4).とは異なりのビット単位でバイナリー&オペレーター、&&オペレーターの保証 左右への評価があり 配列のポイントの評価 最初のオペランド.場合、最初の オペランドの比較等を0に 第二のオペランドが評価されます。
同様に、課 6.5.14論理やオペレーター という
(4)とは異なりのビット単位|オペレーター、|| オペレーターの保証が左から右に配置される 評価ある配列点 後評価の オペランド.場合、最初のオペランドを比較し 不0,二つ目のオペランドが ず評価されます。
類似の文言はC++の標準 チェック部5.14にコピー.としてチェッカーノーにも答えた場合、オーバーライド&&や||その両方のオペランドを評価する必要があり通常の機能ます。
いることを義務付けるもので、両方の評価順序および短絡).おとえば、すべての機能trueを返し、話からも厳しくfunctionAしfunctionBしfunctionC.このような
if(ptr && ptr->value) {
...
}
同じカンマのオペレーター:
// calls a, then b and evaluates to the value returned by b
// which is used to initialize c
int c = (a(), b());
って言うとの間に左右被演算子の &&
, ||
, ,
との間で次/第三のオペランドの ?:
(条件付きオペレーター)は、"配列します。ず評価はしっかりしました。このように、この安全:
int a = 0;
int b = (a++, a); // b initialized with 1, and a is 1
なお、カンマ演算子混同されるべきではないの文法カンマを使用するもの
// order of calls to a and b is unspecified!
function(a(), b());
C++の標準とに 5.14/1
:
は、&&オペレーターの団体が左から右に配置される.のオペランドの両方に暗黙的に変換型bool(第4節).結果がtrueの場合両方のオペランドがtrueおよびfalseです。とは異なり&,&&保証左 評価:二つ目のオペランドでは評価しない場合、最初のオペランドはfalseです。
や 5.15/1
:
は、事業者団体が左から右に配置される.のオペランドの両方が暗黙的に変換されbool(第4節).い場合にtrueを返しまいずれかのオペランドはtrue、そうでない場合はfalse.とは異なり|,||保証左右への評価また、二つ目のオペランドでは評価しない場合、最初のオペランドより評価します。
もっとも人:
その結果、bool.すべて副作用の発現を除き、破壊temporaries(12.2)が起こる前に、第二の表現を評価します。
また、 1.9/18
という
の評価にそれぞれの表現
a && b
a || b
a ? b : C
a , b
されている"を意味する事業者は、これらの表現(5.14, 5.15, 5.16, 5.18), ある配列のポイントの評価の表現です。
直線から古K&R
Cることを保証
&&
や||
評価を左右に—私たちはすぐに参照する場合。
れも注意した方が良いと思います。
基礎の種類これらのショートカットです。
が設定されていない場合はこれらの事業者のための自分のクラスの列挙型のないストメニューから起動できます。この意味の違いを利用下でのこれらの異なる状況であることをおすすめな定義されます。
のための operator &&
や operator ||
のための基本的な種類の評価順序は左からである(その他短切断することは難しいだろう:-)が過負荷運営者が定義するに、これらは基本的には統語的には砂糖を定義する方法をこの順で評価のパラメータについては、定義されていません。
場合はWikipediaの信頼:
[
&&
や||
"の意味的に全く異なるビット-ワイス事業者&と|がいを評価し、右側の被演算子の場合に結果から決定しなければならなけ
ご質問を C++演算子の優先順位 とassociativity.基本的には、表現の複数の事業者とのない括弧内はコンパイラを構築しますの表現によってツリーに次のルールをきちんと守り、ルールに
のための優先順位がすようなもの A op1 B op2 C
, またグループのものとして (A op1 B) op2 C
または A op1 (B op2 C)
.の場合 op1
高い優先順位よ op2
, を取得するでしょう最初の表現です。その他のいだのです。
のためのassociativityきい A op B op C
, "が、再びグループとして薄 (A op B) op C
または A op (B op C)
.の場合 op
残associativity、我々の最初の表現です。場合には右associativityました。このオペレーターでは同じ優先順位です。
この特定のケースでは、 &&
高い優先順位よ ||
, の表現として評価し、 (a != "" && it == seqMap.end()) || isEven
.
のは"左から右"の表現-ツリー形式です。うちの最初の評価 a != "" && it == seqMap.end()
.の場合はtrue、そうで全体の発現はtrue、そうでないま isEven
.手順を繰り返し再帰的に内部の左subexpressionのコースです。
面白いの豆知識が、コンセプトの優先順位は数学表記です。●同じようなことが起き a*b + c
, では、 *
高い優先順位よ +
.
でも面白い/曖昧になり、unparenthasiszed表現 A1 op1 A2 op2 ... opn-1 An
, 全てのオペレーターは同じ優先順位の数はバイナリ表現の木この形式で与えられますので カタロニアの数.大 n
, これらの成長の非常に早い。d