如何在C语言中消除以下lint警告?

5

我有以下代码:

#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,因此在检查循环条件时,num0。 Lint认为这可能不是您想要的结果,因此让我们发出警告。 - Daniel Fischer
3
故事寓意:当进行整数除法时要小心截断。 - Martin Törnwall
3
在else子句中的uum =看起来像是一个拼写错误。 - Brian Cain
5个回答

13

根据你代码的编写,循环将不会被执行。因为NUM_DAYS % NUM_PERSON会评估为true,所以num将等于NUM_DAYS / NUM_PERSON。由于我们正在处理整数,65/33等于11 - 10, 因此 while 条件将失败。

如果您的代码按照预期编写(如那些常量是您希望始终使用的值),请删除 while 循环。它永远不会被使用。但是,如果NUM_DAYSNUM_PERSON以后可能包含其他值,则可能没有什么可担心的。如果不重要,尝试将它们设置为这样的值,使得除法运算的结果大于1


有人评论说我并没有真正回答如何修复它的问题。他们是对的,所以我添加了额外的解释。 - pattivacek
“暂时,尝试将它们设置为某些值,使得除法计算结果大于1” - 你是在建议故意破坏程序逻辑以满足代码检查吗? - SomeWittyUsername
@icepack 只有在那些常量的值不重要的情况下才可以这样做!我已经先说明了,如果代码确实按预期编写,即对于现在和将来,那些常量正是 OP 想要的。 - pattivacek
2
如果这些常量不重要,它们应该被删除,而不是更改以产生关闭lint的结果。 - SomeWittyUsername
1
@icepack 我想这段代码可能只是初步的,而且未来可能会有意愿让这些值在运行时改变。如果真是这样的话,那么现在设置它们为什么值并不重要。 - pattivacek
我稍微修改了我的解释,以明确只有在值无关紧要时才应该进行调整。 - pattivacek

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值)。

4
由于在 if-else 中表达式的值都在编译时确定,如下所示:
if (num == 0) 中,在 else 中 num == 1,所以在 while 循环之前,num 的值是 0(来自 else)或者 -1(来自 if),都不大于 0,这意味着 while 条件在编译时总是为 false。也就是说,while 循环在编译时永远不会执行。
为什么你的代码中有静态输入?询问用户输入将是正确的选择。
移除宏等内容如下:
int num_days, number_persons;
scanf("%d", &num_days);
scanf("%d", &number_persons);

这个会起作用,但是静态地分配这些65、33的值是有问题的!

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分支永远不会被执行。

您可以跟随其余部分。此外,由于逻辑相对简单(以及与预处理器和编译时评估有关的其他原因,我们在此不详细介绍),编译器可以跟随其余部分。因此出现了警告。


-1

你的编译器已经计算出了num的值,因为它可能的值是65/33或34,这被降级为0,因为它是一个int类型,或者num = num - 1,这是-1,并将该值代入while ((0 or -1) > 0)。这就是编译器警告你的原因。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接