यह जावा कोड क्यों संकलित करता है?


96

विधि या वर्ग के दायरे में, संकलन के नीचे की रेखा (चेतावनी के साथ):

int x = x = 1;

कक्षा के दायरे में, जहाँ चर अपने डिफ़ॉल्ट मान प्राप्त करते हैं , निम्नलिखित 'अपरिभाषित संदर्भ' त्रुटि देता है:

int x = x + 1;

क्या यह पहली x = x = 1ही 'अपरिभाषित संदर्भ' त्रुटि के साथ समाप्त नहीं होनी चाहिए? या शायद दूसरी पंक्ति int x = x + 1को संकलित करना चाहिए? या कुछ ऐसा है जो मुझे याद आ रहा है?


1
यदि आप staticक्लास-स्कोप वैरिएबल में कीवर्ड जोड़ते हैं static int x = x + 1;, तो क्या आपको वही त्रुटि मिलेगी? क्योंकि C # में स्टैटिक या नॉन-स्टैटिक होने पर फर्क पड़ता है।
जेपी स्टिग नीलसन 16

static int x = x + 1जावा में विफल रहता है।
मार्सिन

1
c # दोनों में int a = this.a + 1;और int b = 1; int a = b + 1;क्लास स्कोप में (जो दोनों जावा में ठीक हैं) फेल हो जाते हैं, शायद .417.4.5.2 के कारण - "उदाहरण के लिए एक वैरिएबल इनिशियलाइज़र को बनाए जा रहे इंस्टेंस का संदर्भ नहीं दिया जा सकता है।" मुझे नहीं पता कि यह स्पष्ट रूप से कहीं अनुमति दी गई है, लेकिन स्थैतिक का ऐसा कोई प्रतिबंध नहीं है। जावा में नियम अलग हैं और static int x = x + 1एक ही कारण है कि के लिए विफल रहता है int x = x + 1करता है
msam

कि एक बाइटकोड के साथ anwser किसी भी संदेह को साफ करता है।
rgripper

जवाबों:


101

tl; डॉ

के लिए खेतों , int b = b + 1अवैध वजह से है bकरने के लिए एक अवैध आगे संदर्भ है b। आप वास्तव में इसे लिखकर ठीक कर सकते हैं int b = this.b + 1, जो शिकायतों के बिना संकलन करता है।

के लिए स्थानीय चर , int d = d + 1अवैध है क्योंकि dउपयोग करने से पहले आरंभ नहीं किया है। यह फ़ील्ड के लिए ऐसा नहीं है, जो हमेशा डिफ़ॉल्ट-आरंभिक होता है।

आप संकलन का प्रयास करके अंतर देख सकते हैं

int x = (x = 1) + x;

क्षेत्र घोषणा के रूप में और स्थानीय परिवर्तनशील घोषणा के रूप में। पूर्व विफल हो जाएगा, लेकिन उत्तरार्द्ध सफल होगा, क्योंकि शब्दार्थ में अंतर है।

परिचय

सबसे पहले, फ़ील्ड और स्थानीय वैरिएबल इनिशियलाइज़र के नियम बहुत अलग हैं। तो यह जवाब दो भागों में नियमों से निपटेगा।

हम इस परीक्षण कार्यक्रम का उपयोग करेंगे:

public class test {
    int a = a = 1;
    int b = b + 1;
    public static void Main(String[] args) {
        int c = c = 1;
        int d = d + 1;
    }
}

की घोषणा bअमान्य है और एक illegal forward referenceत्रुटि के साथ विफल हो जाती है ।
की घोषणा dअमान्य है और एक variable d might not have been initializedत्रुटि के साथ विफल हो जाती है ।

यह तथ्य कि ये त्रुटियां अलग हैं, यह संकेत देना चाहिए कि त्रुटियों के कारण भी भिन्न हैं।

खेत

जावा में फील्ड इनिशियलाइज़र JLS .38.3.2 द्वारा शासित होते हैं , फ़ील्ड्स का प्रारंभ।

