/ / ब्लॉक और इन-लाइन के बीच अंतर अगर कथन - सी ++

ब्लॉक और लाइन में अंतर यदि कथन-c

सी ++ में एक कथन द्वारा उत्पन्न असेंबली कोड में कोई अंतर है जैसे कि:

if (*expr*) { }

बनाम

if (*expr*) return;

असल में मैं यह जानना चाहता हूं कि ब्रैकेट्स के साथ एक कथन को सीमित करने या नहीं, ऊपर दिए गए सरल रिटर्न स्टेटमेंट से उत्पन्न अंतर्निहित कोड में कोई फर्क पड़ता है।

उत्तर:

जवाब के लिए 2 № 1

यदि ब्लॉक के भीतर केवल एक ही बयान होगा तो दोनों समान हैं।

if (e)
{
stmt;
}

if (e) stmt;

समान हैं। हालांकि, जब आप एक से अधिक कथन निष्पादित किए जाते हैं, तो उन्हें लपेटना अनिवार्य है {}.


उत्तर № 2 के लिए 1

नहीं, दो उदाहरणों के बीच कोई अंतर नहीं है। आप यह देखने के लिए एक प्रोफाइलर का उपयोग कर सकते हैं कि असेंबली कोड किस प्रकार आउटपुट किया गया है और स्वयं के लिए देखें।


जवाब के लिए 0 № 3

इसके अलावा return बयान, कोई फर्क नहीं पड़ता है।

एक संकलक पहले मामले को पूरी तरह अनुकूलित कर सकता है अगर अभिव्यक्ति या तो संकलन-समय मूल्यांकन योग्य है (उदा। sizeof) या कोई दुष्प्रभाव नहीं है।

इसी तरह, दूसरा मामला एक सरल के लिए अनुकूलित किया जा सकता है return;


जवाब के लिए 0 № 4

यह कार्य ...

void f1(int e) {
if (e) {}
}

... के लिए संकलित ...

f1:
rep ret

... जबकि यह समारोह ...

void f2(int e) {
if (e) return;
}

... के लिए संकलित ...

f2:
rep ret

... जब ऑप्टिमाइज़ेशन का उपयोग कर सक्षम किया जाता है -O2 विकल्प.


जवाब के लिए 0 № 5

यदि केवल एक ही कथन है, तो "ब्लॉक" और "इनलाइन लेखन" का उपयोग करने में कोई अंतर नहीं है।

ब्रेस का उपयोग केवल उन कथनों के अनुक्रम को संलग्न करने के लिए किया जाता है जिन्हें एक प्रक्रिया के रूप में देखा जाना है।

के लिए सामान्य वाक्यविन्यास if:

if ( condition_in_the_diamond )
statement_to_execute_if_condition_is_true;

इसलिए एक प्रक्रिया के रूप में कोड की कई पंक्तियां बनाने के लिए, हम ब्रेसिज़ का उपयोग करते हैं।

इसलिए यदि आपके पास कथन में निष्पादित करने के लिए केवल एक ही कथन है, तो यह समान होगा।


ब्रेसिज़ का उपयोग बेहतर होता है क्योंकि इससे त्रुटि की संभावना कम हो जाती है। मान लीजिए कि आप डीबग करने के लिए जल्दबाजी में कोड की एक पंक्ति पर टिप्पणी कर रहे हैं:

if(condition)
//    statement1;
statement2;        //this will bring statement2 in if clause which was not intended

या कोड की एक पंक्ति जोड़ने के दौरान:

if(condition)
statement1;
statement3;    // won"t be included in if
statement2;

लेकिन अगर आप इनलाइन स्टेटमेंट का उपयोग कर रहे हैं:

if(condition) statement1;

तो यह आपको उपरोक्त त्रुटि से रोक सकता है लेकिन यह करेगा statement1 सीमित लंबाई (80 वर्ण चौड़ाई कोड मानते हुए)। हालांकि यह पढ़ने के लिए मीठा और सरल बना देगा।

इसलिए जब तक आप इनलाइन स्टेटमेंट का उपयोग नहीं कर रहे हैं, ब्रेसिज़ का उपयोग करके सुझाव दिया जाता है।

स्रोत


जवाब के लिए 0 № 6

खराब लिखित मैक्रोज़ के साथ बुरा चीजें हो सकती हैं।

// c-style antipattern. Better use scoped_ptr
#define CLEANUPANDRETURN delete p; return

if (*expr*) CLEANUPANDRETURN;

// preprocesses to: (with added linebreaks)
if (*expr*)
delete p;
return;

सी-लाइब्रेरी के कई कार्य वास्तव में मैक्रोज़ हो सकते हैं। देख क्यों स्पष्ट रूप से व्यर्थ समय का उपयोग करें और यदि मैक्रोज़ में बयान? किसी भी तरह से सुरक्षित मैक्रोज़ की एक चाल के लिए।