java - जावा में टर्नेरी ऑपरेटर केवल जावा 7 के बाद से एक अभिव्यक्ति का मूल्यांकन करता है-क्या यह जावा 1.6 और निम्न में भिन्न था?




ternary-operator java-6 (2)

मैं इस पुस्तक के लेखकों में से एक हूं। जब मैंने उस विशेष वाक्य को नहीं लिखा था, तो मैं मानता हूं कि इरादे "यह जावा 7 पर परीक्षण किया गया था"। मैं एक नोट निकालूंगा कि अगर हम दूसरा संस्करण लिखते हैं।

स्पष्ट होने के लिए, टर्नेरी ऑपरेटर ने जावा 8, 7, 6, आदि में उसी तरह का व्यवहार किया है और अगर भविष्य में यह बदल गया तो मुझे काफी आश्चर्य होगा।

Oracle प्रमाणित एसोसिएट जावा एसई 8 प्रोग्रामर 1 परीक्षा के लिए तैयारी करते हुए, मैं आधिकारिक अध्ययन गाइड में टर्नरी अभिव्यक्ति के बारे में निम्नलिखित पैराग्राफ में आया:

टर्नरी अभिव्यक्ति का मूल्यांकन
जावा 7 के अनुसार, रन-टाइम पर टर्नरी ऑपरेटर के दाएं-बाएं भावों का मूल्यांकन किया जाएगा। शॉर्ट-सर्किट ऑपरेटरों के समान तरीके से, यदि टर्नरी ऑपरेटर के दो दाहिने हाथों में से एक में साइड इफेक्ट होता है, तो इसे रनटाइम पर लागू नहीं किया जा सकता है। आइए इस सिद्धांत को निम्न उदाहरण से स्पष्ट करें: […]

यह कहता है कि केवल दो अभिव्यक्तियों में से एक का मूल्यांकन किया जाता है, जो निम्न उदाहरण के साथ प्रदर्शित करता है:

int y = 1;
int z = 1;
int a = y < 10 ? y++ : z++;

यहां, केवल y वेतन वृद्धि, लेकिन z नहीं करता है, जैसा कि आप उम्मीद करेंगे।

मैं जिस चीज को ठोकर मार रहा हूं वह पैराग्राफ की शुरुआत है (पीले रंग में चिह्नित) जहां यह कहता है "जैसा कि जावा 7, ..."। मैंने जावा 1.6 के साथ एक ही कोड का परीक्षण किया और मुझे व्यवहार में कोई अंतर नहीं मिला। मुझे उम्मीद थी कि जावा 1.6 केवल पैराग्राफ में दी गई जानकारी से दोनों अभिव्यक्तियों का मूल्यांकन करने के लिए होगा। क्या किसी को अंदाजा है कि वे "जैसा कि जावा 7, ..." के साथ कहना चाहते थे?

संपादित करें: भ्रम से बचने के लिए: यह सवाल पर उबलता है, क्योंकि वे 'As Java 7' लिखते हैं, क्या कुछ ऐसा था जो टर्नरी ऑपरेटर से संबंधित था, जब जावा 6 से जावा 7 में स्विच किया गया था?


Java 6 JLS से :

रन टाइम पर, सशर्त अभिव्यक्ति के पहले ऑपरेंड अभिव्यक्ति का मूल्यांकन पहले किया जाता है; यदि आवश्यक हो, तो परिणाम पर अनबॉक्सिंग रूपांतरण किया जाता है; इसके बाद बूलियन मान का उपयोग दूसरी या तीसरी ऑपरेंड अभिव्यक्ति को चुनने के लिए किया जाता है:

  • यदि पहले ऑपरेंड का मान सत्य है, तो दूसरा ऑपरेंड अभिव्यक्ति चुना जाता है।
  • यदि पहले ऑपरेंड का मान गलत है, तो तीसरे ऑपरेंड की अभिव्यक्ति को चुना जाता है।

तब चुने गए ऑपरेंड एक्सप्रेशन का मूल्यांकन किया जाता है और परिणामी वैल्यू को ऊपर वर्णित नियमों द्वारा निर्धारित सशर्त एक्सप्रेशन के प्रकार में बदल दिया जाता है। इस रूपांतरण में बॉक्सिंग (.15.1.7) या अनबॉक्सिंग रूपांतरण शामिल हो सकते हैं। सशर्त अभिव्यक्ति के उस विशेष मूल्यांकन के लिए नहीं चुना गया ऑपरेंड अभिव्यक्ति का मूल्यांकन नहीं किया जाता है।

इसी तरह के शब्दांकन जेएलएस संस्करणों में 1.0 वापस जाते हुए भी दिखाई देते हैं। जावा 7 में व्यवहार नहीं बदला; अध्ययन गाइड सिर्फ खराब शब्द है।





short-circuiting