次のコードを検討してください。
if(x = a/b, a%b)
printf("do this");
else
printf("do that");
ここで、if
ステートメントをif(x = a/b && a % b)
. その後、それも機能します。&&
したがって、コンマを演算子に置き換えること、またはその逆が常に機能するかどうかを知りたいif-else and loops
次のコードを検討してください。
if(x = a/b, a%b)
printf("do this");
else
printf("do that");
ここで、if
ステートメントをif(x = a/b && a % b)
. その後、それも機能します。&&
したがって、コンマを演算子に置き換えること、またはその逆が常に機能するかどうかを知りたいif-else and loops
彼らはかなり違います!
最初の例で,
は、コンマ operatorがあります。これは、最初のオペランドを評価して結果を破棄し、次に 2 番目のオペランドを評価してこの値 (および型) を返す二項演算子です。
そう、
if(x = a/b, a%b)
と同等です(@jaketに感謝)
x = a/b;
if(a%b)
a%b
常に評価されます。
2 つ目の場合:
if(x = a/b && a % b)
と同等です
x = (a/b) && (a%b);
if( x )
a%b
a/b
(つまりa/b
、0 でない) が true の場合にのみ評価されます。
コンマ演算子を && に置き換えると、ロジックが少し変更されます。コンマ演算子が行うことは、x = a/b を実行して「結果を破棄する」ことです。つまり、if 条件では考慮されず、a%b のみが考慮されます。
もしあなたがそうするなら
if(x = a/b && a % b)
a/b が 0 でなく、 a % b が 0 でない場合にのみ、"do this" が出力されます。一方、コンマ演算子では、a % b がゼロでない場合にのみ「do this」が出力されます。
if(x = a/b, a%b)
難読化された読みにくい書き方です
x = a/b;
if(a%b)
しかし
x = a/b && a % b
と同等です
x = ( (a/b) && (a%b) );
要約すると、同じ行に多数の異なる演算子を混在させないでください。あなたがそれで達成した唯一のことは、バグを作成しながら自分自身を混乱させることでした.
&& 演算子はa/b
、式 を決定する際に の結果も考慮に入れます。 のx = a/b && a%b
場合,
、 の結果a/b
は無視されます。したがって、との置き換えは常に機能,
すると&&
は限りません。そして、正しいことではなく、