2011-06-16 14 views
8

मैं जावा की आधिकारिक ट्यूटोरियल से पढ़ने में ऑपरेटरों कि उपसर्ग और पोस्टफ़िक्स ++ - अलग precedences है:पूर्वता और - जावा

पोस्टफ़िक्स: expr ++ expr--

एकल : ++ expr --expr + expr -expr ~!

Operators

ट्यूटोरियल के अनुसार, ऐसा करना चाहिए नहीं इस

d = 1; System.out.println(d++ + ++d);

प्रिंट आउट 6 के बजाय 4 (d++ घ 2, ++d यह 3 बनाता है बनाता है)?

मैं ++d के विवरण पहले से मूल्यांकन किया जा रहा है, लेकिन अगर d++ उच्च पूर्वता तो है ++d, क्यों नहीं d++ पहले मूल्यांकन किया जा रहा है? और क्या अधिक है, किस मामले में d++ दिखाता है कि इसकी उच्च प्राथमिकता है?

संपादित करें:

d = 1; System.out.println(++d * d++);

यह रिटर्न 4. ऐसा लगता है कि यह 1 * 3 2 * 2, के बजाय होना चाहिए:

मैं निम्नलिखित की कोशिश की।

+3

इस तरह के प्रश्न मुझे बेहद निराश करते हैं। कोई भी * कभी * कोड 'System.out.println (डी ++ + ++ डी) जैसे कोड लिखता है;' तो आप परवाह क्यों करते हैं? यह एक सुपर-तुच्छता है। – Qwerky

+1

@Qwerky हालांकि कोई भी इस तरह कोड लिख सकता है, शायद यह स्कूल के लिए है। शिक्षक/प्रोफेसर इस तरह के पूछने से प्यार करते हैं "यह इस तरह कभी लिखा नहीं जाएगा, लेकिन हम यह देखने के लिए किसी भी तरह से जांच कर रहे हैं कि क्या आप समझते हैं कि यह कैसे काम करता है" प्रश्न। –

+0

@Qwerky आपको निराश करने के लिए खेद है :) कारण से मैंने पूछा, शायद यह जिज्ञासा है। मुझे भाग्यशाली है क्योंकि मैं कोई बिल्ली नहीं हूँ। –

उत्तर

12

println बयान के अंदर इस आपरेशन (घ ++) + (++ घ)

  1. यह इस प्रकार है, घ के मूल्य को पढ़ने के लिए है है (घ = 1)
  2. वर्तमान मूल्य डी (1) के अतिरिक्त कार्य
  3. डी का मान बढ़ाना है (डी = 2)।

  4. फिर, सही पक्ष पर, घ के मूल्य को पढ़ा जाता है (2)

  5. घ के मूल्य में वृद्धि की जाती है (अब d = 3)
  6. अंत में, घ के मूल्य (3) इसके अलावा समारोह में में 4

संपादित

इस प्रकार 1 + 3 परिणाम डाल दिया है: खेद प्रारूप के लिए, मैं नहीं बल्कि बुरा सूची का उपयोग करने में haha ​​हूँ

+0

पहले उत्तर देने और मुझे प्रबुद्ध होने के लिए धन्यवाद! हालांकि, मैंने आज अपने अधिकतम अपवॉट का उपयोग किया, इसलिए मुझे लगता है कि मुझे कल इसे करना होगा। :) –

10

कुंजी ऑपरेशन से वापस आती है।

  • x ++ x का मान बदलता है, लेकिन रिटर्न वर्ष एक्स।
  • ++ x x के मान को बदलता है, और नया मान देता है।
 
d=1 
System.out.println(d++ + ++d); // d is 1 
System.out.println(1 + ++d); // d is 2 
System.out.println(1 + 3); // d is 3 

प्रिंटों 4

2

यह पूर्वता के बारे में नहीं है, यह मूल्यांकन आदेश के बारे में है। d++1 का मूल्यांकन करता है, लेकिन फिर d बढ़ रहा है। ++d वेतन वृद्धि d, और उसके बाद के लिए 3.

+0

मैं देखता हूं। लेकिन क्या आप मुझे एक मामला दिखा सकते हैं जिसमें प्राथमिकता दिखायी गयी है? –

+0

@ ज़ियाओ: '(3 - 4 * 5)' जैसी अभिव्यक्ति में, प्राथमिकता यह निर्देश देती है कि यह '(3 - (4 * 5)) के बराबर है,' ((3 - 4) * 5) ' । –

0

घ का मूल्यांकन करता है मान 1

घ ++ मूल्यांकन किया जाता है है; यह मान 1 है और डी अब 2 है (पोस्ट ++ वृद्धि से पहले मूल्य वापसी)

++ डी का मूल्यांकन किया गया है; यह मान 3 है और घ अब 3 (++ वेतन वृद्धि के बाद पूर्व रिटर्न मूल्य)

