2011-09-20 31 views
38

मैं अलग अलग चीजें साथ लगभग नगण्य था, इस"ए + बी" क्यों काम करता है, लेकिन "ए ++ बी" नहीं करता है?

var a = 1, b = 2; 
alert(a + - + - + - + - + - + - + - + b); //alerts -1 

की तरह है और मैं खाली स्थानों को हटाना सकता है, और यह अभी भी काम करेगा।

a+-+-+-+-+-+-+-+b 

तो मैं करने की कोशिश की

a + + b 

यह भाग गया और 3 के लिए मूल्यांकन, लेकिन जब मैं रिक्त स्थान को हटा दिया, (a++b) यह नहीं चला जाएगा, और यह एक चेतावनी है जो "भ्रामक plusses पढ़ा था । "

मैं समझ सकता की तरह

a+++++b 

जो निम्नलिखित

(a++) + (++b) 
(a++) + +(+b) 
a + +(+(++b)) 
a + +(+(+(+b))) 

कि यह भ्रामक हो सकता है की किसी भी रूप में व्याख्या की जा सकती है कि मामलों में।

लेकिन

a++b 

इस व्याख्या करने के लिए, जहाँ तक मैं बता सकता हूँ ही मान्य तरीका के मामले में,

a + +b 

काम नहीं a++b क्यों है?

+8

मुझे लगता है कि यह एक ++ के साथ संघर्ष करता है जो मान्य सिंकैक्स है, या ++ बी। – TheCodeKing

+3

इसे भी व्याख्या किया जा सकता है (ए ++) बी या ए (++ बी) ... –

+0

'++ बी' भी मान्य है – Andrew

उत्तर

57

जावास्क्रिप्ट पार्सर लालची (यह सबसे लंबे समय तक वैध ऑपरेटर हर बार मेल खाता है) है, इसलिए यह, a++b से ++ ऑपरेटर हो जाता है बनाने:

(a++) b 

जो अवैध है। जब आप रिक्त स्थान a + + b में डाल दिया, पार्सर इस तरह यह व्याख्या:

(a) + (+b) 

जो वैध है और बाहर काम करता है तीन होने के लिए।

अधिक जानकारी के लिए इस विकिपीडिया लेख को Maximal munch पर देखें।

+7

मुझे लगता है कि यह मुख्य जवाब है: पार्सर ** लालची ** है। – Andrey

+3

यदि यह लालची नहीं था, तो यह बहुत बेकार होगा। 'ए ++' को 'ए + +' के रूप में व्याख्या किया जाएगा, जो अवैध है। महत्वपूर्ण अंतर्दृष्टि में से एक यह है कि यह पता लगाने से पहले कि टोकन का मतलब क्या है, यह पता लगाने से पहले कि कौन से टोकन इनपुट होते हैं। तो '++' '++' टोकन होने जा रहा है भले ही उस टोकन उस संदर्भ में मान्य न हो। –

12

यह a++ पढ़ रहा है, तो यह b से मुकाबला करता है और यह नहीं जानता कि इसके साथ क्या किया जाए।

+3

+1! –

+0

@carlnorum हाँ। –

7

यह यूनरी ऑपरेटरों में अंतर का बी/सी है।

"a + + b" is the same as "a + (+b)" 
"a++b" is the same as "(a++) _ b" <--- there is a missing operator where the _ is 
3

++ वृद्धि ऑपरेटर के लिए जावास्क्रिप्ट के ऑपरेटर सटीक नियमों में कोई बाएं-दाएं सहयोगी नहीं है। इसका मतलब है कि a++b को विशेष कार्यान्वयन के आधार पर a++ b या a ++b के रूप में व्याख्या किया जा सकता है। किसी भी तरह से, यह एक वाक्यविन्यास त्रुटि है, क्योंकि आपके पास 2 चर, एक यूनरी-ऑपरेटर, और दो चर शामिल होने में कुछ भी नहीं है।

व्यावहारिक दृष्टि से:

a = 1 
b = 2; 

a++ b; -> 2 2 
a ++b; -> 1 3 

क्या 1 3 जे एस कोड के रूप में मतलब है?

3

अधिकांश प्रोग्रामिंग भाषा पारसर्स टेक्स्ट अर्थपूर्ण बनाने का सबसे लंबा हिस्सा निकलने की कोशिश करता है, इसलिए जब जावास्क्रिप्ट देखता है:

[a][][][][] 

"चर एक" - यह समझ बनाने, की अगली चरित्र देखते हैं:

[a][+][][] 

"varaible को जोड़ने हो जाएगा एक" - यह समझ बनाने, की अगली चरित्र देखते हैं:

[a][+][+][] 

"पोस्ट की वृद्धि दर्शाने वाले जाएगा चर एक" - यह समझ बनाने, की अगली चरित्र देखते हैं,

[a][+][+][b] 

यह मतलब नहीं है। मेरे पास दो अभिव्यक्तियां हैं (ए ++) और (बी) और उनके बीच कोई इन्फिक्स ऑपरेटर नहीं है।

यदि आप इसे a+ +b बनाते हैं तो इसे ++ ऑपरेटर नहीं मिलेगा और यह a + + b के रूप में काम करेगा।

1

Longest Match नियम यहां चित्र में आता है। यह कहता है कि पार्सर को बाएं से दाएं से शुरू होने वाले विचारों में सबसे लंबा टोकन लेना पड़ता है (मुझे लगता है कि जावास्क्रिप्ट का व्याकरण बाएं से दाएं है)। तो बस इस नियम को लागू करें और आपको अपना जवाब मिल जाएगा।

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

0

उत्तर यह है कि ++ एक ऑपरेटर और साथ ही + है, और + + दो + ऑपरेटर हैं, एक ++ ऑपरेटर नहीं।

हालांकि यह जावास्क्रिप्ट नहीं है, सी ++ में + और ++ ऑपरेटरों के साथ समान मजा है। इस समय की जांच से Gurus of the Week में से एक में जांच की गई थी।

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