यहाँ क्या चल रहा है?
if(int a = Func1())
{
// Works.
}
if((int a = Func1()))
{
// Fails to compile.
}
if((int a = Func1())
&& (int b = Func2()))
)
{
// Do stuff with a and b.
// This is what I'd really like to be able to do.
}
2003 के मानक में खंड 6.4.3 यह बताता है कि चयन विवरण की स्थिति में घोषित चर में गुंजाइश कैसे होती है जो स्थिति द्वारा नियंत्रित सबस्टेशन के अंत तक फैली हुई है। लेकिन मैं यह नहीं देखता कि घोषणा के चारों ओर कोष्ठक लगाने में सक्षम नहीं होने के बारे में यह कुछ भी कहता है, और न ही यह प्रति शर्त केवल एक घोषणा के बारे में कुछ भी कहता है।
यह सीमा उन मामलों में भी कष्टप्रद है, जहां स्थिति में केवल एक घोषणा की आवश्यकता होती है। इस पर विचार करो।
bool a = false, b = true;
if(bool x = a || b)
{
}
अगर मैं x के साथ 'if' -बॉडी स्कोप दर्ज करना चाहता हूं, तो घोषणा में कोष्ठक की जरूरत है (क्योंकि असाइनमेंट ऑपरेटर की तार्किक या की तुलना में कम पूर्वता है), लेकिन चूंकि कोष्ठक का उपयोग नहीं किया जा सकता है, इसलिए इसे x की घोषणा की आवश्यकता है शरीर, उस घोषणा को अधिक से अधिक दायरे में लीक करना वांछित है। जाहिर है कि यह उदाहरण तुच्छ है, लेकिन एक अधिक यथार्थवादी मामला एक होगा जहां ए और बी फ़ंक्शन मान लौट रहे हैं जिन्हें परीक्षण करने की आवश्यकता है
तो क्या मैं मानक के अनुसार गैर-अनुरूपता करना चाहता हूं, या क्या मेरा संकलक मेरी गेंदों (VS2008) को तोड़ रहा है?
while
समान हैं if
।
if (int a = foo(), int b = bar(), a && b)
:? यदि अल्पविराम ऑपरेटर ओवरलोडेड नहीं है, तो मानक कहता है कि अभिव्यक्तियों का मूल्यांकन बाएं से दाएं किया जाता है, और परिणाम मान अंतिम अभिव्यक्ति है। यह for
लूप्स इनिशियलाइज़ेशन के साथ काम करता है, यहाँ क्यों नहीं?
if
काम करता है, और यह गलत धारणा है।
if
।if
लूप नहीं है, यह एक सशर्त है।