C जैसी भाषाओं में "शॉर्ट-सर्कुलेटिंग" क्या है?


15

मैंने "शॉर्ट-सर्कुलेटिंग" शब्द C, C ++, C #, Java, और कई अन्य में इस्तेमाल होने के बारे में सुना है। इसका क्या अर्थ है और इसका उपयोग किस परिदृश्य में किया जाएगा?


6
अवधारणा के बारे में एक विकिपीडिया लेख है: en.wikipedia.org/wiki/Short-circuit_evaluation यह &&ऑपरेटर के मूल्यांकन में एक अनुकूलन है ।
13

1
@ मेरा मानना ​​है कि यह भी लागू होता है ||... कम से कम यह होना चाहिए।
रादु मुरझिया

1
@RaduMurzea वास्तव में। कंट्रास्ट ||और &&करने के लिए &और |सूक्ष्म अंतर को देखने के लिए। एक साधारण प्रोग्राम है का मूल्यांकन 1 || printf("yay");बनाम 0 || printf("yay");और 1 | printf("yay");बनाम 0 | printf("yay");differeces देखने के लिए
wirrbel

जवाबों:


36

C में लघु परिच्छेद तब होता है जब एक तार्किक ऑपरेटर अपने सभी तर्कों का मूल्यांकन नहीं करता है।

उदाहरण के लिए ले लो और &&, यह बहुत स्पष्ट है कि 0 && WhoCaresझूठे होने जा रहा है कोई बात नहीं क्या WhoCaresहै। इस वजह से, सी सिर्फ मूल्यांकन करता है WhoCares। उसी के लिए जाता है 1 || WhoCares, यह हमेशा सच होगा। इस वजह से हम जैसे कोड लिख सकते हैं

CanFireMissiles && FireMissiles()

इस तरह हम कुछ संभावित असंभव ऑपरेशन करने से बचते हैं। यदि हम मिसाइलों को फायर नहीं कर सकते हैं तो हम निश्चित रूप से कोशिश नहीं करना चाहते हैं। यह आमतौर पर पॉइंटर्स, विशेष रूप से फ़ाइल पॉइंटर्स के साथ उपयोग किया जाता है।

 bool isN(int* ptr, int n){
     return ptr && *ptr == n;
 }

अनावश्यक कंप्यूटिंग से बचने के लिए यह बहुत सारे अन्य उपयोगी तरीकों से खेलता है

 isFileReady() || getFileReady()

अगर हमें जरूरत नहीं है तो यह अतिरिक्त काम करने से बचता है।


1
कभी भी, अगर मैंने आपके प्रश्न का उत्तर दिया है, तो आप अपने प्रश्न के उत्तर के लिए चेकबॉक्स को बगल में रख सकते हैं
डैनियल ग्रैज़र

7
मुझे प्यार नहीं है CanFireMissiles && FireMissiles(), क्योंकि इससे मुझे संदेह है कि आप साइड इफेक्ट को ट्रिगर करने के लिए शॉर्ट-सर्किटिंग का दुरुपयोग कर रहे हैं। मुझे लगता है कि आप सशर्त में कार्य छिपा रहे हैं। इस तरह के कोड के रूप में बेहतर लिखा है if(CanFireMissiles){FireMissiles();}या if(CanFireMissles){didFireMissiles = TryFireMissiles(); if(didFireMissiles){...}}
ब्रायन

2
मेरा तर्क है कि साइड इफेक्ट्स को छिपाने के लिए एकमात्र उपयोग है। आमतौर पर "ब्लो अप ए सिटी" सॉर्ट नहीं है, लेकिन एक पॉइंटर को डीफ्रैंस करने या सिस्टम संसाधनों का उपयोग करने जैसी चीजें भी सी में इस तरह से अक्सर की जाती हैं। विकिपीडिया पृष्ठ देखें, उपयोग के तहत पूरा अनुभाग "छुपा दुष्प्रभाव" है
डैनियल ग्रैज़र

2
@jozefg आप इसका उपयोग महंगे ऑपरेशन करने से रोकने के लिए भी कर सकते हैं IsInCache(value) || IsInDatabase(value), जैसे कि IsInDatabase को समय लग सकता है (विशेषकर यदि मोबाइल डिवाइस और नेटवर्क लेटेंसी का उपयोग करना एक समस्या है)।
mgw854

4

"शॉर्ट सर्किटिंग" आम तौर पर " शॉर्ट सर्किट इवैल्यूएशन " को संदर्भित करता है जो एक सामान्य अवधारणा है, न कि केवल सी विशिष्ट।

बूलियन ऑपरेटर्स मूल्यांकन सही करने के लिए छोड़ दिया है, इसलिए किसी भी शर्त है कि अनावश्यक अन्य शर्तों को प्रस्तुत करना उपयोगी होगा। तो आप ऐसी स्थिति की जाँच कर सकते हैं जो अन्य स्थितियों को बाद में छोड़ देती है, इस प्रकार पूरी बात का मूल्यांकन करने के बजाय तार्किक संचालन के आंशिक मूल्यांकन की अनुमति देता है।

उदाहरण:

while((x && y) == 1) {
    //This bit will not execute if x is 0 or y is 0 but y won't even be 
    //evaluated due to short circuit evaluation if x is 0.
}

एक अधिक जटिल उदाहरण:

if((a || b || c || d || e || f || g || h || i || j || k) == 1) {
    /* If any of these are equal to 1 the whole expression is equal to 1,
     * thus doesn't it make sense to short circuit evaluate this?
     * Saves a bunch of time.
     */
}

8
शॉर्ट सर्कुलेटिंग समय बचाने के बारे में कम है लेकिन मूल्यांकन नहीं किए जाने के बारे में अधिक है। मूल्यांकन नहीं किए जाने वाले फ़ंक्शन का भी दुष्प्रभाव नहीं होगा जिसका मूल्यांकन किया जाएगा।
पीटर बी

तुम्हें पता है, == 0न केवल अस्वाभाविक है, यह वास्तव में कुछ लोगों को भ्रमित कर सकता है।
Deduplicator

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.