गुंजाइश एक क्षेत्र के में परिभाषित किया गया है JLS §6.3 घोषणा की गुंजाइश,।

प्रासंगिक नियम हैं:

  • mकिसी वर्ग प्रकार C (a8.1.6) द्वारा घोषित या विरासत में दिए गए सदस्य की घोषणा का दायरा C का संपूर्ण निकाय है, जिसमें कोई भी नेस्टेड प्रकार की घोषणाएँ शामिल हैं।
  • उदाहरण के चर के लिए प्रारंभिक अभिव्यक्तियाँ वर्ग द्वारा घोषित या विरासत में दिए गए किसी भी स्थिर चर के साधारण नाम का उपयोग कर सकती हैं, यहां तक ​​कि जिसका घोषणा पाठ बाद में होता है।
  • ऐसे उदाहरण चर का उपयोग जिनकी घोषणाएँ उपयोग के बाद कभी-कभी प्रतिबंधित होती हैं, भले ही ये उदाहरण चर दायरे में हों। चर उदाहरण के लिए आगे संदर्भ को नियंत्रित करने वाले सटीक नियमों के लिए ning8.3.2.3 देखें।

§8.3.2.3 कहता है:

किसी सदस्य की घोषणा को पाठ से पहले प्रदर्शित करने की आवश्यकता होती है, इसका उपयोग केवल तभी किया जाता है जब सदस्य वर्ग या इंटरफ़ेस C का एक उदाहरण (क्रमशः स्थिर) फ़ील्ड हो और निम्नलिखित सभी स्थितियाँ हों:

  • उपयोग C के उदाहरण (क्रमशः स्थिर) चर इनीशियलाइज़र में होता है और C के इंस्टेंस में (क्रमशः स्टैटिक) इनिशियलाइज़र होता है।
  • उपयोग एक असाइनमेंट के बाईं ओर नहीं है।
  • उपयोग एक साधारण नाम से होता है।
  • सी, अंतरतम वर्ग या इंटरफ़ेस का उपयोग है।

आप वास्तव में कुछ मामलों को छोड़कर, घोषित किए जाने से पहले खेतों का उल्लेख कर सकते हैं। इन प्रतिबंधों का उद्देश्य कोड को रोकना है

int j = i;
int i = j;

संकलन से। जावा कल्पना कहती है, "ऊपर दिए गए प्रतिबंध संकलन समय, परिपत्र या अन्यथा विकृत प्रारंभिकताओं को पकड़ने के लिए डिज़ाइन किए गए हैं।"

इन नियमों से वास्तव में क्या उबाल आता है?

संक्षेप में, नियम मूल रूप से कहते हैं कि आपको उस फ़ील्ड के संदर्भ में अग्रिम में एक फ़ील्ड घोषित करना होगा यदि (ए) संदर्भ एक इनिशियलाइज़र में है, (बी) संदर्भ को सौंपा नहीं जा रहा है, (सी) संदर्भ एक है सरल नाम (कोई क्वालिफायर नहीं this.) और (डी) इसे एक आंतरिक वर्ग के भीतर से एक्सेस नहीं किया जा रहा है। तो, एक आगे का संदर्भ जो सभी चार स्थितियों को संतुष्ट करता है, अवैध है, लेकिन एक आगे का संदर्भ जो कम से कम एक स्थिति में विफल रहता है, ठीक है।

int a = a = 1;संकलित करता है क्योंकि यह उल्लंघन करता है (बी): संदर्भ a को सौंपा जा रहा है, इसलिए यह पूरी तरह से घोषणा के aअग्रिम में संदर्भित करने के लिए कानूनी है a

int b = this.b + 1संकलित भी करता है क्योंकि यह उल्लंघन करता है (सी): संदर्भ this.bएक साधारण नाम नहीं है (यह योग्य है this.)। यह विषम निर्माण अभी भी पूरी तरह से परिभाषित है, क्योंकि this.bमूल्य शून्य है।