1 + 3 = 4

0

println (घ ++ + ++ घ) है;

यहाँ यह कैसे जाता है:

++ घ निष्पादित किया जाता है, तो घ अब 2.

d + घ निष्पादित किया जाता है, जो बराबर होती है 4.

मूल्य 4 सिस्टम को दिया जाता है है .out.println()

घ ++ निष्पादित किया जाता है, इसलिए अब घ 3.

0

अन्य टिप्पणी के अलावा है, मैं सुझाव है कि आप, अनुक्रम अंक पर एक नजर है के रूप में इस सामान में से कुछ कर सकते हैं एल अपरिभाषित व्यवहारों के लिए तैयार, हालांकि मुझे लगता है कि आपका मामला जावा के लिए परिभाषित किया गया है।

x[i]=i++ + 1; क्या करता है?

http://www.angelikalanger.com/Articles/VSJ/SequencePoints/SequencePoints.html

2

Why is this Java operator precedence being ignored here? देखें।

यह इस तथ्य को उबालता है कि पोस्टफिक्स ऑपरेटर का मूल्यांकन पहले किया जा रहा है, लेकिन वैरिएबल के मूल मान को डिज़ाइन किया गया है। तो, आपके ऑपरेशन के प्रयोजनों के लिए:

(d++ + ++d) 

Processes as: 
1. d++ evaluates, returning the original value of 1 but incrementing d to 2 
2. ++d evaluates, incrementing the value of 2 TO 3, and returning 3 
3. + evaluates, resulting in 1 + 3 

भ्रम प्राथमिकता का क्रम टोकन मूल्यांकन किया जाना में नहीं है, आपको लगता है कि सही मिल गया है। वास्तविक समस्या पोस्टफिक्स और उपसर्ग ऑपरेटरों के बीच कार्यात्मक अंतर की समझ में है।

6

विभिन्न प्राथमिकता का मतलब का मूल्यांकन पहले का मूल्यांकन किया जाएगा।

इसका मतलब है अभिव्यक्तियों को इस तरह से में समूहीकृत किया जाएगा।

इस मामले में, d++ + ++d(d++) + (++d) वर्गीकृत किया जाएगा, और इस द्विआधारी अभिव्यक्ति इस क्रम में मूल्यांकन किया जाएगा:

  • बाईं संकार्य d++।यह उपसूचक एक पोस्टफ़िक्स वेतन वृद्धि ऑपरेटर और एक चर के होते हैं, तो यह उन दो प्रभाव होते हैं:
    • उपसूचक के मूल्य 1
    • चर अद्यतन किया जाता है है: d = 2
  • सही संकार्य ++d। यह उपसूचक एक उपसर्ग वेतन वृद्धि ऑपरेटर और एक चर के होते हैं, तो यह उन दो प्रभाव होते हैं:
    • चर अद्यतन किया जाता है: d = 3
    • उपसूचक के मूल्य 3
  • ऑपरेटर + मूल्यांकन किया जाता है, का उपयोग कर रहा है दो ऑपरेटरों के मूल्य।
    • इस प्रकार अभिव्यक्ति मूल्य 1 + 3 = है 4.

केवल ++d++ में देखा जा जाएगा ++ का उपसर्ग और पोस्टफ़िक्स रूपों के बीच अलग अलग पूर्वता, जो ++(d++) के रूप में व्याख्या की जाएगी - और इसका कोई अर्थ नहीं है ((++d)++ में कोई भी नहीं है), क्योंकि ++ केवल वैरिएबल पर काम करता है, मूल्यों पर नहीं (और परिणाम एक मान है)।

+1

बंद करें, लेकिन आपका निष्कर्ष गलत है। ऊपर दिए गए उत्तरों में समझाया गया यह 1 + 3 = 4 होना चाहिए। ++ डी वृद्धि से पहले परिणाम देता है, इसलिए बाएं अभिव्यक्ति का मूल्यांकन करने के बाद डी 2 बराबर होगा, बाएं अभिव्यक्ति का मूल्यांकन 1. –

+0

सुधार के लिए धन्यवाद ... अजीब है कि यह 9 महीने के लिए अज्ञात नहीं हुआ। –

+0

आपका स्वागत है! मैंने सोचा कि यह यहां कई अलग-अलग तरीकों से समझाया जाने वाला मूल्यवान था, और मुझे लगता है कि कई लोगों को जानकारी प्रदान करने के तरीके को मिलेगा। –

0

मैं शीर्ष से सभी स्पष्टीकरणों के माध्यम से चला गया .. निम्नलिखित कोड को समझने के अनुसार 11.0 देना चाहिए तो y यह 10.0 डबल x = 4.5 देता है; x = x +++ x; // एक्स मान 10.0 हो जाता है।

संबंधित मुद्दे