7

主に好奇心のために提起している簡単な質問があります。

これら 2 行のコードの違いは何ですか? (C++)

for(int i = 0; i < N, N > 0; i++)

for(int i = 0; i < N && N > 0; i++)

条件の選択は完全に恣意的です。 と && の違いに興味があるだけです。

私は決してコーディングの初心者ではありませんが、コンマ演算子を気にしたことはありません。

パフォーマンス/動作の違いはありますか、それとも純粋に美的ですか?

最後に 1 つ注意してください。条件付き演算子よりも大きなパフォーマンスのフィッシュがあることは知っていますが、私はただ興味があります。私を甘やかす。

編集 回答ありがとうございます。

この質問の原因となったコードは、私が説明した方法でカンマ演算子を誤用していたことが判明しました。何が違うのか、なぜ && 演算子ではないのかと思ったのですが、書き方が間違っているだけでした。正常に動作していたので、問題はないと思います。私をまっすぐにしてくれてありがとう。

4

2 に答える 2

33

このようにコンマを使用すると、最初の条件が単純に破棄されます。

コンマ演算子は、「これらのステートメントをこの順序で実行し、最後のステートメントの値を取得する」ことを意味します。

于 2009-07-07T21:15:44.860 に答える
10

みたいに見えますが、

for(int i = 0; i < N, N > 0; i++)

for(int i = 0; i < N && N > 0; i++) 

は同等ではありません。

これが証拠です。

int main(int argc, char* argv[])
{
  int N = 10;
  int i = 5;

  int val = (N, i);
  cout << val << endl;
}

結果:

5

これは、ループがいつ終了するかを決定するときに を使用することを意味しますN > 0。の場合N = 10、これは常に true になり、ループが終了しないことを意味します。

これを実行して証明を見てください。

int main(int argc, char* argv[])
{
  int N = 10;
  int i = 5;

  for(int i = 0; i < N, N > 0; i++){
     cout << val << endl;
  }
}

bash-2.05$ ./a.out                  
0                                   
1                                   
2                                   
3                                   
4                                   
5                                   
6                                   
7                                   
8                                   
9                                   
10                                  
11                                  
...
142
143
144
145
146
147
148
^C

N がループ内で変化しない定数または変数である場合、N > 0最初に一度チェックすることでチェックを削除できます。

if (N > 0){
  for (int i = 0; i < N; i++)
   ...
}
于 2009-07-08T05:19:13.363 に答える