2013-06-10 2 views
5
int c = someIntegerValue; 

// Some code... 

int i; 
for (i = 0; i < 5, i < c; i++) { 
... 
} 

私のコンパイラはerror: expression has no effectと言います。だから、ここでは2つの比較のうちのどちらを使うのですか?私の推測では、i < cは無視されますが、私はまだこのコードを実行する立場にないので、私は他の人からいくつかの確認が欲しかったです...forループの* test *部分でこのコンマは何をしますか?

+0

ないCの専門家が、 '私は<5 && I

+0

コンパイラの権利。ここでは 'i <5 'が評価されますが、値は使用されずに破棄され、副作用がないので、このプログラマーは明らかに何かを誤解しています。 –

+0

なぜ票を落として票を集めるのですか?カンマ演算子は、世界で最も直感的なものではありません。それは私を驚かせ、私は20年近くCをコーディングしてきました。 –

答えて

14

声明

i < 5, i < c 

は、左から右にすべての式を評価しますが、唯一の右端の1の値を生成する、comma operatorを使用します。つまり、式i < 5が評価されて破棄され、式i < cが評価され、ループで実際に使用されます。実際に式の両方を考慮

i < 5 && i < c 

私は著者はこのような何かを書くことを意味していることを前提としています。

前記これは、コンパイラエラーなく警告コンパイラである理由、私はわかりません。これは法的コードですが、ほぼ確実にバグです。おそらく、警告のエラーを報告するようにコンパイラを設定していますか?

希望すると便利です。

+4

私はそれを "これを行うもっと良い方法"と呼んでいないでしょう。 '&& 'のバージョンは、カンマ演算子のバージョンとは意味的に異なります。 '&&'バージョンは作者が意味するものである可能性は非常に高いですが、確信が持てません。 –

+2

「i <5 && i

+0

@ KeithThompson-はい、そうです。一定! – templatetypedef

3

これは無視されます。

完全な式は次のとおりです。comma-operatorで結合された2つの別々の表現である

i < 5, i < c

コンマ演算子は、最初の式(i < 5)、次に2番目の式(i < c)を評価することによって動作し、完全な式は2番目の部分の値をとります。

式の最初の部分は、副作用がある場合にのみ重要です。

それは一般的であり、正しくこの方法を使用:

for(i = 0, j = 10; i < 10; ++i, --j) 
/* i goes from 0-10, while j goes from 10-0 at the same time */ 

しかし、あなたのコードに示すように、それは意味のある目的を持っていない、とだけ他の人々を混乱させる。

1

ここで,カンマ演算子が役割を果たします。意味は、左から右へと展開し、最後の式を返します。したがってi<5が評価され、i<cが評価されますが、最後の式としてi<cが返されます。

i < 5, i < cは完全に無意味です。 i < cとの違いはありません。

著者のロジックによっては間違いがあります。

7

これはのカンマオペレータです。これは、左と右のオペランドを(常にその順序で)評価し、右のオペランドの結果を返します。左のオペランドの副作用が評価されている場合は、それを使用するのが理にかなっています。 i < 5には副作用がないため、コンパイラは警告を表示します。

それはi < 5で、i < cは無視されます。コードは同等です:

for (i = 0; i < c; i++) { 
    ... 
} 

それはそれはするを意図したものを推測することは困難です。おそらく著者は実際には次のような意味を持っていました:

for (i = 0; i < 5 && i < c; i++) { 
    ... 
} 
3

カンマ演算子の結果は、右側のオペランドの値になります。ここ

左オペランド(i < 5)は

i < 5, i < c 

それはカンマ演算子を使用した結果だ実際

i < c 
2

に相当しない副作用 を有していません。左の式が評価され、結果が破棄されます。その後、正しい表現が評価されます。カンマ演算子の結果は、正しい式の結果です。

左の式(i < 5)はノーオペレーションなので、あなたが見ているという警告が表示されます。問題は今、「著者が何を意図したのですか?より多くのコンテキストがなければ、私たちは本当に言うことができませんが、それはおそらく、これらの一つだ:

i < 5 
    i < c 
    i < 5 && i < c 
関連する問題