2013-07-23 41 views
5

我有以下代码:如何在C中删除以下lint警告?

#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 
} 

,但我得到了以下皮棉警告:

Warning 681: Loop is not entered 

是什么问题,如何解决?

+7

问题是,你首先将'num'设置为'65',这是'1',然后减1,所以'num'在检查循环条件时为'0'。林特说这可能不是你想要的,所以让我们提醒一下。 –

+3

故事的道德:谨防整数除法的截断。 –

+3

'uum ='在else子句中看起来像一个错字 –

回答

13

随着代码的写入,循环将不会被输入。 NUM_DAYS % NUM_PERSON将评价为true,所以num将等于NUM_DAYS/NUM_PERSON。由于我们正在处理整数,因此65/33等于11 -10,所以while条件将失败。

如果您的代码是按照预期编写的(例如,那些常量是您期望始终使用的值),则只需删除while循环即可。它永远不会被使用。但是,如果NUM_DAYSNUM_PERSON稍后可能包含其他值,则可能无需担心。如果这些特定的值不重要,请尝试将它们设置为值,以便分区评估值大于1

+0

有人评论说我没有真正回答如何解决它的问题。他们是对的,所以我补充说明。 – patrickvacek

+0

“*现在,尝试将它们设置为这样的值,以便分区评估的结果大于1 *” - 您是否打算故意破坏程序逻辑以满足皮棉? – SomeWittyUsername

+0

@icepack只有这些常量的值不重要!如果代码的确是按照预期编写的,那么我会先说明该做什么,即那些常量正是OP现在和将来所需要的。 – patrickvacek

4

因为这两个表达式的值在的if-else在编译时已知如下:

if (num == 0)在别的num == 1,所以前while循环num值是0(从别的),或-1(从如果)不大于0,这意味着while - 在编译时已知条件总是错误的。这意味着编译时从不执行。

为什么静态代码输入?你在编译时已经给出了值,从用户那里询问它是正确的。

删除宏和象下面这样:

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

你的编译器计算的num值已经因为其可能的值可以65/33 or 34被降级为0,因为它是一个int型或num = num - 1这是-1,并在while ((0 or -1) > 0)替代的价值。这就是编译器警告你的原因。