我有以下代码:
#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
问题是什么以及如何解决?
答案 0 :(得分:13)
编写代码时,不会输入循环。 NUM_DAYS % NUM_PERSON
将评估为true
,因此num
将等于NUM_DAYS / NUM_PERSON
。由于我们处理的是整数,65 / 33
等于1
。 1 -1
为0
,因此while条件将失败。
如果您的代码是按预期编写的(例如,那些常量是您希望始终使用的值),只需删除while循环即可。它永远不会被使用。但是,如果NUM_DAYS
或NUM_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)
中的值。这就是编译器警告你的原因。