如何在C中删除以下lint警告?

时间:2013-07-23 13:30:34

标签: c loops 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
}

但是我收到了以下lint警告:

Warning 681: Loop is not entered

问题是什么以及如何解决?

5 个答案:

答案 0 :(得分:13)

编写代码时,不会输入循环。 NUM_DAYS % NUM_PERSON将评估为true,因此num将等于NUM_DAYS / NUM_PERSON。由于我们处理的是整数,65 / 33等于11 -10,因此while条件将失败。

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

答案 1 :(得分: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值)。

答案 2 :(得分:4)

因为在编译时if-else中的表达式的值都如下所示:

if (num == 0) in else num == 1中,所以在while num值为0(来自else)或{{1}之前(来自if)不大于-1,这意味着0 -condition在编译时始终是假的。这意味着从不在编译时执行已知。

为什么代码中有静态输入?你在编译时给出了价值,从用户那里询问是否正确。

删除宏,如下所示:

while

这将有效,请注意静态分配这些65,33值是有问题的!

答案 3 :(得分:0)

@patrickvacek是对的。我会扩展他的解释。

在整数运算中,65除以33几乎为2但不完全。商为1,余数为32. C ++允许您根据需要访问商或余数。对于商,65 / 33 == 1。其余的是65 % 33 == 32。您的代码不会要求剩余部分,而只是针对商。因此,if (NUM_DAYS % NUM_PERSON)字面意思是if (1),这意味着if (true)。因此,永远不会到达else语句的if分支。

你可以跟着其余的。此外,由于逻辑相对简单(并且由于其他原因与预处理器和编译时评估有关,我们在此不详述),编译器可以遵循其余的。因此警告。

答案 4 :(得分:0)

您的编译器已经计算num的值,因为它的可能值可能是65 / 33 or 34,因为它是0类型或int而被降级为num = num - 1 } -1,并替换while ((0 or -1) > 0)中的值。这就是编译器警告你的原因。