2013-07-23 4 views
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 
} 

लेकिन मैं निम्नलिखित फाहा चेतावनी मिल गया:

Warning 681: Loop is not entered 

समस्या क्या है और यह कैसे तय करने के लिए?

+7

समस्या यह है कि आप पहले 'num'' 65/33' पर सेट करते हैं, जो '1' है, फिर एक घटाएं, इसलिए लूप स्थिति की जांच होने पर' num' '0' है। लिंट का कहना है कि जो भी आप चाहते थे वह शायद नहीं हो सकता है, इसलिए चलो इसके बारे में चेतावनी दें। –

+3

कहानी का नैतिक: पूर्णांक विभाजन के छिद्र से सावधान रहें। –

+3

'uum =' अन्य खंड में टाइपो –

उत्तर

13

जैसा कि आपका कोड लिखा गया है, लूप दर्ज नहीं किया जाएगा। NUM_DAYS % NUM_PERSONtrue का मूल्यांकन करेगा, इसलिए numNUM_DAYS/NUM_PERSON के बराबर होगा। चूंकि हम इनट्स से निपट रहे हैं, 65/331 के बराबर है। 1 -10 है, इसलिए जबकि स्थिति विफल हो जाएगी।

यदि आपका कोड इरादे के रूप में लिखा गया है (जैसा कि, उन स्थिरांक वे मान हैं जिन्हें आप हमेशा उपयोग करने की उम्मीद कर रहे हैं), बस लूप को हटा दें। इसका कभी भी उपयोग नहीं किया जाएगा। यदि, हालांकि, NUM_DAYS या NUM_PERSON बाद में अन्य मान हो सकते हैं, तो शायद आपके पास चिंता करने की कोई बात नहीं है। यदि वे विशिष्ट मान महत्वपूर्ण नहीं हैं, तो उन्हें मानों पर सेट करने का प्रयास करें कि विभाजन 1 से अधिक कुछ का मूल्यांकन करेगा।

+0

जैसा दिखता है किसी ने टिप्पणी की थी कि मैंने वास्तव में इसे ठीक करने के सवाल का जवाब नहीं दिया था। वे सही थे, इसलिए मैंने अतिरिक्त स्पष्टीकरण जोड़ा। – patrickvacek

+0

"* अभी के लिए, उन्हें मानों पर सेट करने का प्रयास करें कि विभाजन 1 * से अधिक कुछ का मूल्यांकन करेगा" - क्या आप जानबूझकर लिंट को संतुष्ट करने के लिए प्रोग्राम तर्क को तोड़ने का सुझाव दे रहे हैं ?! – SomeWittyUsername

+0

@icepack केवल तभी जब उन स्थिरांक के मूल्य कोई फर्क नहीं पड़ता! मैंने prefaced कि क्या करना है अगर कोड वास्तव में इरादे के रूप में लिखा गया है, तो एक कथन के साथ, यानी उन स्थिरांक वही हैं जो ओपी अब और हमेशा के लिए चाहता है। – patrickvacek

4

क्योंकि दोनों अभिव्यक्ति के मूल्य में अगर-किसी और संकलन समय ज्ञात इस प्रकार है:

बाकी num == 1 में

if (num == 0) में, पाश num मूल्य है तो इससे पहले कि जबकि या तो 0 (और से), या -1 (से अगर) 0 से अधिक नहीं है जिसका अर्थ है while-संकलन हमेशा संकलन समय पर ज्ञात है। इसका मतलब यह है कि संकलन समय पर कभी भी ज्ञात नहीं होता है।

आपके कोड में स्थिर इनपुट क्यों? आपने संकलन समय पर मूल्य दिया है, इसे उपयोगकर्ता से पूछें सही होगा।

मैक्रो निकालें और नीचे की तरह:

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

यह काम करेंगे स्थिर इन 65 बताए ध्यान दें, 33 मूल्यों समस्या है!

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 मान के साथ)।

0

@patrickvacek सही है। मैं उसकी व्याख्या का विस्तार करूंगा।

पूर्णांक अंकगणितीय में, 65 द्वारा विभाजित 65 लगभग 2 है लेकिन काफी नहीं है। उद्धरण 32 के शेष के साथ 1 है। सी ++ आपको पसंद करते समय या तो मात्रा या शेष तक पहुंचने देता है। Quotient के लिए, 65/33 == 1। शेष के लिए, 65 % 33 == 32। आपका कोड शेष के लिए नहीं पूछता है, लेकिन केवल मात्रा के लिए। इस प्रकार, if (NUM_DAYS % NUM_PERSON) का शाब्दिक अर्थ है if (1), जिसका अर्थ है if (true)। इस प्रकार, आपके if कथन की else शाखा कभी नहीं पहुंची है।

आप बाकी का अनुसरण कर सकते हैं। इसके अलावा, क्योंकि तर्क तुलनात्मक रूप से सरल है (और प्रीप्रोसेसर और संकलन-समय मूल्यांकन के साथ अन्य कारणों के लिए, जो हम यहां विस्तार नहीं करेंगे), कंपाइलर बाकी का अनुसरण कर सकते हैं। इस प्रकार चेतावनी।

0

आपका संकलक पहले से ही के बाद से इसके संभावित मूल्य 65/33 or 34 जो 0 में पदावनत किया गया है हो सकता है क्योंकि यह एक int प्रकार या num = num - 1 जो -1 है, और while ((0 or -1) > 0) में मूल्य स्थानापन्न num का मूल्य गणना करता है। यही कारण है कि संकलक आपको इसके बारे में चेतावनी देता है।

संबंधित मुद्दे