2009-07-10 20 views
6

まず始めに、私はVC++ 2008 Professionalを使用しており、Windows OS上でIntel core2を実行しています。また、このコードは、Windowsを実行しているcore2/corei7以外で実行されることはありません。whileループの条件の順序

私はこのような2つの条件を持つwhileループを持っています: 注:これははるかに単純化されたバージョンです。

while((a != b) && (array[a] < c)) 

最初の条件(a != b)がfalseを生成した場合、第2の条件はさえ評価されるのでしょうか?またはループはちょうどそこで終わるでしょうか?

私はいくつかのテストを行いましたが、実際にはそうだと思われます。

ただし、ここにキャッチがあります。最初の条件がfalseを評価する場合、2番目の条件は評価されるとアクセス違反を生成します。しかし、私が見ることのできるところでは、最初の条件がfalseと評価されると、プログラムは2番目の条件を評価してループを終了し、それによって私を節約します。

問題は、私が非常に素敵できちんとしたコードを突然私に吹き飛ばすことなく、アクセス違反の問題を取り除くことができないということです。しかし、小さな "バグ"(私はそれがバグではなくコンパイラの最適化だと知っています)のために、私はそれを離れていくことができるようです。私はこれがおそらく良いプログラミングの練習ではないことも知っていますが、正直言って私の状況では、もしうまくいくならば、私はすでにゲームに先んじています。

私の質問は、この「バグ」やプログラミングの過ちが戻ってきて、いつか私に噛み付くのでしょうか?私がこのセクションから地獄をテストしたとみなした時でさえ、この1回だけこれを使用するでしょうか?

+0

あなたにはたくさんの質問があります。あなたはちょうど私のメッセンジャーを追加する必要があります笑 –

+0

もう一度!あなたはMMであなたにメッセージを送り、あなたに私のメッセンジャーをくれます。おい、あなたのいる場所の3AMのようなその!あなたは眠りませんか?あなたはちょうど...ここに住んでいますか? (私は唯一の他の誰もが眠っているので私はこの遅れているので、私は私の論文でいくつかの作業を行うことができますので、私を気にしない)。 – Faken

+0

私はいくつかのサイトを定期的にチェックし、あなたの質問はいつも私の興味を引くものであり、ページの上部近くにあります。それは少し怖いです。私は実際に2時間後に早期ジムを運転しています。 –

答えて

22

最初の条件がtrueに評価されない限り、2番目の条件は評価されません。あなたはこれを期待することができます。何百万行ものコードが動作するのは、これがCとC++が論理式の評価を短くするためです。

これを使用してカウントすることができます。最初の式がfalseと評価された場合、2番目の式もstartと評価されません。

+3

しかし、最初の条件がfalseを返す原因となった状態で評価された場合、2番目の条件によってプログラムがクラッシュする可能性がありますが、これは大丈夫ですか? – Faken

+0

はい、すべての標準準拠のC++実装でこれが保証されます。 – sharptooth

+1

@Faken - はい、問題ありません。心配しないでください! –

2

評価されません。しかし、あなたが心配しているならば、あなたのコードがあなたに噛み付くように戻ってきて、あなたが書いていることを再評価すべきだということはすべてです。あなたはそれがプログラミングの習慣として貧弱だと認めました。あなたはすでにそれが問題になることを知っています。これらの条件が満たされたら、ただ修正してください。あなたは午前中にあなた自身をあまり嫌いにしません。

+0

私は理解していますが、私が書いたコードのほんの素敵できれいな13行は、これが正しく動作するように依存しています...私はそれを修正すれば、多くのメモリとスピードを失います。私が言いたいのは、コードの実行が2-3倍遅くなるということです。 – Faken

+0

ただ心配しないでください。短絡評価にもよりますが、コードを書いています。ループの状態が最初に偽である場合、whileループが開始するとは思わないでしょうか?同じことがここにあります。 – sharptooth

+0

私は興味があります、なぜあなたはそれが貧しいプログラミングの慣習であることに同意しますか? –

4

これはバグではありません。 C++は短絡評価を使用しているため、最初の条件がfalseのときに2番目の条件が評価されることはありません。

1

この言語はこの短絡動作を保証しているため、使用することによってまったく気にする必要はありません。また、|| - 最初の条件が真の場合、2番目の条件は評価されません。

1

C++論理AND演算子とOR演算子の短絡動作を短くすることは悪い習慣とはみなされません。これは完全に慣用的であり、しばしばより明確でより簡潔なコードにつながります。

など。短絡&&

std::auto_ptr<SomeObject> data; 

// Clear expired data, if present 
if(data.get() && data->expired) 
    data.reset(); 

あなたはより多くのコードが冗長につながるifの余分なレベルを必要とする&&の短絡を使用せずに。

// Clear expired data, if present 
if(data.get()) 
{ 
    if (data->expired) 
     data.reset(); 
} 
1

最初の条件が真でない場合、2番目の条件は評価されません。 この最適化の後には、すべてのC++コンパイラが続きます。

これでも使えない場合は、whileの簡単なif文を追加してください。

while (a != b) { 
    if (array[a] < c) 
    { 
     // your code goes here. 
    } 
    else 
    { 
     break; 
    } 
} 
関連する問題