कई भाषाओं में असाइनमेंट शर्तों में कानूनी हैं। मैंने इसके पीछे का कारण कभी नहीं समझा। आप क्यों लिखेंगे:
if (var1 = var2) {
...
}
के बजाय:
var1 = var2;
if (var1) {
...
}
कई भाषाओं में असाइनमेंट शर्तों में कानूनी हैं। मैंने इसके पीछे का कारण कभी नहीं समझा। आप क्यों लिखेंगे:
if (var1 = var2) {
...
}
के बजाय:
var1 = var2;
if (var1) {
...
}
जवाबों:
यदि कथन की तुलना में यह लूप के लिए अधिक उपयोगी है।
while( var = GetNext() )
{
...do something with var
}
जो अन्यथा लिखना होता
var = GetNext();
while( var )
{
...do something
var = GetNext();
}
मुझे यह उन क्रियाओं की जंजीरों में सबसे अधिक उपयोगी लगता है जिनमें अक्सर त्रुटि का पता लगाना आदि शामिल हैं।
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
}
}
}
प्रचलित त्रुटि जाँच के साथ, विकल्प पृष्ठ के आरएचएस को बंद कर सकता है जबकि असाइनमेंट-इन-सशर्त संस्करण ऐसा नहीं करता है।
त्रुटि जाँच भी 'क्रियाओं' हो सकता है - first_action()
, second_action()
, third_action()
- ज़ाहिर है, बल्कि सिर्फ चेकों से। यही है, उन्हें उस प्रक्रिया में चरणों की जांच की जा सकती है जो फ़ंक्शन का प्रबंधन कर रहा है। (अधिकांश बार मैं जिस कोड के साथ काम करता हूं, वह फ़ंक्शन प्री-कंडीशन चेक की लाइनों के साथ होता है, या फ़ंक्शन के लिए आवश्यक मेमोरी आवंटन या इसी तरह की लाइनों के साथ होता है)।
यदि आप किसी फ़ंक्शन को कॉल कर रहे हैं तो यह अधिक उपयोगी है:
if (n = foo())
{
/* foo returned a non-zero value, do something with the return value */
} else {
/* foo returned zero, do something else */
}
ज़रूर, आप बस n = foo () डाल सकते हैं; एक अलग बयान पर तो अगर (एन), लेकिन मुझे लगता है कि उपरोक्त एक काफी पठनीय मुहावरा है।
यह उपयोगी हो सकता है यदि आप एक फ़ंक्शन को कॉल कर रहे हैं जो त्रुटि या (आप कर रहे हैं) को इंगित करने के लिए डेटा को फ़्लैग पर काम करने के लिए या ध्वज पर लौटाते हैं।
कुछ इस तरह:
while ((c = getchar()) != EOF) {
// process the character
}
// end of file reached...
व्यक्तिगत रूप से यह एक मुहावरा है जिसका मैं बहुत शौकीन नहीं हूँ, लेकिन कभी-कभी इसका विकल्प बदसूरत है।
यदि आप अनजाने में सत्य मान के रूप में असाइनमेंट का उपयोग करने का प्रयास करते हैं, तो जीसीसी आपको पता लगाने में मदद कर सकता है (-सभी के साथ)।
if ((n = foo())) {
...
}
यानी यह बताने के लिए कि आप वास्तव में क्या चाहते हैं, अतिरिक्त कोष्ठक का उपयोग करें।
स्टेटमेंट के while
बजाय लूप लिखते समय मुहावरा अधिक उपयोगी होता है if
। एक if
बयान के लिए, आप इसे वर्णन के अनुसार तोड़ सकते हैं। लेकिन इस निर्माण के बिना, आपको या तो खुद को दोहराना होगा:
c = getchar();
while (c != EOF) {
// ...
c = getchar();
}
या एक लूप-एंड-डेढ़ संरचना का उपयोग करें:
while (true) {
c = getchar();
if (c == EOF) break;
// ...
}
मैं आमतौर पर लूप-एंड-डेढ़ फॉर्म को प्राथमिकता देता हूं।
while
पाश के लिए, का उपयोग करना पसंद करते हैं:do { c = getchar(); ... } while (c != EOF);
for
लूप्स का उपयोग इसके बजाय किया जा सकता है: for (char c = getchar(); c != EOF; c= getchar()) { /* do something with c */ }
- यह सबसे संक्षिप्त है, और for
हमेशा मुझे 'लूप' कहते हैं, शैलीगत रूप से। छोटे नकारात्मक पक्ष यह है कि आपको c
दो बार लौटने वाले फ़ंक्शन को निर्दिष्ट करना होगा ।
संक्षिप्त उत्तर यह है कि अभिव्यक्ति-उन्मुख प्रोग्रामिंग भाषाएं अधिक संक्षिप्त कोड की अनुमति देती हैं। वे आपको प्रश्नों से अलग आदेश देने के लिए मजबूर नहीं करते हैं ।
उदाहरण के लिए, PHP में, SQL डेटाबेस परिणामों के माध्यम से लूपिंग के लिए उपयोगी है:
while ($row = mysql_fetch_assoc($result)) {
// Display row
}
यह देखने में बहुत बेहतर है:
$row = mysql_fetch_assoc($result);
while ($row) {
// Display row
$row = mysql_fetch_assoc($result);
}
अन्य लाभ जीडीबी के उपयोग के दौरान आता है। निम्न कोड में त्रुटि कोड ज्ञात नहीं है यदि हम एकल चरण में थे।
while (checkstatus() != -1) {
// process
}
बल्कि
while (true) {
int error = checkstatus();
if (error != -1)
// process
else
//fail
}
अब सिंगल स्टेप के दौरान हम जान सकते हैं कि चेकस्टेटस () से रिटर्न एरर कोड क्या था।
मुझे वैकल्पिक लौटाने वाले कार्यों के साथ यह बहुत उपयोगी लगता है ( boost::optional
या std::optional
C ++ 17 में):
std::optional<int> maybe_int(); // function maybe returns an int
if (auto i = maybe_int()) {
use_int(*i);
}
यह मेरे चर के दायरे को कम करता है, कोड को अधिक कॉम्पैक्ट बनाता है और पठनीयता में बाधा नहीं डालता है (मुझे लगता है)।
संकेत के साथ भी:
int* ptr_int();
if (int* i = ptr_int()) {
use_int(*i);
}
कारण यह है की:
प्रदर्शन में सुधार (कभी-कभी)
कम कोड (हमेशा)
एक उदाहरण लें: एक विधि है someMethod()
और ऐसी if
स्थिति में आप जांचना चाहते हैं कि विधि का रिटर्न मान है या नहीं null
। यदि नहीं, तो आप फिर से रिटर्न वैल्यू का उपयोग करने जा रहे हैं।
If(null != someMethod()){
String s = someMethod();
......
//Use s
}
यह प्रदर्शन को बाधित करेगा क्योंकि आप एक ही विधि को दो बार बुला रहे हैं। इसके बजाय उपयोग करें:
String s;
If(null != (s = someMethod())) {
......
//Use s
}