2009-07-07 14 views
7

私は自分の好奇心のために主にポーズを取っているという簡単な質問があります。forループのパフォーマンスの違いはありますか?

これらの2行のコードの違いは何ですか?条件の選択は完全に任意である

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

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

(C++で)、私は間違いでちょうど興味、および& &。

私はどのような方法でもコーディングの初心者ではありませんが、私はコンマ演算子で悩まされたことはありません。

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

1つの最後の注記は、条件付き演算子よりも大きなパフォーマンスの魚が味わっていることを知っていますが、私は興味があります。私を楽しませる。

お返事ありがとうございます。

この質問が表示されたコードがわかったので、私が記述した方法でコンマ演算子を誤って使用していました。私はその違いが何であったのか、なぜそれが& &演算子ではないのか疑問に思ったが、間違って書かれたばかりだった。私はそれがうまくいったので何かが間違っていたとは思わなかった。私をまっすぐにしてくれてありがとう。

+0

なぜパフォーマンスが心配ですか?この質問への回答が得られるまでに、1つまたは他の表記法を使用して保存した9ナノ秒はすでに失われています。 "時期尚早の最適化はすべての悪の根源です..." – Juliet

+17

彼は心配しているとは言わなかった。ただ好奇心が強い。誰かが「知りたがっている」たびに人々が「時期尚早最適化」フラグを振り回さなくて済むことを本当に望みます。好奇心は*良いこと*です。 –

+5

誰かが質問の中で「パフォーマンス」や「速い」という言葉を書くたびに、「あなたが考えることを許可されていない市民は今仕事に戻ります」;-) –

答えて

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の場合、これは常に真であり、ループは決して終了しないことを意味します。

これを実行し、証明を参照してください。

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++) 
    ... 
} 
+0

なぜ誰もこれを投票したのか分かりません。私は説明を求めるときによく考えて詳細な答えが好きです。ありがとうございます – CodeFusionMobile

+3

私はそれが明確に違いを述べていないし、標準やドキュメントを見るのではなく、実験で意味を判断しようとするので、私はそれを投票しません。 –

+0

私は個人的に例と実験が好きです。 RichieHindleの答えは短く正確でしたが、あまり説明的ではなく、実際の違いは何ですか?この答えが問題の背後にある理由を詳述していないとしても、それは実際に質問に答えました。 – CodeFusionMobile

33

このようなカンマを使用すると、は最初の条件を破棄します

カンマ演算子は、「これらの命令をこの順序で実行し、最後の命令の値を取る」ことを意味します。

+0

はそれを完全に無視してチェックを実行しませんか? – Victor

+2

"i < N, N > 0"の値は "N> 0"の値と同じです。 – ephemient

+1

@Victor:iとNを比較し、結果を破棄し、Nと0を比較し、その結果を使用してループを続行するかどうかを決定します。最適化されたコードでは、おそらくiとNを比較することはありません。 – RichieHindle

関連する問題