इसलिए, मूल रूप से, शुरुआती के भीतर क्षेत्र संदर्भों पर प्रतिबंध int a = a + 1सफलतापूर्वक संकलित होने से रोकते हैं ।

ध्यान दें कि फ़ील्ड घोषणा संकलन में विफल हो int b = (b = 1) + bजाएगी , क्योंकि फ़ाइनल अभी भी एक अवैध फ़ॉरवर्ड संदर्भ है।b

स्थानीय चर

स्थानीय चर घोषणाएँ JLS §14.4 द्वारा संचालित होती हैं , स्थानीय परिवर्तनीय घोषणा विवरण।

गुंजाइश एक स्थानीय चर के में परिभाषित किया गया है JLS §6.3 , एक घोषणा के स्कोप:

  • एक ब्लॉक में स्थानीय चर घोषणा का दायरा ()14.4) शेष खंड है जिसमें घोषणा प्रकट होती है, अपने स्वयं के प्रारंभकर्ता के साथ शुरू होती है और किसी भी अन्य घोषणाकर्ता को स्थानीय चर घोषणा बयान में दाईं ओर शामिल करती है।

ध्यान दें कि इनिशियलाइज़र वैरिएबल के दायरे में हैं। तो क्यों int d = d + 1;संकलन नहीं है ?

इसका कारण निश्चित कार्य पर जावा के नियम ( JLS .16 ) के कारण है। निश्चित रूप से असाइनमेंट मूल रूप से कहता है कि किसी स्थानीय वैरिएबल की हर एक्सेस में उस वैरिएबल का पूर्ववर्ती असाइनमेंट होना चाहिए, और जावा कंपाइलर लूप और शाखाओं की जांच करता है ताकि यह सुनिश्चित किया जा सके कि असाइनमेंट हमेशा किसी भी उपयोग से पहले होता है (यही कारण है कि निश्चित असाइनमेंट में एक संपूर्ण विनिर्देश अनुभाग समर्पित है यह)। मूल नियम है:

  • स्थानीय चर या रिक्त अंतिम फ़ील्ड की प्रत्येक पहुंच के लिए x, xनिश्चित रूप से एक्सेस से पहले असाइन किया जाना चाहिए, या एक संकलन-समय त्रुटि उत्पन्न होती है।

में int d = d + 1;, dस्थानीय चर ठीक करने के लिए उपयोग किया जाता है, लेकिन जब तक पहुँचने dसे पहले असाइन नहीं किया गया dहै, संकलक एक त्रुटि जारी करता है। में int c = c = 1, c = 1पहले होता है, जो असाइन करता है c, और फिर cउस असाइनमेंट (जो 1 है) के परिणाम के लिए आरंभिक है।

ध्यान दें कि निश्चित असाइनमेंट नियमों के कारण, स्थानीय परिवर्तनीय घोषणा सफलतापूर्वक ( फ़ील्ड घोषणा के विपरीत ) संकलन int d = (d = 1) + d; करेगी , क्योंकि निश्चित रूप से अंतिम पहुंच के समय तक सौंपा गया है।int b = (b = 1) + bdd


संदर्भ के लिए +1, हालांकि मुझे लगता है कि आपको यह शब्द गलत लगा है: "int a = 1; संकलन करता है क्योंकि यह उल्लंघन करता है (b)", यदि यह 4 आवश्यकताओं में से किसी एक का उल्लंघन करता है तो यह संकलन नहीं करेगा। हालांकि यह बाद से यह नहीं है है एक काम के बाएं हाथ की ओर (JLS के शब्दों में डबल नकारात्मक ज्यादा यहाँ मदद नहीं करता है)। में int b = b + 1ख सही (बाईं ओर नहीं) असाइनमेंट की तो यह इस का उल्लंघन होगा पर है ...
msam

