Tuesday, 15 June 2010

c - about comparison between signed and unsigned integer expressions -


<पूर्व> #include & lt; stdio.h & gt; #include & lt; string.h & gt; Int main () {char a [10], बी [10]; Int i, j, n = 0, m = 0; Scanf ("% s% s", ए, बी); के लिए (i = 0; i & lt; strlen (a); i ++) n + = एक [i]; के लिए (i = 0; i & lt; = strlen (b); i ++) मी + = एक [i]; printf ( "% d", n * मी); वापसी 0; }

इनपुट 123 45 का मतलब आउटपुट 54 (जो (1 + 2 + 3) * (4 + 5) से आया था), लेकिन यह मदद नहीं करता

पंक्ति 8 और 9 में, यह हस्ताक्षरित और अहस्ताक्षरित पूर्णांक अभिव्यक्ति के बीच तुलना दर्शाता है, और मुझे गलत चांदनी मिलती है

इनपुट 123 45 का मतलब आउटपुट 54 (जो (1 + 2 + 3) * (4+ 5)), लेकिन यह मदद नहीं करता

इन दो छोरों के बजाय

  के लिए (i = 0; i & lt; strlen (a); i ++) n + = एक [i]; के लिए (i = 0; i & lt; = strlen (b); i ++) मी + = एक [i]; ^^ ^^^^  

लिखने के लिए (i = 0; एक [i]! = '\ 0'; i ++) n + = एक [i] - '0'; के लिए (i = 0; b [i]! = '\ 0'; i ++) एम + = बी [i] - '0';

ध्यान दें कि फ़ंक्शन scanf असुरक्षित है जब वर्ण स्ट्रिंग के साथ प्रयोग किया जाता है। इसके अलावा आपको जांचना चाहिए कि कोई अगला वर्ण मानक सी फ़ंक्शन isdigit का उपयोग करते हुए उदाहरण के लिए एक अंक है या नहीं।

संकलक संदेश के लिए, फिर strlen फ़ंक्शन करता है प्रकार size_t कुछ अहस्ताक्षरित अभिन्न प्रकार है। आप वेरिएबल i के साथ strlen द्वारा लौटाए गए मूल्य की तुलना कर रहे हैं जो कि आपने हस्ताक्षरित int प्रकार के रूप में घोषित किया है। इसलिए कंपाइलर चेतावनी देता है कि तुलनात्मक न होने वाला परिणाम हो सकता है कि आप क्या उम्मीद कर रहे हैं क्योंकि वेरिएबल i को एक प्रकार की रेंज में कनवर्ट किया जाएगा size_t


No comments:

Post a Comment