Java Language
भाव
खोज…
परिचय
टिप्पणियों
ऑपरेटरों पर एक संदर्भ के लिए जिसका उपयोग अभिव्यक्ति में किया जा सकता है, ऑपरेटर देखें।
संचालक वरीयता
जब एक अभिव्यक्ति में कई ऑपरेटर होते हैं, तो इसे संभवतः विभिन्न तरीकों से पढ़ा जा सकता है। उदाहरण के लिए, गणितीय अभिव्यक्ति 1 + 2 x 3
को दो तरीकों से पढ़ा जा सकता है:
-
1
और2
जोड़ें और परिणाम को3
गुणा करें। यह जवाब9
देता है। अगर हम कोष्ठक जोड़ते हैं, तो यह( 1 + 2 ) x 3
जैसा दिखेगा। -
2
और3
को गुणा करने के परिणाम में1
जोड़ें। यह उत्तर7
देता है। यदि हम कोष्ठक जोड़ते हैं, तो यह1 + ( 2 x 3 )
जैसा दिखेगा।
गणित में, सम्मेलन का दूसरा तरीका अभिव्यक्ति को पढ़ना है। सामान्य नियम यह है कि गुणा और भाग जोड़ और घटाव से पहले किया जाता है। जब अधिक उन्नत गणितीय संकेतन का उपयोग किया जाता है, तो या तो अर्थ "स्व-स्पष्ट" होता है (एक प्रशिक्षित गणितज्ञ के लिए!), या कोष्ठक को अव्यवस्थित करने के लिए जोड़ा जाता है। या तो मामले में, अर्थ बताने के लिए अंकन की प्रभावशीलता गणितज्ञों की बुद्धि और साझा ज्ञान पर निर्भर करती है।
जावा का एक ही स्पष्ट नियम है कि अभिव्यक्ति का उपयोग कैसे किया जाए, इसका उपयोग करने वाले ऑपरेटरों की पूर्वता के आधार पर किया जाता है।
सामान्य तौर पर, प्रत्येक ऑपरेटर को पूर्ववर्ती मान दिया जाता है; नीचे दी गई तालिका देखें।
उदाहरण के लिए:
1 + 2 * 3
+
की पूर्वता *
की पूर्ववर्तीता से कम है, इसलिए अभिव्यक्ति का परिणाम 7 है, 9 नहीं।
विवरण | ऑपरेटर / निर्माण (प्राथमिक) | प्रधानता | संबद्धता |
---|---|---|---|
क्वालीफायर कोष्टक उत्पात सृजन क्षेत्र का उपयोग पहुंच प्राप्त करें विधि आह्वान विधि संदर्भ | नाम . नाम ( एक्सप ) new प्राथमिक . नाम प्राथमिक [ expr ] प्राथमिक ( expr, ... ) प्राथमिक :: नाम | 15 | बाएं से दाएं |
पोस्ट वेतन वृद्धि | expr ++ , expr -- | 14 | - |
पूर्व वेतन वृद्धि एकल कास्ट 1 | ++ expr, -- expr, + expr, - expr, ~ expr ! expr, ( टाइप ) एक्सपायर | 13 | - दाएं से बाएं दाएं से बाएं |
गुणक | * *% | 12 | बाएं से दाएं |
additive | + - | 1 1 | बाएं से दाएं |
खिसक जाना | << >>> | 10 | बाएं से दाएं |
संबंधपरक | <> <=> = instanceof | 9 | बाएं से दाएं |
समानता | ==! = | 8 | बाएं से दाएं |
बिटवाइज़ और | और | 7 | बाएं से दाएं |
बिटवाइज एक्सक्लूसिव OR | ^ | 6 | बाएं से दाएं |
बिटवाइस समावेशी या | | | 5 | बाएं से दाएं |
तार्किक और | && | 4 | बाएं से दाएं |
तार्किक या | || | 3 | बाएं से दाएं |
सशर्त १ | ? : | 2 | दाएं से बाएं |
असाइनमेंट लैम्ब्डा 1 | = * = / =% = + = - = = << = >> = >>> = & = ^ = = | -> | 1 | दाएं से बाएं |
1 लैम्ब्डा अभिव्यक्ति पूर्वता जटिल है, क्योंकि यह एक डाली के बाद भी हो सकती है, या सशर्त टर्नरी ऑपरेटर के तीसरे भाग के रूप में हो सकती है।
लगातार अभिव्यक्तियाँ
एक स्थिर अभिव्यक्ति एक ऐसी अभिव्यक्ति है जो एक आदिम प्रकार या एक स्ट्रिंग का उत्पादन करती है, और जिसका मूल्य एक शाब्दिक समय पर संकलित मूल्यांकन किया जा सकता है। एक अपवाद को फेंकने के बिना अभिव्यक्ति का मूल्यांकन करना चाहिए, और यह केवल निम्नलिखित से बना होना चाहिए:
आदिम और स्ट्रिंग शाब्दिक।
टाइप्स को आदिम प्रकार या
String
।निम्नलिखित यूनिरी ऑपरेटर्स:
+
,-
,~
और!
।निम्नलिखित द्विआधारी ऑपरेटरों:
*
,/
,%
,+
,-
,<<
,>>
,>>>
,<
,<=
,>
,>=
,==
,!=
,&
,^
,|
,&&
और||
।टर्नरी सशर्त ऑपरेटर
?
:
।कोष्ठबद्ध स्थिर भाव।
सरल नाम जो निरंतर चर को संदर्भित करते हैं। (एक स्थिर चर एक ऐसा चर है जिसे
final
रूप में घोषित किया जाता है जहां शुरुआती अभिव्यक्ति अपने आप में एक स्थिर अभिव्यक्ति है।)फॉर्म के योग्य नाम
<TypeName> . <Identifier>
जो निरंतर चर का संदर्भ देता है।
ध्यान दें कि उपरोक्त सूची में शामिल नहीं ++
और --
, असाइनमेंट ऑपरेटरों, class
और instanceof
, विधि कॉल और संदर्भ सामान्य चर या क्षेत्रों के लिए।
प्रकार के लगातार भाव String
एक "प्रशिक्षु" में परिणाम String
निरंतर भाव में, और चल बिन्दु आपरेशनों एफपी-सख्त अर्थ विज्ञान के साथ मूल्यांकन किया जाता है।
लगातार अभिव्यक्तियों के लिए उपयोग
लगातार अभिव्यक्तियों का उपयोग किया जा सकता है (बस के बारे में) कहीं भी एक सामान्य अभिव्यक्ति का उपयोग किया जा सकता है। हालांकि, निम्नलिखित संदर्भों में उनका एक विशेष महत्व है।
स्विच स्टेटमेंट में केस लेबल के लिए लगातार अभिव्यक्ति की आवश्यकता होती है। उदाहरण के लिए:
switch (someValue) {
case 1 + 1: // OK
case Math.min(2, 3): // Error - not a constant expression
doSomething();
}
जब एक असाइनमेंट के दाहिने हाथ की ओर अभिव्यक्ति एक स्थिर अभिव्यक्ति है, तो असाइनमेंट एक आदिम संकीर्ण रूपांतरण कर सकता है। यह अनुमति दी गई है कि निरंतर अभिव्यक्ति का मूल्य बाएं हाथ की तरफ प्रकार की सीमा के भीतर है। (देखें JLS 5.1.3 और 5.2 ) उदाहरण के लिए:
byte b1 = 1 + 1; // OK - primitive narrowing conversion.
byte b2 = 127 + 1; // Error - out of range
byte b3 = b1 + 1; // Error - not a constant expession
byte b4 = (byte) (b1 + 1); // OK
एक निरंतर अभिव्यक्ति एक में शर्त के रूप में प्रयोग किया जाता है do
, while
या for
, तो यह पठनीयता विश्लेषण प्रभावित करता है। उदाहरण के लिए:
while (false) {
doSomething(); // Error - statenent not reachable
}
boolean flag = false;
while (flag) {
doSomething(); // OK
}
(नोट इस पर लागू नहीं होता है कि if
बयान। जावा कम्पाइलर की अनुमति देता है then
या else
एक के ब्लॉक if
बयान तक नहीं पहुंचा जा सकता है। इस में सी और सी ++ सशर्त संकलन के जावा अनुरूप है।)
अंत में, static final
अभिव्यक्ति के साथ एक वर्ग या इंटरफ़ेस में static final
फ़ील्ड्स को प्रारंभिक रूप से प्रारंभ किया जाता है। इस प्रकार, यह गारंटी दी जाती है कि इन स्थिरांक को प्रारंभिक अवस्था में देखा जाएगा, तब भी जब कक्षा आरंभीकरण निर्भरता ग्राफ में एक चक्र हो।
अधिक जानकारी के लिए, JLS 15.28 देखें । लगातार अभिव्यक्तियाँ ।
अभिव्यक्ति मूल्यांकन क्रम
जावा नियमों का मूल्यांकन निम्नलिखित नियमों के अनुसार किया जाता है:
- संचालन का मूल्यांकन बाएं से दाएं किया जाता है।
- एक ऑपरेटर के कार्यों का मूल्यांकन ऑपरेटर से पहले किया जाता है।
- ऑपरेटर पूर्वता के अनुसार ऑपरेटरों का मूल्यांकन किया जाता है
- तर्क सूचियों का मूल्यांकन बाएँ से दाएँ किया जाता है।
सरल उदाहरण
निम्नलिखित उदाहरण में:
int i = method1() + method2();
मूल्यांकन का क्रम है:
-
i
के पते पर बाएं ऑपरेटर=
ऑपरेटर का मूल्यांकन किया जाता है। -
+
ऑपरेटर (method1()
) के बायेंmethod1()
का मूल्यांकन किया जाता है। -
+
ऑपरेटर (method2()
) के सही संचालन का मूल्यांकन किया जाता है। -
+
ऑपरेशन का मूल्यांकन किया जाता है। -
=
i
के अतिरिक्त के परिणाम को निर्दिष्ट करते हुए=
ऑपरेशन का मूल्यांकन किया जाता है।
ध्यान दें कि यदि कॉल के प्रभाव नमूदार हैं, तो आप का पालन करने के कि करने के लिए कॉल कर सकेंगे method1
करने के लिए कॉल से पहले होता है method2
।
एक ऑपरेटर के साथ उदाहरण, जिसका साइड-इफेक्ट है
निम्नलिखित उदाहरण में:
int i = 1;
intArray[i] = ++i + 1;
मूल्यांकन का क्रम है:
-
=
ऑपरेटर के बाएं ऑपरेंड का मूल्यांकन किया जाता है। यहintArray[1]
का पता देता हैintArray[1]
। - पूर्व वेतन वृद्धि का मूल्यांकन किया जाता है। यह
1
सेi
जोड़ता है, और2
मूल्यांकन करता है। - दाहिने हाथ के ऑपरेंड
+
का मूल्यांकन किया जाता है। -
+
ऑपरेशन का मूल्यांकन:2 + 1
->3
। -
=
ऑपरेशन का मूल्यांकन किया जाता है,3
कोintArray[1]
को निर्दिष्ट करतेintArray[1]
।
ध्यान दें कि चूंकि =
के बाएं हाथ के ऑपरेंड का पहले मूल्यांकन किया गया है, यह ++i
डेप्रिसिएशन के साइड-इफेक्ट से प्रभावित नहीं है।
संदर्भ:
अभिव्यक्ति मूल बातें
जावा में अभिव्यक्तियाँ गणना करने के लिए प्राथमिक निर्माण हैं। यहाँ कुछ उदाहरण हैं:
1 // A simple literal is an expression
1 + 2 // A simple expression that adds two numbers
(i + j) / k // An expression with multiple operations
(flag) ? c : d // An expression using the "conditional" operator
(String) s // A type-cast is an expression
obj.test() // A method call is an expression
new Object() // Creation of an object is an expression
new int[] // Creation of an object is an expression
सामान्य तौर पर, एक अभिव्यक्ति में निम्नलिखित रूप होते हैं:
- अभिव्यक्ति नाम जिसमें शामिल हैं:
- साधारण पहचानकर्ता; उदाहरण के लिए
someIdentifier
- योग्य पहचानकर्ता; जैसे
MyClass.someField
- साधारण पहचानकर्ता; उदाहरण के लिए
- प्राइमरी जिसमें शामिल हैं:
- शाब्दिक; जैसे
1
,1.0
,'X'
,"hello"
,false
औरnull
- कक्षा शाब्दिक अभिव्यक्ति; जैसे
MyClass.class
-
this
और<TypeName> . this
- कोष्ठक अभिव्यक्तियाँ; उदा
( a + b )
- कक्षा उदाहरण सृजन भाव; उदाहरण के लिए
new MyClass(1, 2, 3)
- ऐरे उदाहरण सृजन के भाव; उदाहरण के लिए
new int[3]
- फ़ील्ड एक्सेस अभिव्यक्तियाँ; उदा।
obj.someField
याthis.someField
- पहुंच के भाव; जैसे
vector[21]
- विधि चालान; उदा।
obj.doIt(1, 2, 3)
- विधि संदर्भ (जावा 8 और बाद में); जैसे
MyClass::doIt
- शाब्दिक; जैसे
- गैरमौजूद संचालक भाव; जैसे
!a
या!a
i++
- बाइनरी ऑपरेटर भाव; जैसे
a + b
याobj == null
- टर्नरी ऑपरेटर के भाव; उदा।
(obj == null) ? 1 : obj.getCount()
- लैम्ब्डा एक्सप्रेशन (जावा 8 और बाद में); उदाहरण के लिए
obj -> obj.getCount()
अभिव्यक्ति के विभिन्न रूपों का विवरण अन्य विषयों में पाया जा सकता है।
- ऑपरेटर्स विषय में एकात्मक, बाइनरी और टर्नरी ऑपरेटर अभिव्यक्तियों को शामिल किया गया है।
- लैम्ब्डा एक्सप्रेशन टॉपिक में लैम्बडा एक्सप्रेशन और मेथड रेफरेंस एक्सप्रेशन शामिल हैं।
- क्लासेस और ऑब्जेक्ट्स विषय श्रेणी उदाहरण निर्माण अभिव्यक्तियों को शामिल करता है।
- Arrays विषय सरणी एक्सेस एक्सप्रेशन और एरे इंस्टेंस क्रिएशन एक्सप्रेशन को कवर करता है।
- लिटरल्स विषय में विभिन्न प्रकार के शाब्दिक भाव शामिल हैं।
एक अभिव्यक्ति का प्रकार
ज्यादातर मामलों में, एक अभिव्यक्ति का एक स्थिर प्रकार होता है जिसे परीक्षा और इसके उप-संदर्भों के संकलन समय पर निर्धारित किया जा सकता है। इन्हें स्टैंड-अलोन एक्सप्रेशन के रूप में जाना जाता है।
हालाँकि, (जावा 8 और बाद में) निम्न प्रकार की अभिव्यक्तियाँ पाली अभिव्यक्ति हो सकती हैं:
- कोष्ठबद्ध भाव
- कक्षा उदाहरण सृजन भाव
- विधि आह्वान अभिव्यक्ति
- विधि संदर्भ अभिव्यक्ति
- सशर्त अभिव्यक्ति
- लम्बोदर भाव
जब एक अभिव्यक्ति एक पाली अभिव्यक्ति होती है, तो इसका प्रकार अभिव्यक्ति के लक्ष्य प्रकार से प्रभावित हो सकता है; यानी इसका क्या उपयोग हो रहा है।
एक अभिव्यक्ति का मूल्य
एक अभिव्यक्ति का मूल्य असाइनमेंट उसके प्रकार के साथ संगत है। इसका अपवाद तब है जब ढेर प्रदूषण हुआ है; उदाहरण के लिए क्योंकि "असुरक्षित रूपांतरण" चेतावनियों को (अनुचित तरीके से) दबा दिया गया है या अनदेखा किया गया है।
अभिव्यक्ति कथन
कई अन्य भाषाओं के विपरीत, जावा आमतौर पर अभिव्यक्तियों को बयान के रूप में उपयोग करने की अनुमति नहीं देता है। उदाहरण के लिए:
public void compute(int i, int j) {
i + j; // ERROR
}
चूंकि अभिव्यक्ति की तरह मूल्यांकन करने का परिणाम उपयोग नहीं किया जा सकता है, और चूंकि यह किसी अन्य तरीके से कार्यक्रम के निष्पादन को प्रभावित नहीं कर सकता है, इसलिए जावा डिजाइनरों ने स्थिति ली कि इस तरह का उपयोग या तो एक गलती है, या गुमराह है।
हालाँकि, यह सभी भावों पर लागू नहीं होता है। अभिव्यक्तियों का एक सबसेट (वास्तव में) बयानों के रूप में कानूनी है। सेट में शामिल हैं:
- असाइनमेंट अभिव्यक्ति, जिसमें ऑपरेशन-और- असाइनमेंट शामिल हैं।
- वेतन वृद्धि और गिरावट के पूर्व और बाद के भाव।
- विधि कॉल (
void
या गैर-void
)। - कक्षा उदाहरण सृजन भाव।