コンパイラがこれを処理する方法は、それを適切なマシン命令に変換することです。
この場合:
if (b)
これは通常、x86 マシンでは次のように変換されます。
cmp eax, eax ; compare register eax with itself
jz target ; jump to target if zero
上記のコードは、ゼロが CPU の特殊なケースであることを示しています。ほとんどではないにしても多くの命令が、値を操作するときにいくつかの内部フラグを設定するため、後でjz
and jnz
(ゼロでない場合はジャンプ) を実行できます。 .
他にも、オーバーフロー、キャリー、サイン、パリティなどのフラグがあります。
比較として、CPU でネイティブに処理できる型については、組み込みの命令があります。
mov eax, a ; eax = a
cmp eax, b ; compare eax to b
jl target ; jump to target if less (eax < b --> a < b)
ジャンプ手順の詳細については、インテル x86 JUMP クイック リファレンス を参照してください。
型をネイティブに処理できない場合は、通常、0/1 (または 0/N、N は負の可能性があることに注意してください) の値を返す関数呼び出しを伴います。この場合、if (b)
処理する命令の型にフォールバックします。その関数の結果。
このようなもの:
mov eax, a ; eax = a
mov ebx, b ; ebx = b
call function ; call comparison function, result returned in eax
cmp eax, eax
jz notequal