मैं आउटपुट की जांच करने के लिए आईएलएसपी का उपयोग करके इसका प्रयोग कर रहा हूं, और यही वह है जो मैंने पाया है।
स्पष्ट रूप से आपके दूसरे मामले में यह एक त्रुटि है - आप ulong
और int
की तुलना नहीं कर सकते हैं क्योंकि ऐसा कोई प्रकार नहीं है जिससे आप दोनों को मजबूर कर सकें। long
के लिए बहुत बड़ा हो सकता है, और int
नकारात्मक हो सकता है।
हालांकि, आपके पहले मामले में, कंपाइलर चालाक हो रहा है। यह महसूस करता है कि 1
> const 32
कभी भी सत्य नहीं है, और इसमें संकलित आउटपुट में if
कथन शामिल नहीं है। (इसे पहुंचने योग्य कोड के लिए चेतावनी देना चाहिए।) यह वही है यदि आप शाब्दिक के बजाय const int
को परिभाषित और उपयोग करते हैं, या यहां तक कि यदि आप शाब्दिक रूप से शाब्दिक रूप से डाले हैं (यानी (int)32
)।
लेकिन तब संकलक सफलतापूर्वक एक int
है, जो हम सिर्फ इतना कहा असंभव था के साथ एक ulong
की तुलना नहीं है?
स्पष्ट रूप से नहीं। तो पर जा रहा है?
निम्न पंक्तियों के साथ कुछ करने के बजाय प्रयास करें। (इनपुट ले रहा है और उत्पादन में लिख तो संकलक कुछ भी संकलन नहीं है दूर।)
const int thirtytwo = 32;
static void Main(string[] args)
{
ulong x = ulong.Parse(Console.ReadLine());
bool gt = x > thirtytwo;
Console.WriteLine(gt);
}
यह संकलन होगा, भले ही ulong
एक चर रहा है, और भले ही परिणाम संकलन समय पर ज्ञात नहीं है। ILSpy में उत्पादन पर एक नज़र डालें:
private static void Main(string[] args)
{
ulong x = ulong.Parse(Console.ReadLine());
bool gt = x > 32uL; /* Oh look, a ulong. */
Console.WriteLine(gt);
}
तो, संकलक अपने const int
एक ulong
के रूप में इलाज वास्तव में है। यदि आप thirtytwo = -1
बनाते हैं, तो कोड संकलित करने में विफल रहता है, भले ही हम जानते हैं कि gt
हमेशा सत्य हो। संकलक स्वयं ulong
की तुलना int
से नहीं कर सकता।
यह भी ध्यान रखें कि यदि आप x
एक ulong
के बजाय एक long
बनाने के लिए, संकलक 32L
बजाय 32
उत्पन्न करता है एक पूर्णांक के रूप में, भले ही यह नहीं है के लिए करता है। क्योंकि यह को है संकलक पहले मामले में एक ulong
रूप 32
इलाज नहीं करने के लिए
इस अंक (आप एक int
और रनटाइम पर एक long
तुलना कर सकते हैं।), केवल क्योंकि यह x
के प्रकार के मिलान कर सकते हैं । यह निरंतर को मजबूर करने से रनटाइम को बचा रहा है, और यह केवल एक बोनस है जब अधिकारों द्वारा जबरदस्ती संभव नहीं होनी चाहिए।
इस त्रुटि का कारण स्पष्ट है। दूसरे उदाहरण में आप एक पूर्णांक के साथ एक अवैध संचालन करने की कोशिश कर रहे हैं। पहले उदाहरण में '32' को 'उलोंग' के रूप में माना जा रहा है। आपको वास्तव में 'मास्क' को 'उलंग' बनाना चाहिए। –
@ रैमहाउंड या तो (''ulong'' की तुलना करें, या' 'const' चर 'की तुलना करें, इसलिए' const int तुलना = 32; '। लगातार अभिव्यक्तियों को स्वचालित रूप से 'int' से' ulong' में संकलित समय पर परिवर्तित कर दिया जाएगा यदि वे गैर-ऋणात्मक हैं, जो कुछ नाम _Iplplicit निरंतर अभिव्यक्ति रूपांतरण_ के नाम पर जाता है। –