33

このコードに出くわしました。私は通常、「&&」または「||」を使用します ループ内の複数の条件を分離するためにfor使用されますが、このコードではコンマを使用してそれを行っています。

驚いたことに、条件の順序を変更すると、出力が変化します。

#include<stdio.h>

int main() {
    int i, j=2;

    for(i=0; j>=0,i<=5; i++)
    {
         printf("%d ", i+j);
         j--;
    }
    return 0;
}

出力 = 2 2 2 2 2 2

#include<stdio.h>

int main(){
    int i, j=2;

    for(i=0; i<=5,j>=0; i++)
    {
         printf("%d ", i+j);
         j--;
    }
    return 0;
}

出力 = 2 2 2

誰かが理由を説明できますか?最後のカンマ区切りの条件だけをチェックしているようです。

4

7 に答える 7

65

コンマ演算子はすべてのオペランドを評価し、最後のオペランドの値を返します。したがって、基本的に最初にどちらの条件を記述しても無視され、2 番目の条件のみが重要になります。

for (i = 0; j >= 0, i <= 5; i++)

したがって、

for (i = 0; i <= 5; i++)

これは、コードの作成者の意図に応じて、意図したものである場合とそうでない場合があります。これが製品コードでないことを願っています。&&代わりに演算子を使用する必要がありました。

于 2013-05-31T13:59:14.157 に答える
10

もちろん、最初に言ったことは正しいです。C の論理演算子 &&and||は、条件 (真または偽として評価できる式) を「接続」するために通常使用するものです。コンマ演算子は論理演算子ではなく、他のユーザーが説明したように、その例での使用は意味がありません。たとえば、 for 自体でステートメントを「連結」するために使用できます。 j を i と一緒に初期化および更新できます。または他の 方法でコンマ演算子を使用します

#include <stdio.h>

int main(void)  // as std wants
{
  int i, j;

  // init both i and j; condition, we suppose && is the "original"
  // intention; update i and j
  for(i=0, j=2; j>=0 && i<=5; i++, j--)
  {
       printf("%d ", i+j);
  }
  return 0;        
}
于 2013-05-31T15:14:07.607 に答える
5

コンマ式は、最後(たとえば、一番右) の式の値を取ります。

したがって、最初のループでは、唯一の制御式はi<=5; j>=0無視されます。

2 番目j>=0のループでは、ループを制御し、i<=5無視されます。


理由としては・・・理由はありません。このコードは間違っています。コンマ式の最初の部分は、プログラマーを混乱させるだけです。真面目なプログラマーがこれを書いた場合、彼らは自分自身を恥じて、キーボードを無効にする必要があります。

于 2013-05-31T13:59:03.233 に答える
3

ウィキペディアは、コンマ演算子が何をするかを示しています:

「C および C++ プログラミング言語では、カンマ演算子 ( token で表される,) は、最初のオペランドを評価して結果を破棄し、2 番目のオペランドを評価してこの値 (および型) を返す二項演算子です。」

于 2013-05-31T13:59:57.813 に答える
3

このコードは使用しないでください。それを書いた人は誰でも、明らかに言語について根本的な誤解を持っており、信頼に値しません。表現:

j >= 0, i <= 5

"j >= 0" と評価し、破棄して何もしません。次に、「i <= 5」を評価し、ループを終了する条件としてそれのみを使用します。左のオペランドに副作用がある場合、カンマ演算子をループ条件で使用すると意味があります。次のようなことがよくあります。

for (i = 0, j = 0; i < 10; ++i, ++j) . . .

コンマを使用して、追加の初期化ステートメントとインクリメント ステートメントをこっそりと挿入します。しかし、示されているコードはそれを行っていないか、その他の意味のあることを行っていません。

于 2013-05-31T14:04:18.533 に答える
2

C にはコンマ演算子と呼ばれる演算子があります。各式を順番に実行し、最後のステートメントの値を返します。また、シーケンス ポイント&&でもあります。つまり、各式は、またはと同様に、一連の次の式が実行される前に、完全に順番に実行されることが保証され||ます。

于 2013-05-31T13:59:24.417 に答える
0

クロッカー氏の回答を完成させて、++ または -- 演算子に注意してください。または、他の演算子についてはわかりません。それらはループに影響を与える可能性があります。たとえば、コースで次のようなコードを見ました。

for(int i=0; i++*i<-1, i<3; printf(" %d", i));

結果は $ 1 2$ になります。したがって、最初のステートメントはループに影響を与えましたが、次のステートメントの結果は多くのゼロです。

for(int i=0; i<3; printf(" %d", i));
于 2013-11-20T20:10:57.840 に答える