5

I have the following code:

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

but I got the following lint warning:

Warning 681: Loop is not entered

what is the problem and how to fix it?

4

5 回答 5

13

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

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

于 2013-07-23T13:34:20.120 回答
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值)。

于 2013-07-23T13:36:13.000 回答
4

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

if (num == 0)else num==1中,所以在 while 循环num值之前是0(来自 else)或-1(来自 if)不大于0这意味着while-condition 在编译时总是已知的错误。这意味着 while 永远不会在编译时执行。

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

删除宏,如下所示:

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

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

于 2013-07-23T13:35:41.710 回答
0

您的编译器计算numalready 的值,因为它的可能值可能是65 / 33 or 34which 被降级为,0因为它是一个int类型,或者num = num - 1which is -1,并将值替换为while ((0 or -1) > 0). 这就是编译器警告你的原因。

于 2013-07-23T16:21:38.117 回答
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

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

于 2013-07-23T13:44:10.363 回答