हां, यह अनिवार्य है कि (मूल्यांकन आदेश और शॉर्ट सर्किट दोनों)। आपके उदाहरण में, यदि सभी फ़ंक्शन सही हैं, तो कॉल का क्रम फ़ंक्शन से सख्ती से कार्य करता है फिर फ़ंक्शनबी और फिर फ़ंक्शनसी। इस तरह के लिए इस्तेमाल किया
if(ptr && ptr->value) {
...
}
अल्पविराम ऑपरेटर के लिए भी:
// calls a, then b and evaluates to the value returned by b
// which is used to initialize c
int c = (a(), b());
एक को छोड़ दिया और सही के संकार्य के बीच कहते हैं &&
, ||
, ,
और पहले और दूसरे / तीसरे संकार्य के बीच ?:
(सशर्त ऑपरेटर) एक "अनुक्रम बिंदु" है। किसी भी दुष्प्रभाव का उस बिंदु से पहले पूरी तरह से मूल्यांकन किया जाता है। तो, यह सुरक्षित है:
int a = 0;
int b = (a++, a); // b initialized with 1, and a is 1
ध्यान दें कि अल्पविराम ऑपरेटर को अलग-अलग चीजों के लिए उपयोग किए जाने वाले वाक्यविन्यास अल्पविराम के साथ भ्रमित नहीं होना है:
// order of calls to a and b is unspecified!
function(a(), b());
C ++ मानक कहता है 5.14/1
:
&& ऑपरेटर समूह बाएं-से-दाएं। ऑपरेंड दोनों को स्पष्ट रूप से टाइप बूल (खंड 4) में परिवर्तित किया जाता है। परिणाम सही है अगर दोनों ऑपरेंड सही और गलत हैं। इसके विपरीत, && बाएं-से-दाएं मूल्यांकन की गारंटी देता है: पहला ऑपरेंड झूठा होने पर दूसरे ऑपरेंड का मूल्यांकन नहीं किया जाता है।
और में 5.15/1
:
|| ऑपरेटर समूह बाएं-दाएं। ऑपरेंड दोनों को स्पष्ट रूप से बूल (खंड 4) में बदल दिया जाता है। यह सच है अगर इसके ऑपरेंड्स में से कोई भी सच है, और अन्यथा गलत है। विपरीत, || बाएं से दाएं मूल्यांकन की गारंटी देता है; इसके अलावा, दूसरे ऑपरेंड का मूल्यांकन नहीं किया जाता है यदि पहला ऑपरेंड सच का मूल्यांकन करता है।
यह उन दोनों के लिए कहता है:
परिणाम एक बूल है। अस्थायी अभिव्यक्ति के विनाश (12.2) को छोड़कर पहली अभिव्यक्ति के सभी दुष्प्रभाव दूसरी अभिव्यक्ति के मूल्यांकन से पहले होते हैं।
इसके अतिरिक्त, 1.9/18
कहते हैं
प्रत्येक भाव के मूल्यांकन में
a && b
a || b
a ? b : C
a , b
इन अभिव्यक्तियों में ऑपरेटरों के अंतर्निहित अर्थ का उपयोग करते हुए (5.14, 5.15, 5.16, 5.18), पहले अभिव्यक्ति के मूल्यांकन के बाद एक अनुक्रम बिंदु है।