2013-07-23 13 views
5

私は、次のコードを持っている:Cで次のリント警告を削除する方法はありますか?

#define NUM_DAYS 65 
#define NUM_PERSON 33 

int num = 0; 

if(NUM_DAYS % NUM_PERSON) 
{ 
    num = NUM_DAYS/NUM_PERSON; 
} 
else 
{ 
    uum = NUM_DAY/NUM_PERSON + 1; 
} 

num = num - 1; 

while(num > 0) 
{ 
    //do something here 
} 

けど、次のlint警告だ:

Warning 681: Loop is not entered 

何の問題があるとどのようにそれを修正するために?

+7

問題は、最初に 'num'を' 65/33'に設定して、 '1'を引いて1を減算するので、ループ条件がチェックされるとき' num'は '0'です。リントはあなたが意図したものではないかもしれないと言います。 –

+3

ストーリーの道徳:整数除算の切り捨てに注意してください。 –

+3

else節の 'uum ='は、タイプミスのように見えます –

答えて

13

コードが書き込まれると、ループは入力されません。 NUM_DAYS % NUM_PERSONtrueと評価されるので、numNUM_DAYS/NUM_PERSONに等しくなります。 intを扱っているので、65/331に等しい。 1 -10であるため、while条件は失敗します。

コードが意図したとおりに書かれている場合(これらの定数は、常に使用すると思われる値です)、whileループを削除してください。それは決して使用されません。ただし、NUM_DAYSまたはNUM_PERSONに後で他の値が含まれる場合は、おそらく何も心配はありません。これらの特定の値が重要でない場合は、除算値が1よりも大きい値になるように値を設定してみてください。

+0

誰かが、私が本当にそれを修正する方法の問題に答えなかったとコメントしました。彼らは正しいので、私は追加の説明を追加しました。 – patrickvacek

+0

"*ここでは、除算値が1 *より大きい値になるように値を設定してみてください。" - lintを満たすために意図的にプログラムロジックを中断することを提案していますか? – SomeWittyUsername

+0

@icepackこれらの定数の値が重要でない場合のみ!私は、コードが実際に意図されたとおりに書かれている場合、つまりOPが現在そして永遠に望んでいるものである場合、何をすべきかについての声明を述べました。 – patrickvacek

4

は、両方式の値は、他の場合は、コンパイル時に知られている中で、以下のようなので:

num == 1if (num == 0)

は、ループnum値があるので、前にしながら、どちらか0、(他の)または-1(からif)が0以下であることを意味します。つまり、while - 条件はコンパイル時には常にfalseです。これは、コンパイル時に決して実行されないことを意味します。

コード内の静的な入力はなぜですか?あなたはコンパイル時に価値を与えて、ユーザーから正しいことを尋ねます。

マクロを削除し、以下のような:

int num_days, number_persons; 
scanf("%d", &num_days); 
scanf("%d", &number_persons); 

これは動作しますが、静的にこれらの65、33値を割り当てるノートが問題です!

6
#define NUM_DAYS 65 
#define NUM_PERSON 33 

int num = 0; 

if(NUM_DAYS % NUM_PERSON) // we go here, since (NUM_DAYS % NUM_PERSON) > 0 
{ 
    num = NUM_DAYS/NUM_PERSON; // so num = 1 now 
} 
else 
{ 
    uum = NUM_DAY/NUM_PERSON + 1; 
} 

num = num - 1; // num = 0 now 

while(num > 0) // num = 0 ! So we don't go in this loop 
{ 
    //do something here 
} 

この警告が表示されます。コンパイラはループが役に立たないと判断しました(現在の#defineの値)。

0

@patrickvacekが正しいです。私は彼の説明を拡張する。

整数演算では、65を33で割った値はほぼ2ですが、それほど大きくはありません。商は1で残りは32です。C++では商または余剰のいずれかにアクセスできます。商の場合は65/33 == 1です。残りは65 % 33 == 32です。あなたのコードは商を求めるだけで、残りを求めません。したがって、if (NUM_DAYS % NUM_PERSON)は、文字通りif (1)を意味し、これは次にif (true)を意味する。したがって、ifステートメントのelseブランチには決して到達しません。

あなたは残りの部分に従うことができます。さらに、ロジックは比較的単純なので(プリプロセッサやコンパイル時の評価と関連しなければならないその他の理由で)、コンパイラが残ります。したがって、警告。

0

その可能な値は、それが-1あるintタイプまたはnum = num - 1あるので、0に降格され65/33 or 34こと、およびwhile ((0 or -1) > 0)に値を代入可能性があるのであなたのコンパイラは、すでにnumの値を計算します。そのため、コンパイラが警告します。

関連する問題