2008-09-30 20 views
55

कई भाषाओं में असाइनमेंट शर्तों में कानूनी हैं। मैंने इसके पीछे कारण कभी नहीं समझा। तुम क्यों लिखते थे:आप किसी शर्त में असाइनमेंट का उपयोग क्यों करेंगे?

if (var1 = var2) { 
    ... 
} 

के बजाय:

var1 = var2; 
if (var1) { 
    ... 
} 

उत्तर

80

यह बयानों की तुलना में लूप के लिए अधिक उपयोगी है।

while(var = GetNext()) 
{ 
    ...do something with var 
} 

कौन सा होता है अन्यथा

var = GetNext(); 
while(var) 
{ 
...do something 
var = GetNext(); 
} 
+8

मैं सहमत हूं - लेकिन लिखूंगा: जबकि (var = GetNext())! = 0) {...} दो बार सोचने के बिना, आंशिक रूप से क्योंकि जीसीसी शिकायत करता है अगर मैं अपने डिफ़ॉल्ट संकलन विकल्पों के साथ नहीं करता हूं । –

+1

सच है। मान लीजिए कि आप एक भाषा का उपयोग कर रहे हैं जो फॉर-लूप घोषणाओं का समर्थन करता है, और आप पहले से ही लूप के बाहर var का उपयोग नहीं कर रहे हैं। – Gerald

+0

कुछ भाषाओं में, जैसे एएनएसआई सी, स्कॉइंग नियम इस दृष्टिकोण की अनुमति नहीं देते हैं, @KerrekSB – wirrbel

22

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

कुछ की तरह:

while ((c = getchar()) != EOF) { 
    // process the character 
} 

// end of file reached... 

निजी तौर पर यह एक मुहावरा मैं की बेहद शौकीन नहीं हूँ, लेकिन कभी कभी विकल्प भद्दा है।

28

यदि आप एक समारोह बुला रहे हैं और अधिक उपयोगी है:

if (n = foo()) 
{ 
    /* foo returned a non-zero value, do something with the return value */ 
} else { 
    /* foo returned zero, do something else */ 
} 

ज़रूर, तुम सिर्फ एन = foo डाल सकते हैं(); एक अलग बयान पर अगर (एन), लेकिन मुझे लगता है कि उपरोक्त एक काफी पठनीय मुहावरे है।

+0