... जो मैं निश्चित नहीं हूं वह निम्नलिखित है: उन 4 शर्तों को पूरा किया जाना चाहिए यदि घोषणा असाइनमेंट से पहले पाठयक्रम में प्रकट नहीं होती है, तो इस मामले में मुझे लगता है कि घोषणा असाइनमेंट से पहले "टेक्स्टली" दिखाई देती है int x = x = 1, जिसमें इनमें से कोई भी लागू नहीं होगा।
एमएसएम

@msam: यह एक उलझन है, लेकिन मूल रूप से आपको एक आगे का संदर्भ बनाने के लिए चार शर्तों में से एक का उल्लंघन करना होगा। यदि आपका आगे का संदर्भ सभी चार स्थितियों को संतुष्ट करता है, तो यह अवैध है।
nnonneo

@msam: इसके अलावा, पूर्ण घोषणा केवल इनिशियलाइज़र के बाद लागू होती है।
nnonneo

@ मर्फी: बड़ा जवाब है, लेकिन जावा कल्पना में गहराई की आश्चर्यजनक मात्रा है। यह सवाल इतना सरल नहीं है जितना सतह पर लगता है। (मैंने एक बार एक सबसेट-जावा जावा कंपाइलर लिखा था, इसलिए मैं JLS के कई और बाहरी लोगों से काफी परिचित हूं)।
nnonneo

86
int x = x = 1;

के बराबर है

int x = 1;
x = x; //warning here

जब में

int x = x + 1; 

पहले हमें गणना करने की आवश्यकता है x+1लेकिन x का मान ज्ञात नहीं है, इसलिए आपको एक त्रुटि मिलती है (कंपाइलर जानता है कि x का मान ज्ञात नहीं है)


4
यह प्लस OpenSauce से दाईं-समरूपता पर संकेत मुझे बहुत उपयोगी लगा।
तोबीमैकनमॉबी

1
मुझे लगा कि असाइनमेंट का रिटर्न वैल्यू असाइन किया जा रहा है, वेरिएबल वैल्यू नहीं।
zzzzBov

2
@zzzzBov सही है। int x = x = 1;के बराबर है int x = (x = 1), नहीं x = 1; x = x; । आपको ऐसा करने के लिए एक कंपाइलर चेतावनी नहीं मिलनी चाहिए।
nnonneo

int x = x = 1;ऑपरेटर की x = (x = 1)=
समरसता के

1
@nneonneo और int x = (x = 1)के बराबर है int x; x = 1; x = x;(चर घोषणा, क्षेत्र प्रारंभकर्ता ने कहा कि मूल्यांकन के परिणाम के लिए चर का काम के मूल्यांकन), इसलिए चेतावनी
msam

41

यह लगभग बराबर है:

int x;
x = 1;
x = 1;

सबसे पहले, int <var> = <expression>;हमेशा के बराबर है

int <var>;
<var> = <expression>;

इस मामले में, आपकी अभिव्यक्ति है x = 1, जो एक बयान भी है। x = 1एक वैध कथन है, क्योंकि var xपहले ही घोषित किया जा चुका है। यह मान 1 के साथ एक अभिव्यक्ति भी है, जिसे फिर से सौंपा गया है x


ठीक है, लेकिन अगर आप यह कहते हैं, तो कक्षा में दूसरे कथन में त्रुटि क्यों होती है? मेरा मतलब है कि आपको 0ints के लिए डिफ़ॉल्ट मान मिलता है , इसलिए मैं उम्मीद करूंगा कि परिणाम 1 होगा, न कि undefined reference
मार्सिन

@Izogfif जवाब पर एक नज़र डालें। काम करना पसंद है, क्योंकि C ++ कंपाइलर वेरिएबल्स को डिफॉल्ट मान देता है। उसी तरह जावा वर्ग-स्तरीय चर के लिए करता है।
मार्सिन

@Marcin: जावा में, जब वे स्थानीय चर होते हैं, तो उन्हें 0 में आरंभीकृत नहीं किया जाता है। यदि वे सदस्य चर हैं, तो उन्हें केवल 0 से प्रारंभ किया जाता है। तो आपकी दूसरी पंक्ति में, x + 1कोई परिभाषित मूल्य नहीं है, क्योंकि xअसिंचित है।
OpenSauce

