「効率」がコンパイルされたコードの効率を意味する場合、「Cでそれを行う最も効率的な方法」はありません。
まず、コンパイラが C 言語の演算子を「明白な」機械の対応するものに変換すると仮定しても (つまり、C の乗算を機械の乗算に変換するなど)、各方法の効率はハードウェア プラットフォームごとに異なります。非常に特定のハードウェア プラットフォーム上の非常に特定の命令シーケンスに検討を限定したとしても、たとえば、全体が分岐予測ヒューリスティックとどれだけ一致するかによって、さまざまな周囲のコンテキストで異なるパフォーマンスを示す可能性があります。指定された CPU。
第 2 に、最新の C コンパイラは、C 演算子を「明白な」マシンの対応物に変換することはめったにありません。多くの場合、マシン コードで使用される命令は、C コードとほとんど共通点がありません。Cレベルでチェックを実行する多くの「完全に異なる」方法が、実際にはスマートコンパイラによって同じマシン命令シーケンスに変換される可能性があります。同時に、周囲のコンテキストが異なる場合、同じ C コードが異なるシーケンスの機械語命令に変換される可能性があります。
つまり、特定のハードウェア プラットフォーム、特定のコンパイラ バージョン、および特定のコンパイル設定セットに実際にローカライズしない限り、あなたの質問に対する意味のある答えはありません。そして、ローカライズされすぎて役に立たなくなります。
これは通常、最も読みやすいコードを書くことが最善の方法であることを意味します。やるだけ
if (a == 0 || b == 0)
コードの読みやすさは、人間の読者がそれを理解するのに役立つだけでなく、コンパイラが意図を適切に解釈して最適なコードを生成する可能性を高めます。
しかし、パフォーマンスが重要なコードから最後の CPU サイクルを絞り出す必要がある場合は、さまざまなバージョンを試して、それらの相対的な効率を手動で比較する必要があります。