क्या हम परिवर्तनशील नामों में टिप्पणी लिख सकते हैं?


144

यदि मेरे पास उपरोक्त कोड है और मैं टोकन गिनना चाहता हूं, तो क्या यह 14 या 13 टोकन होगा?

क्या चर नाम से टिप्पणी लिखना मान्य है? आप मान सकते हैं कि int i, int a, int iaविश्व स्तर पर परिभाषित कर रहे हैं।


13
पूर्व-एएनएसआई "पारंपरिक" सी में, जैसा कि कम से कम जीएनयूcpp -traditional द्वारा लागू किया गया है , इसका विस्तार होगा ia = 10;
नैट एल्ड्रेडगे

37
क्या दिलचस्प सवाल है - यह मेरे साथ पहले कभी क्यों नहीं हुआ?
StephenBoesch

178
@ जजदबा: क्योंकि समझदार लोग ऐसा काम करने के बारे में नहीं सोचते होंगे?
jamesqf

5
यदि आप वास्तव में ऐसा करना चाहते हैं, तो आप फोरट्रान में शिफ्ट हो सकते हैं। पहले पार्स चरण में स्ट्रिंग्स के बाहर व्हाट्सएप को हटा दिया जाता है।
mpez0

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

जवाबों:


198

कार्यक्रम के अनुवाद 1 के चरण 3 के दौरान टिप्पणियों को हटा दिया जाता है : प्रत्येक टिप्पणी को एक स्थान वर्ण द्वारा बदल दिया जाता है। तो टिप्पणी /*nt*/निश्चित रूप से एक टोकन नहीं है।

कोई भी अगर int, main, i, aया returnमैक्रो preprocessing के रूप में, परिभाषित कर रहे हैं कार्यक्रम पार्स करने का उत्पादन 14 टोकन (नहीं 13):

int main ( ) { i a = 10 ; return 0 ; }

जब तक iकि एक typedefबयान के साथ एक प्रकार के रूप में परिभाषित नहीं किया जाता है, तब तक एक वाक्यविन्यास त्रुटि होती है क्योंकि i aसी व्याकरण में एक नियम से मेल नहीं खाता है।

इसलिए आप चर नामों के अंदर टिप्पणी नहीं लिख सकते , टिप्पणी पहचानकर्ता को 2 अलग टोकन में विभाजित करती है। यह किसी भी प्रीप्रोसेसिंग और सी भाषा टोकन 2 के लिए सही है

ध्यान दें कि आप असामान्य स्थानों जैसे कि अपर संचालक और उनके ऑपरेटर के बीच या #प्रीप्रोसेसिंग निर्देश और उसके तर्कों के बीच टिप्पणी डाल सकते हैं :

लेकिन उपरोक्त मैक्रो परिभाषा फ़ंक्शन-जैसे मैक्रो को परिभाषित नहीं करती है, लेकिन एक नियमित मैक्रो STATजो फैलता है ( a ) - 1

परिवर्तनीय नाम, किसी भी अन्य टोकन की तरह बच गई नई सुर्खियों से विभाजित हो सकते हैं। बची हुई नई सुर्खियाँ सीक्वेंस हैं या इसके \तुरंत बाद एक नई पंक्ति है। ये अनुक्रम प्रोग्राम अनुवाद के चरण 2 के दौरान स्रोत कोड से हटा दिए जाते हैं। उनका मुख्य उद्देश्य कई लाइनों पर लंबी मैक्रो परिभाषाओं को तोड़ना है।

नीचे एक कोड टुकड़ा 3 है जो समान 14 टोकन का उत्पादन करता है:

सूचना कैसे कोड colorizer कटा हुआ और diced खोजशब्दों और टिप्पणी याद किया :)


1) यह व्यवहार ANSI-C उर्फ ​​C89 में निर्दिष्ट किया गया था। कुछ प्राचीन संकलक में समान रूप से अलग-अलग व्यवहार होता था, जिसके परिणामस्वरूप टोकन चिपकाने लगते थे, लेकिन इस तरह की ख़ासियतें केवल ऐतिहासिक रुचि की होती हैं।

2) आप इस तथ्य का लाभ उठाते हुए एक स्ट्रिंग स्थिरांक के अंदर लगभग एक टिप्पणी डाल सकते हैं कि आसन्न स्ट्रिंग स्थिरांक को कार्यक्रम अनुवाद के चरण 6 में समाहित किया गया है: printf("Hello "/* my name is Luca */"world!\n");

3) इस क्रिसमस ट्री प्रस्तुति शैली का वास्तविक कार्यक्रमों में उपयोग करने के लिए नहीं है, यह दिखाता है कि सी की इनपुट हैंडलिंग क्षमताओं का दुरुपयोग कैसे किया जाता है। अधिक विस्तृत तरकीबों ने द इंटरनेशनल ऑबफुसकेटेड सी कोड प्रतियोगिता जीती है