1
@OpenSauce लेकिन एक सदस्य चर के रूप x में परिभाषित किया गया है ("वर्ग गुंजाइश में")।
जैकब रायल

@JacobRaihle: आह ठीक है, उस हिस्से को हाजिर नहीं किया। मुझे यकीन नहीं है कि 0 से एक var को इनिशियलाइज़ करने के लिए संकलक द्वारा जनरेट किया जाएगा यदि यह देखता है कि एक स्पष्ट इनिशियलाइज़ेशन निर्देश है। यहाँ एक लेख है जो क्लास और ऑब्जेक्ट इनिशियलाइज़ेशन के बारे में विस्तार से बताता है, हालाँकि मुझे नहीं लगता कि यह इस सटीक मुद्दे को संबोधित करता है: javaworld.com/jw-11-2001/jw-1102-java101.html
OpenSauce

12

जावा या किसी भी आधुनिक भाषा में, असाइनमेंट दाईं ओर से आता है।

मान लीजिए कि आपके पास दो चर x और y हैं,

int z = x = y = 5;

यह कथन मान्य है और यह है कि कैसे कंपाइलर उन्हें विभाजित करता है।

y = 5;
x = y;
z = x; // which will be 5

लेकिन आपके मामले में

int x = x + 1;

संकलक ने एक अपवाद दिया क्योंकि, यह इस तरह से विभाजित होता है।

x = 1; // oops, it isn't declared because assignment comes from the right.

चेतावनी x = x नहीं x = 1 पर है
असीम गफ्फार

8

int x = x = 1; के बराबर नहीं है:

int x;
x = 1;
x = x;

javap हमें फिर से मदद करता है, ये JVM निर्देश हैं जो इस कोड के लिए उत्पन्न होते हैं:

0: iconst_1    //load constant to stack
1: dup         //duplicate it
2: istore_1    //set x to constant
3: istore_1    //set x to constant

अधिक की तरह:

int x = 1;
x = 1;

यहाँ अपरिभाषित संदर्भ त्रुटि को फेंकने का कोई कारण नहीं है। अब इनिशियलाइज़ेशन से पहले वेरिएबल का उपयोग होता है, इसलिए यह कोड पूरी तरह से स्पेसिफिकेशन का पालन करता है। वास्तव में चर का कोई उपयोग नहीं है , बस असाइनमेंट। और जेआईटी कंपाइलर आगे भी चलेगा, यह ऐसे निर्माणों को खत्म कर देगा। ईमानदारी से कहूं तो मुझे समझ नहीं आ रहा है कि यह कोड JLS के वैरिएबल इनिशियलाइजेशन और यूसेज के स्पेसिफिकेशन से कैसे जुड़ा है। कोई फायदा नहीं कोई समस्या नहीं। ;)

कृपया सही है अगर मैं गलत हूँ। मैं यह नहीं पता लगा सकता हूं कि अन्य उत्तर, जो कई जेएलएस पैराग्राफ को संदर्भित करते हैं, इतने सारे प्लस क्यों एकत्र करते हैं। इन अनुच्छेदों में इस मामले में कुछ भी सामान्य नहीं है। बस दो सीरियल असाइनमेंट और नहीं।

यदि हम लिखते हैं:

int b, c, d, e, f;
int a = b = c = d = e = f = 5;

के बराबर है:

f = 5
e = 5
d = 5
c = 5
b = 5
a = 5

सही अधिकांश अभिव्यक्ति को केवल एक के बाद एक, बिना किसी पुनरावृत्ति के चर के लिए सौंपा गया है। हम किसी भी तरह से चर को गड़बड़ कर सकते हैं:

a = b = c = f = e = d = a = a = a = a = a = e = f = 5;

7

में int x = x + 1;आप एक्स में 1 जोड़ देते, तो क्या का मूल्य है x, यह अभी तक नहीं बनाया गया है।