मुझे लगता है कि आप कोष्ठक में यह जोड़ देना चाहिए या जीसीसी शिकायत के साथ: चेतावनी: काम के आसपास कोष्ठक सच मूल्य के रूप में इस्तेमाल करने का सुझाव [-Wparentheses] इस तरह : अगर ((एन = foo())) { // वापसी मूल्य } के साथ कुछ करें { // foo शून्य/NULL लौटा, कुछ और करें } –

8

जब आप if कथन के बजाय while लूप लिख रहे हैं तो मुहावरे अधिक उपयोगी है। if कथन के लिए, आप इसका वर्णन करते समय इसे तोड़ सकते हैं। लेकिन इस संरचना के बिना, आप या तो अपने आप को दोहराने के लिए होगा:

c = getchar(); 
while (c != EOF) { 
    // ... 
    c = getchar(); 
} 

या एक पाश और साढ़े संरचना का उपयोग करें:

while (true) { 
    c = getchar(); 
    if (c == EOF) break; 
    // ... 
} 

मैं आमतौर पर पाश और एक करने के लिए पसंद करेंगे आधा रूप

8

जीसीसी आप (-Wall के साथ) का पता लगाने के लिए यदि आप अनजाने में एक सच मान के रूप में एक काम इस्तेमाल करने की कोशिश में मदद कर सकते, मामले में यह सिफारिश की गई है आप

if ((n = foo())) { 
    ... 
} 

लिखना यानी यह इंगित करने के लिए कि यह वास्तव में आप चाहते हैं, अतिरिक्त कोष्ठक का उपयोग करें।

3

PHP में लिखा होना चाहिए, उदाहरण के लिए, यह SQL डेटाबेस परिणामों के माध्यम से पाशन के लिए उपयोगी होता है:

while ($row = mysql_fetch_assoc($result)) { 
    // Display row 
} 

यह तुलना में काफी बेहतर लग रहा है:

$row = mysql_fetch_assoc($result); 
while ($row) { 
    // Display row 
    $row = mysql_fetch_assoc($result); 
} 
+3

पर पहुंचते हैं, यह उस लूप से परे नहीं रहने वाली $ पंक्ति का साफ दुष्प्रभाव भी है और इसलिए जल्द ही कचरा संग्रहण के लिए योग्य है (भाषाओं में जो वैसे भी जीसी)। –

23

मुझे इसे क्रियाओं की श्रृंखला में सबसे उपयोगी लगता है जिसमें अक्सर त्रुटि का पता लगाने आदि शामिल होते हैं।

if ((rc = first_check(arg1, arg2)) != 0) 
{ 
    report error based on rc 
} 
else if ((rc = second_check(arg2, arg3)) != 0) 
{ 
    report error based on new rc 
} 
else if ((rc = third_check(arg3, arg4)) != 0) 
{ 
    report error based on new rc 
} 
else 
{ 
    do what you really wanted to do 
} 

विकल्प (हालत में काम का उपयोग नहीं) है:

rc = first_check(arg1, arg2); 
if (rc != 0) 
{ 
    report error based on rc 
} 
else 
{ 
    rc = second_check(arg2, arg3); 
    if (rc != 0) 
    { 
     report error based on new rc 
    } 
    else 
    { 
     rc = third_check(arg3, arg4); 
     if (rc != 0) 
     { 
      report error based on new rc 
     } 
     else 
     { 
      do what you really wanted to do 
     } 
    } 
} 
लंबी त्रुटि जाँच के साथ

, वैकल्पिक जबकि काम में सशर्त संस्करण पेज के आरएचएस बंद चला सकते हैं ऐसा नहीं करता है।

+0

हाँ, मैंने वास्तव में अत्यधिक घोंसले से बचने के लिए ऐसा किया और फिर यह देखने के लिए ऑनलाइन खोज की कि यह एक आम प्रथा है या नहीं। अंत में मैंने इसके खिलाफ फैसला किया क्योंकि मेरे पास वास्तव में केवल एक और मामला था, लेकिन यह इस शर्त में असाइनमेंट रखने के वैध कारण की तरह लगता है। – Ibrahim

+0

सहकर्मियों से नफरत है! मेरे लिए, कम से कम ज्यादातर मामलों में, एक विशाल पेड़ या कई रिटर्न से कहीं अधिक रखरखाव योग्य है। मैं एक समारोह से एकल वापसी पसंद करता हूं ... – Nathan

3

संक्षिप्त उत्तर यह है कि Expression-oriented प्रोग्रामिंग भाषाएं अधिक संक्षिप्त कोड की अनुमति देती हैं। आपको separate commands from queries पर मजबूर नहीं करता है।

+0

यह(), जबकि(), और अन्य समान बयान में असाइनमेंट के बिना कोडिंग को लागू करने के लिए एक निरंतर लड़ाई है। सी/सी ++ ऐसे दुष्प्रभावों के लिए कुख्यात हैं जो अक्सर बग बन जाते हैं, खासकर जब हम ++ और ऑपरेटरों को जोड़ते हैं। –

2

दूसरा लाभ जीडीबी के उपयोग के दौरान आता है। निम्न कोड में त्रुटि कोड ज्ञात नहीं है यदि हम एकल चरण थे।

while (checkstatus() != -1) { 
    // process 
} 

बल्कि

while (true) { 
    int error = checkstatus(); 
    if (error != -1) 
     // process 
    else 
     //fail 
} 

अब एकल चरण के दौरान हम पता कर सकते हैं checkstatus से वापसी त्रुटि कोड था()।

-2

कारण है:

  1. प्रदर्शन में सुधार (कभी कभी)

  2. कम संहिता (हमेशा)

एक उदाहरण लें: वहाँ एक विधि someMethod() है और एक if में शर्त आप जांचना चाहते हैं कि विधि का वापसी मूल्य null है या नहीं। यदि नहीं, तो आप फिर से वापसी मूल्य का उपयोग करने जा रहे हैं।

If(null != someMethod()){ 
    String s = someMethod(); 
    ...... 
    //Use s 
} 

यह प्रदर्शन को बाधित कर देगा क्योंकि आप एक ही विधि को दो बार बुला रहे हैं। इसके बजाय का उपयोग करें:

String s; 
If(null != (s = someMethod())) { 
    ...... 
    //Use s 
}