2013-09-01 7 views
5

printf कथन i+++j में, क्या इसे हमेशा i++ +j के रूप में माना जाता है?क्या मैं +++ j हमेशा i ++ + j के रूप में माना जाता है?

#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 

int main() { 
    int i =5,j= 6, z; 
    z=i^j; 
    printf("%d",i+++j); 
    return 0; 
} 
+2

हां, पोस्टफिक्स वृद्धि/कमी में उच्च प्राथमिकता है। –

+0

इतने सारे डुप्लिकेट हैं लेकिन उन्हें खोजने में मुश्किल होती है क्योंकि +++ खोज शब्द के रूप में काम नहीं कर रहा है। –

+5

@ShashankKadne: ऑपरेटर प्राथमिकता के साथ इसका कोई लेना-देना नहीं है। –

उत्तर

18

i+++ji++ + j के बराबर है।

इसका ऑपरेटर प्राथमिकता से कोई लेना देना नहीं है। +++ को अभिव्यक्तियों से पहले संकलक द्वारा ++ + पर हल किया गया है।

सी मानक अनुवाद चरणों के अनुक्रम को परिभाषित करता है, प्रत्येक प्रत्येक इनपुट के पिछले इनपुट के रूप में उपयोग करता है। +++ चरण 3 में ++ + को हल किया गया है, जो स्रोत को प्रोप्रोसेसर टोकन में विघटित करता है। ऑपरेटर प्राथमिकता चरण 7, वाक्य रचनात्मक और अर्थपूर्ण विश्लेषण तक नहीं माना जाता है। (अनुवाद चरणों अलग चरणों के रूप में लागू किया जाना है या नहीं गुजरता है, लेकिन संकलक अगर वे कर रहे हैं के रूप में व्यवहार करना चाहिए।)

नियमों का कहना है कि +++++ + को हल हो गई है और न + ++ क्या अनौपचारिक रूप से कहा जाता है कि " अधिकतम मर्च नियम "। यह में खंड 6.4 अनुच्छेद 4 में कहा गया है: इनपुट धारा पूर्व प्रसंस्करण में पार्स किया गया है

तो एक दिया चरित्र अप करने के लिए टोकन, अगले preprocessing टोकन अक्षर हैं जो एक पूर्व प्रसंस्करण टोकन का गठन कर सकता है की सबसे लंबी अनुक्रम है।

(Amusingly, सूचकांक करने के लिए "अधिक से अधिक मंच" संदर्भित करता है, लेकिन यह है कि अवधि मानक में और कहीं भी उल्लेख नहीं है।)

यह भी संकेत मिलता है कि i+++++j, जो के रूप में किया जा सकता है tokenized वैध अभिव्यक्ति i++ + ++j, वास्तव में i ++ ++ + j है, जो एक वाक्यविन्यास त्रुटि है।

बेशक, एक प्रोग्रामर के लिए समाधान, टोकन को विभाजन में स्पष्ट बनाने के लिए व्हाइटस्पेस जोड़ना है: i++ + j। (i+++j पूरी तरह से संकलक के लिए स्पष्ट है, लेकिन i++ + j ज्यादा एक मानव पाठक के लिए स्पष्ट है।)

संदर्भ: N1570, खंड 6.4, पैरा 4. N1570 2011 आईएसओ सी मानक के एक मसौदे है। यह नियम मानक के पुराने संस्करणों से अपरिवर्तित है। अनुवाद चरणों पर चर्चा की जाती है

+0

अधिकतम अधिकतम नियम के लिए +1 (पहले कभी नया नहीं)। – haccks

1

हां। इसे (i++) + (j) के रूप में पार्स किया जाएगा।

+3

"हां" उलझन में है। –

+0

@ आर ..; यह आपको भ्रमित क्यों कर रहा है? – haccks

+4

@ आर ..: मूल शीर्षक "क्या यह आउटपुट संकलक पर निर्भर है?"; प्रश्न के शरीर में पहली वाक्य "... क्या यह हमेशा' i ++ + j' के रूप में माना जाता है? "। उत्तर क्रमशः "नहीं" और "हां" हैं। मैंने शीर्षक को संपादित किया है, संयोग से दोनों को "हाँ" सही जवाब बना रहा है। –

-2

चूंकि पोस्टफ़िक्स वृद्धि/कमी ऑपरेटर के अतिरिक्त ऑपरेटर पर अधिक प्राथमिकता है, इसमें कोई संदेह नहीं है कि इसे (i ++) + j के रूप में माना जाएगा। तो, यह एक कंपाइलर मुद्दा नहीं है, आपको ऑपरेटर प्राथमिकता चार्ट पर विचार करना चाहिए।

इसके अलावा, मैं आपको अभिव्यक्तियों के बीच उचित स्थान देने का सुझाव दूंगा, यदि आप बाद में अपने कोड से गुजरते हैं तो यह फायदेमंद होगा। :)

आशा है कि मदद करता है!

+0

यदि यह संकलक नहीं है तो अभिव्यक्तियों को पार्स करने के लिए कौन जिम्मेदार है? – haccks

+1

"कंपाइलर इस पर निर्भर नहीं होगा" - यह होगा। 'i ++ + j' और' i +++ j' अलग-अलग पार्स किए गए हैं। –

+0

@ haccks yes compiler ज़िम्मेदार है और यह प्रश्नों के संदर्भ में मेरे उत्तर, रिक्त स्थान पर निर्भर करेगा। और मैंने इसे स्पष्टता उद्देश्य के लिए संपादित किया है। – Ashima

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