लेकिन int x=x=1;बिना किसी त्रुटि के संकलन करेगा क्योंकि आप 1 को असाइन करते हैं x


5

आपके कोड के पहले टुकड़े =में एक प्लस के बजाय दूसरा होता है । यह कहीं भी संकलित करेगा जबकि दूसरा टुकड़ा कोड किसी भी स्थान पर संकलित नहीं करेगा।


5

कोड के दूसरे भाग में, x का उपयोग उसके घोषणा से पहले किया जाता है, जबकि कोड के पहले भाग में इसे केवल दो बार असाइन किया जाता है, जो समझ में नहीं आता है, लेकिन मान्य है।


5

चलो इसे कदम से कदम, सही साहचर्य को तोड़ दें

int x = x = 1

x = 1, एक चर x को असाइन करें

int x = xअसाइन करें, क्या x अपने आप में है, एक इंट के रूप में। चूंकि x को पहले 1 के रूप में सौंपा गया था, इसलिए यह 1 को बनाए रखता है, यद्यपि यह एक निरर्थक फैशन है।

वह ठीक संकलन करता है।

int x = x + 1

x + 1, एक चर x में जोड़ें। हालाँकि, x के अपरिभाषित होने से यह एक संकलित त्रुटि का कारण होगा।

int x = x + 1, इस प्रकार यह रेखा त्रुटियों को संकलित करती है क्योंकि बराबरी के दाहिने हिस्से को एक अनचाही चर में जोड़ने के लिए संकलित नहीं किया जाएगा


नहीं, जब दो =ऑपरेटर होते हैं, तो यह सही-सहयोगी होता है , इसलिए यह उसी के समान है int x = (x = 1);
जेपी स्टिग नीलसन

आह, मेरे आदेश। उसके लिए माफ़ करना। उन्हें पीछे की तरफ करना चाहिए था। मैंने इसे अब चारों ओर बदल दिया है।
४१ पर steventnorris

3

दूसरा एक int x=x=1संकलन है क्योंकि आप x को मान प्रदान कर रहे हैं लेकिन दूसरे मामले में int x=x+1यहाँ चर x को आरंभीकृत नहीं किया गया है, याद रखें जावा स्थानीय चर में डिफ़ॉल्ट मान के लिए आरंभिक नहीं है। नोट यदि यह ( int x=x+1) वर्ग गुंजाइश में भी है, तो यह संकलन त्रुटि भी देगा क्योंकि चर नहीं बनाया गया है।


2
int x = x + 1;

चेतावनी के साथ विजुअल स्टूडियो 2008 में सफलतापूर्वक संकलन करता है

