2013-07-23 6 views
5

Ich habe den folgenden Code:wie die folgende Fusselwarnung in C entfernen?

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

aber ich bekam die folgende Flusen Warnung:

Warning 681: Loop is not entered 

, was das Problem ist und wie man es beheben?

+7

Das Problem ist, dass Sie zuerst 'num' auf' 65/33' setzen, was '1' ist, dann subtrahieren Sie eins, also ist' num' '0', wenn die Schleifenbedingung überprüft wird. Lint sagt, dass das vielleicht nicht das ist, was Sie vorhaben, also warnen Sie davor. –

+3

Moral der Geschichte: Vorsicht vor der Kürzung der Ganzzahligen Teilung. –

+3

'Uum =' in der Else-Klausel sieht aus wie ein Tippfehler –

Antwort

13

Wenn Ihr Code geschrieben wird, wird die Schleife nicht eingegeben. NUM_DAYS % NUM_PERSON wird zu true ausgewertet, also num entspricht NUM_DAYS/NUM_PERSON. Da es sich um Ints handelt, ist 65/33 gleich 1. 1 -1 ist 0, so dass die while-Bedingung fehlschlägt.

Wenn Ihr Code wie beabsichtigt geschrieben wird (wie in diesen Konstanten sind die Werte, die Sie immer verwenden möchten), entfernen Sie einfach die While-Schleife. Es wird nie benutzt werden. Wenn jedoch NUM_DAYS oder NUM_PERSON später andere Werte enthalten können, müssen Sie sich wahrscheinlich keine Sorgen machen. Wenn diese spezifischen Werte nicht wichtig sind, versuchen Sie, sie auf Werte zu setzen, sodass die Division einen Wert größer als 1 ergibt.

+0

Jemand hatte kommentiert, dass ich nicht wirklich die Frage beantwortet habe, wie man es beheben kann. Sie hatten Recht, also fügte ich zusätzliche Erklärungen hinzu. – patrickvacek

+0

"* Versuchen Sie jetzt, sie auf Werte zu setzen, bei denen die Division zu etwas größer als 1 * führt" - schlagen Sie vor, die Programmlogik absichtlich zu unterbrechen, um Lint zu befriedigen ?! – SomeWittyUsername

+0

@icepack Nur wenn die Werte dieser Konstanten nicht wichtig sind! Ich habe das mit einer Aussage darüber, was zu tun ist, wenn der Code tatsächlich wie beabsichtigt geschrieben ist, vorangestellt, d. H. Diese Konstanten sind genau das, was das OP für jetzt und für immer will. – patrickvacek

4

Da Wert sowohl Ausdrucks in if-else bei der Kompilierung bekannt wie folgt:

In if (num == 0) in anderen num == 1, also vor while-Schleife num Wert entweder 0 (von anderen), oder -1 (aus if) das ist nicht größer als 0 das bedeutet while -bedingung ist immer falsch zur Kompilierzeit bekannt. Dies bedeutet, während nie zur Kompilierungszeit bekannt ausgeführt wird.

Warum statische Eingänge in Ihrem Code? Sie haben Wert zur Kompilierzeit angegeben, fragen Sie den Benutzer wird korrekt sein.

Makros entfernen und wie unten:

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

Dies funktioniert, beachten Sie statisch diese 65 zuweisen, ist 33 Werte Problem!

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 
} 

Deshalb erhalten Sie diese Warnung. Der Compiler hat festgestellt, dass Ihre Schleife nutzlos ist (mit Ihrem aktuellen Wert #define).

0

@patrickvacek hat Recht. Ich werde seine Erklärung erweitern.

In Ganzzahlarithmetik, 65 geteilt durch 33 ist fast 2 aber nicht ganz. Der Quotient ist 1 mit einem Rest von 32. Mit C++ können Sie entweder auf den Quotienten oder den Rest zugreifen, wie Sie es bevorzugen. Für den Quotienten 65/33 == 1. Für den Rest 65 % 33 == 32. Ihr Code fragt nicht nach dem Rest, sondern nur nach dem Quotienten. Somit bedeutet if (NUM_DAYS % NUM_PERSON) wörtlich if (1), was wiederum if (true) bedeutet. Daher wird der else-Zweig Ihrer if-Anweisung nie erreicht.

Sie können den Rest folgen. Da die Logik vergleichsweise einfach ist (und aus anderen Gründen, die mit der Präprozessor- und Kompilierzeitauswertung zu tun haben, auf die hier nicht näher eingegangen wird), kann der Compiler dem Rest folgen. Also die Warnung.

0

Ihr Compiler berechnet den Wert von num bereits seit seiner möglichen Wert 65/33 or 34 sein könnte, die zu 0 degradiert wird, da es ein int Typ oder num = num - 1 ist die -1 ist, und ersetzen Sie den Wert in while ((0 or -1) > 0). Deshalb warnt Compiler Sie davor.