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


109

ओरेकल प्रमाणित एसोसिएट जावा एसई 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 में स्विच किया गया था?


4
आप z को बढ़ाए जाने की अपेक्षा क्यों करेंगे? इससे मुझे कोई मतलब नहीं है।
जिआंटी कैंटर

15
एक खराब लिखी गई पुस्तक की तरह लगता है, टर्नरी संचालकों ने जावा, एफिक के निमन्त्रण के बाद से कोई बदलाव नहीं किया है
निमशिम्प्सकी

23
अब तक पोस्ट किए गए अधिकांश जवाबों को पढ़कर, लोगों को सवाल का गलत मतलब लगता है। यह नहीं है "दोनों अभिव्यक्तियों का मूल्यांकन क्यों नहीं किया गया?", बल्कि "यह पुस्तक क्यों प्रतीत होती है कि यह स्पष्ट रूप से व्यवहार करता था?"
बम्बूलियनलॉजिक

23
दरअसल, मैंने देखा है कि "जैसा कि तारीख / संस्करण X" का अर्थ था "हमने जाँच की कि यह दिनांक X संस्करण में सत्य है / लेकिन हम पहले के संस्करणों के बारे में कुछ नहीं कह रहे हैं।" मैं अनुमान लगा रहा हूं कि यहां इसका अर्थ हो सकता है। (हालांकि आपको लगता है कि जावा के पुराने संस्करणों की जांच करना काफी आसान होगा।) वैसे भी, यह एक प्रोग्रामिंग की तुलना में अंग्रेजी मुद्दे का अधिक है।
डेविड जेड

14
@ डेविड: अंग्रेजी के मुद्दे प्रोग्रामिंग मुद्दे हैं जब वे आपको अपना काम करने से रोकते हैं। इस खराब शब्द वाली टिप्पणी ने ओपी को रोक दिया कि वह क्या कर रहा था और समय बर्बाद कर रहा था कि खोज नहीं की जा रही थी। प्रोग्रामिंग संचार है, संकलक / दुभाषिया के लिए और जो कोई भी बाद में आपके कोड को बनाए रखने के लिए साथ आता है। मैं ऐसे समय की गणना नहीं कर सकता कि मैं कुछ कोड पढ़ रहा हूं, और मुझे कुछ अजीब बात को रोकना पड़ा / जो समस्या के साथ कुछ कर सकता है / हो सकता है, केवल यह पता लगाने के लिए कि यह बुरी तरह से "वाक्यांश" था।
जमरनो

जवाबों:


92

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

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


116

से जावा 6 JLS :

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

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

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

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


2
तो इसका उत्तर है "जावा 7 और इससे पहले कि टर्नरी ऑपरेटर के विषय में कोई अंतर नहीं है", सही है?
मथियास बैडर

5
वैध लगता है। मैंने लेखकों को एक ज्ञापन लिखा - उनके उत्तर की प्रतीक्षा में
मथियास बैडर

आप शायद एक URL भी पा सकते हैं जो संस्करणों के बीच ऑपरेटर के कोड की तुलना करता है। यदि आप पागल / उत्सुक हैं।
स्टीव क्ले

7
इन ओरेकल प्रमाणपत्रों में बुरी तरह से लिखे गए (या सिर्फ फ्लैट आउट गलत) सवाल हर बार फिर से चकित कर देते हैं ..
Voo
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.