5

私は最近コードに出くわしました

// ゼロ除算を克服するプログラム

int a=0;
int b=100;

int c= a==0 || b/a ;

printf("Hello");

// 出力 : こんにちは

私の理論: 優先順位によると、演算子 / は || よりも優先順位が高くなります。したがって、b/a を最初に実行する必要があり、実行時エラーが発生するはずです。

私は何が起こっていると思います:

短絡演算子 || 、LHS a==0 を評価します。これは真であり、したがって b/a を実行しません。

私の理論は間違っていますか?これは非常に単純なことであり、今は理解できないと確信しています

4

2 に答える 2

8

優先順位は評価順序を意味するものではなく、グループ化 (括弧) のみを意味します。

の最初のオペランドの評価の後にシーケンス ポイント (古い用語) がある||ため、これらのオペランドが何であるかに関係なく、 の最初のオペランドは||2 番目のオペランドの前に評価する必要があります。この場合、式の全体的な結果はa == 0 || b/a最初のオペランドによって決定されるため、2 番目のオペランドはまったく評価されません。

于 2012-11-10T12:46:31.437 に答える
3

/overの優先順位が高い||ということは、式が次のように評価されることを意味します。

int c= (a==0) || (b/a) ;

そしてそうではない

int c= (a==0 || b)/a ;

それでも、論理評価が短絡しているため、 のb/a場合にのみ評価されますa!=0

于 2012-11-10T12:47:39.053 に答える