2016-12-30 9 views
0

論理演算子をどのように組み合わせるのがどれほど費用がかかりますか?それらを組み合わせる最良の方法は何ですか?論理演算子をCで結合する

例: 最適化の点で次の2つのステートメントの違いは何ですか?

1) if((!x || !y || !z) && (a != b)) 
2) if(!(x && y && z) && (a != b)) 

ORing操作よりも頻繁にANDing操作を使用する必要があると私の同僚から聞きました。私はC言語が初めてです。誰かが私にこれを理解するのを助けてください。どんな材料やリンクも役に立つでしょう。

+1

コンパイラに任せてください。おそらく、そのようなものを最適化することでより効率的です。 – alk

+1

ボトムは、デモガンの法則に従って同じです。 – haccks

+6

Cの条件式を評価するための[短絡](https://en.wikipedia.org/wiki/Short-circuit_evaluation)ルールに注意してください。条件式全体を評価することなく条件式全体を知ることができれば、スキップしました。したがって、発生すると予想される副作用に注意してください(値の変更または関数呼び出しの可能性があります)。直接的な答えは、最も簡単に理解できる最も明快な方法で条件文を書くことです。あなたが来年それを見るときです。 –

答えて

3

このコードが極端にホットパスの場合は、常に将来のリーダーにとって最も論理的な形式を選択してください。

ホットパスでの場合は、両方をコンパイルしてアセンブリを調べます。あなたは多くのコンパイラとCPUの出力を確認してみましょう一つの良いツールがここgodbolt

であるあなたのシナリオをテストする例を示します:fiddle

あなたが見ることができるように、命令の数が同じです。

3

どちらも同じであり、パフォーマンスに影響を与えるべきではありません。それらはDe Morgan's Lawに従ってお互いの等価物です。