के साथ == ओप का उपयोग करते समय चेतावनी नहीं देता है GCC केवल कोड 1 और 3 के लिए चेतावनी क्यों देता है और नीचे दिए गए कोड में 2 नहीं?जीसीसी एक हस्ताक्षरित var और एक हस्ताक्षरित शाब्दिक
मैं -Wall और -g झंडे के साथ संकलन कर रहा हूं।
int main() {
unsigned int ui = 4;
int si = 6;
if (si == ui) { // Warning comparison b/w signed and unsigned
printf("xxxx");
}
if (si == 2U) { // No Warning --- WHY ???
printf("xxxx");
}
if (si > 2U) { // Warning comparison b/w signed and unsigned
printf("xxxx");
}
return 0;
}
यह वास्तव में ' प्रचारित 'को प्रचारित किया गया है, लेकिन इसमें कोई फर्क नहीं पड़ता है जब इसका मान 2^31 - 1. –
@ryanli से कम है: यदि इसे हमेशा हस्ताक्षरित करने के लिए प्रोत्साहित किया जाता है तो si == 2U को चेतावनी भी फेंकनी चाहिए। 2147483647 जादुई बिंदु क्यों है, जहां केवल -वॉल ध्वज के साथ, जीसीसी को चेतावनी फेंकना शुरू करना चाहिए। मुझे लगता है कि मैं आपके प्रारंभिक उत्तर को समझ नहीं पा रहा हूं। – nisah
क्योंकि '2 यू' एक शाब्दिक है, और यद्यपि 'si'' हस्ताक्षरित है, जीसीसी स्पष्ट रूप से संकलित समय पर जानता है कि' si' की तुलना सटीकता खोए बिना '2U' के मान से की जा सकती है: यदि' si' ऋणात्मक है , यह हस्ताक्षर किए जाने के बाद प्रचारित होने के बाद '2U' के बराबर नहीं है। लेकिन 2^31-1 से बड़े शाब्दिक मूल्यों के लिए, जीसीसी एक चेतावनी फेंकता है क्योंकि 'si' ऋणात्मक के बराबर हो सकता है यदि' si' ऋणात्मक है, जो नतीजे नहीं हो सकता है। और '-Wall' कुछ भी चेतावनी नहीं देता है क्योंकि मेरे उत्तर में लिंक दिखाता है। –