मुझे आश्चर्य है कि मानक की आवश्यकता क्यों है कि लाइन-कंटीन्यू बैकस्लैश कैरेक्टर को न्यूलाइन से अन्य व्हाट्सएप कैरेक्टर्स से अलग नहीं किया जाना चाहिए, यह देखते हुए कि कोई अन्य परिस्थिति नहीं है जहां रिक्त स्थान या उसके अभाव में शब्दार्थ काफी महत्वपूर्ण होगा, और कुछ पाठ फ़ाइल स्वरूप नहीं हो सकते उन पंक्तियों से रिक्त होने वाली लाइनों को भेद करने में सक्षम हो जो नहीं है?
सुपरकैट

@ सुपरकैट: मैं सहमत हूं। यह विरासत प्रणालियों से आने वाली फाइलों के मामले को भी कवर करेगा जो CR LF अनुक्रमों का उपयोग करता है क्योंकि यूनिक्स सिस्टम पर संकलन त्रुटियों के कारण लाइन एंडिंग होते हैं जो \rपहले से शामिल बची हुई नईलाइन्स को नहीं पहचानते हैं \n। फिर भी एक ऐसा मामला है जहां यह उलटा पड़ सकता है: टिप्पणियों में सफेद वर्ण के बाद वाले वर्ण शामिल हो सकते हैं, विशेष रूप से लाइन चिपकाने से बचने के लिए:const char *path = "C:\\"; // the default path is C:\ 
chqrlie

मानक को यह आवश्यकता नहीं है कि टेक्स्ट फाइलें एक पंक्ति के अंत में व्हाट्सएप वर्णों का समर्थन करने में सक्षम हों। इस तरह की टिप्पणी लिखना The path is "C:\"बेहतर होगा क्योंकि कोड का अर्थ नई रूपरेखाओं पर निर्भर होता है।
सुपरकैट

1
Teeechnically, मानक ऐसी कोई आवश्यकता नहीं बनाता है, क्योंकि बार-बार अनदेखा अनुवाद चरण 1 को हर पंक्ति से रिक्त ट्रेलिंग पट्टी की अनुमति दी जाती है , जब तक कि यह व्यवहार प्रलेखित नहीं होता है।
zwol

4
यह उत्तर बहुत लंबा है, बस यह साबित करने के लिए कि कोई बेवकूफ सवाल नहीं है। बहुत बढ़िया।
ओवरब्रिज

65

लेक्सिकल दृष्टिकोण से, एक टिप्पणी व्हॉट्सएप जैसी ही है।

लेक्सिकल तत्वों के संबंध में सी मानक की धारा 6.4p3 :

... प्रीप्रोसेसिंग टोकन को सफेद स्थान द्वारा अलग किया जा सकता है ; इसमें टिप्पणियाँ (बाद में वर्णित), या श्वेत-स्थान वर्ण (स्थान, क्षैतिज टैब, नई-पंक्ति, ऊर्ध्वाधर टैब और फ़ॉर्म-फ़ीड), या दोनों शामिल हैं। ...

विशेष रूप से, एक टिप्पणी को एक ही स्थान में अनुवादित किया जाता है। इसे खंड 5.1.1.2p3 में निर्दिष्ट किया गया है:

स्रोत फ़ाइल को सफेद स्पेस वर्णों (टिप्पणियों सहित) के प्रीप्रोसेसिंग टोकन और दृश्यों में विघटित किया गया है। स्रोत फ़ाइल आंशिक प्रीप्रोसेसिंग टोकन या आंशिक टिप्पणी में समाप्त नहीं होगी। प्रत्येक टिप्पणी को एक अंतरिक्ष वर्ण द्वारा प्रतिस्थापित किया जाता है। नए-लाइन वर्णों को बनाए रखा जाता है। नई-लाइन के अलावा श्वेत-अंतरिक्ष वर्णों के प्रत्येक गैर-रिक्त अनुक्रम को बरकरार रखा गया है या एक स्थान वर्ण द्वारा प्रतिस्थापित किया गया है जो कार्यान्वयन-परिभाषित है।

इसे स्पष्ट करने के लिए, यदि आप अपना कोड प्रीप्रोसेसर के माध्यम से पास करते हैं, तो आपको मिलेगा:

तो व्हाट्सएप की तरह टिप्पणी, अलग टोकन की सेवा।

इसका मतलब है कि कोड में 14 टोकन होंगे, 13 नहीं।



12

अनुवाद देखें (उर्फ संकलन) चरण 3 , चरण 2: "प्रत्येक टिप्पणी को एक अंतरिक्ष वर्ण द्वारा प्रतिस्थापित किया जाता है"

तो, वैचारिक रूप से, उस बिंदु पर i/*nt*/aबन जाता है i a


टिप्पणियाँ विस्तारित चर्चा के लिए नहीं हैं; इस वार्तालाप को बातचीत में स्थानांतरित कर दिया गया है ।
Machavity

1

बस जाँच करें कि आपका कोड क्या है

प्रीप्रोसेसिंग के बाद होगा। बस अपने संकलक में "-ई" ध्वज जोड़ें, gcc -E myscript.c और आप परिणाम प्राप्त करेंगे:

और जाहिर है, आप यह निष्कर्ष निकाल सकते हैं कि एक गलती है।


-9

हां, आप यह कर सकते हैं। टिप्पणियाँ संकलक द्वारा छोड़ दिया जाएगा। वे चर को प्रभावित नहीं करेंगे। यह वही होगा जो केवल टिप्पणी टैग समाप्त करने के लिए मत भूलना।


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