warning C4700: uninitialized local variable 'x' used`

2
Interresting। क्या यह C / C ++ है?
मार्सिन

@ मार्सीन: हाँ, यह C ++ है। @ एलएसएम: क्षमा करें, मुझे लगता है कि मैंने cइसके बजाय टैग देखा , javaलेकिन जाहिर है कि यह दूसरा सवाल था।
izogfif

यह संकलित करता है क्योंकि C ++ में, संकलक आदिम प्रकारों के लिए डिफ़ॉल्ट मान प्रदान करते हैं। उपयोग bool y;और y==trueझूठे वापस आ जाएंगे।
श्री हर्ष चिलकापति

@ श्रीहरिश्चलाकापति, क्या यह C ++ कंपाइलर में किसी प्रकार का मानक है? क्योंकि जब मैं void main() { int x = x + 1; printf("%d ", x); }विजुअल स्टूडियो 2008 में संकलित करता हूं , तो डिबग में मुझे अपवाद मिलता है Run-Time Check Failure #3 - The variable 'x' is being used without being initialized.और रिलीज में मुझे 1896199921कंसोल में छपे नंबर मिलते हैं ।
izogfif

1
@SriHarshaChilakapati अन्य भाषाओं के बारे में बात करना: सी # में, एक staticक्षेत्र (वर्ग-स्तरीय स्थिर चर) के लिए, वही नियम लागू होते हैं। उदाहरण के लिए public static int x = x + 1;विजुअल C # में चेतावनी के बिना एक क्षेत्र को संकलित घोषित किया गया । संभवतः जावा में समान?
जेपी स्टिग नीलसन

2

x को प्रारंभिक नहीं किया गया है x = x + 1;

जावा प्रोग्रामिंग भाषा सांख्यिकीय रूप से टाइप की जाती है, जिसका अर्थ है कि उपयोग किए जाने से पहले सभी चर को पहले घोषित किया जाना चाहिए।

आदिम डेटा प्रकार देखें


3
अपने मूल्यों का उपयोग करने से पहले चर को शुरू करने की आवश्यकता का स्थैतिक टाइपिंग से कोई लेना-देना नहीं है। वैधानिक रूप से टाइप किया गया: आपको यह घोषित करने की आवश्यकता है कि चर किस प्रकार का है। प्रारंभिक-पहले-उपयोग: इससे पहले कि आप मूल्य का उपयोग कर सकें, इसके लिए एक मूल्य होना जरूरी है।
जॉन ब्राइट

@JonBright: प्रकारों को घोषित करने की आवश्यकता का भी स्थैतिक टाइपिंग से कोई लेना-देना नहीं है। उदाहरण के लिए, टाइप प्रकारण के साथ सांख्यिकीय रूप से टाइप की गई भाषाएं हैं।
हमार

@hammar, जिस तरह से मैं इसे देखता हूं, आप इसे दो तरीके से बहस कर सकते हैं: प्रकार की निष्कासन के साथ, आप स्पष्ट रूप से चर के प्रकार को इस तरह से घोषित कर रहे हैं कि सिस्टम का अनुमान लगा सकते हैं। या, टाइप इंफ़ेक्शन एक तीसरा तरीका है, जहां चर गतिशील रूप से रनटाइम पर टाइप नहीं किए जाते हैं, लेकिन स्रोत स्तर पर होते हैं, जो उनके उपयोग और इस तरह से किए गए इनफ़ॉर्म पर निर्भर करता है। किसी भी तरह, कथन सत्य है। लेकिन आप सही हैं, मैं अन्य प्रकार के सिस्टम के बारे में नहीं सोच रहा था।
जॉन ब्राइट

2

कोड की लाइन एक चेतावनी के साथ संकलित नहीं करती है क्योंकि कोड वास्तव में कैसे काम करता है। जब आप कोड चलाते हैं int x = x = 1, तो जावा सबसे पहले वैरिएबल बनाता है x, जैसा कि परिभाषित किया गया है। फिर यह असाइनमेंट कोड ( x = 1) चलाता है । चूंकि xपहले से ही परिभाषित किया गया है, सिस्टम में x1. पर कोई त्रुटि नहीं है। यह मान 1 लौटाता है, क्योंकि यह अब का मूल्य है x। इसके बाद, xअब अंत में 1 के रूप में सेट किया गया है।
जावा मूल रूप से कोड को निष्पादित करता है जैसे कि यह था:

int x;
x = (x = 1); // (x = 1) returns 1 so there is no error

हालाँकि, आपके दूसरे कोड ऑफ़ कोड में int x = x + 1, + 1स्टेटमेंट को xपरिभाषित करने की आवश्यकता है, जो तब तक ऐसा नहीं है। चूंकि असाइनमेंट स्टेटमेंट का मतलब हमेशा कोड को दाईं ओर =चलाना होता है, इसलिए कोड असफल हो जाएगा क्योंकि xअपरिभाषित है। जावा इस तरह कोड चलाएगा:

int x;
x = x + 1; // this line causes the error because `x` is undefined

-1

शिकायतकर्ता ने दाएं से बाएं बयान को पढ़ा और हमने इसके विपरीत डिजाइन किया। इसलिए पहले तो नाराज हुए। यह सही से बाएँ करने के लिए बयानों (कोड) को पढ़ने के लिए आप एक ऐसी समस्या नहीं होगी।

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