আমরা কি পরিবর্তনশীল নামের মধ্যে মন্তব্য লিখতে পারি?


145
int main()
{
     i/*nt*/a = 10;
     return 0;
}

যদি আমার উপরের কোডটি থাকে এবং আমি টোকেনগুলি গণনা করতে চাই তবে এটি 14 বা 13 টোকেন হবে?

একটি পরিবর্তনশীল নামের মধ্যে একটি মন্তব্য লিখতে বৈধ? আপনি অনুমান করতে পারেন int i, int a, int iaবিশ্বব্যাপী সংজ্ঞায়িত করা হয়।


13
প্রাক-এএনএসআই "traditionalতিহ্যবাহী" সি-তে, অন্তত জিএনইউcpp -traditional দ্বারা প্রয়োগ করা হয়েছিল , এটি প্রসারিত হবে ia = 10;
নাট এল্ডারেজ

37
কি আকর্ষণীয় প্রশ্ন - কেন এটি আমার আগে কখনও ঘটেনি?
স্টিফেনবোশ

177
@ জাভদ্বা: কারণ বুদ্ধিমান লোকেরা এ জাতীয় কাজ করার কথা ভাবেন না?
জামেস্কেফ

4
আপনি যদি সত্যিই এটি করতে চান তবে আপনি ফোর্টরানে স্থানান্তরিত করতে পারেন। প্রথম পার্স পর্যায়ে বাইরে স্ট্রাইসগুলি সরানো হয়।
এমপিজেড

4
আমি সম্পাদনা শিরোনাম সম্পর্কে ছিল ".... মধ্যে পরিবর্তনশীল নামের ..." কিন্তু তারপর উপলব্ধি করেন যে আপনি প্রকৃতপক্ষে "এর মাঝে" বোঝানো হয়ে থাকতে পারে। (আমি এটি সম্পাদনা করতে চেয়েছিলাম কারণ মূল শিরোনামের উত্তর "কেন, স্পষ্টতই!" গুরুত্বপূর্ণ অংশটি "কোনও শ্বেত স্পেস নয়"।) শিরোনামটি কি "মন্তব্যে (শ্বেত স্পেস ছাড়াই) সি-তে আলাদা টোকেন দেয়?" আপনার প্রকৃত প্রশ্ন প্রকাশ?
পিটার - মনিকা পুনরায় ইনস্টল করুন

উত্তর:


197

প্রোগ্রামের অনুবাদ 1 এর 3 ম পর্যায়ের সময় মন্তব্যগুলি সরানো হয় : প্রতিটি মন্তব্যই একটি স্থানের অক্ষর দ্বারা প্রতিস্থাপিত হয়। সুতরাং মন্তব্যটি /*nt*/অবশ্যই টোকেন নয়।

কেউ এর যদি int, main, i, aবা returnম্যাক্রো preprocessing হিসেবে সংজ্ঞায়িত করা হয় প্রোগ্রাম পার্স উত্পাদন করে 14 টোকেন (13):

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

বিবৃতি iসহ একটি ধরণের হিসাবে সংজ্ঞায়িত না করা থাকলে সি বাক্যারে কোনও নিয়মের সাথে মেলে না typedefএমন একটি বাক্য গঠন ত্রুটি রয়েছে i a

সুতরাং আপনি পরিবর্তনশীল নামের ভিতরে মন্তব্য লিখতে পারবেন না , মন্তব্যটি সনাক্তকারীকে দুটি পৃথক টোকনে বিভক্ত করে। এই যে কোনো প্রাক-প্রক্রিয়াকরণ ও সি ল্যাঙ্গুয়েজ টোকেন জন্য সত্য 2

তবে নোট করুন যে আপনি অস্বাভাবিক স্থানে যেমন আনরি অপারেটর এবং তাদের অপারেন্ডের মধ্যে #এবং এবং প্রিপ্রসেসিং নির্দেশিকা এবং এর যুক্তিগুলির মধ্যে মন্তব্য সন্নিবেশ করতে পারেন :

/**/#/**/include/**/<stdio.h>/**///////////////////////
/**/#/**/define/**/STAT/**/(/**/a/**/)/**/-/**/1/**////
/**/#/**/ifdef/**/STAT/**//////////////////////////////
/**/int/**/main/**/(/**/)/**/{/**//////////////////////
/**/int/**/a/**/=/**/+/**/1/**/;/**////////////////////
/**/printf/**/(/**/"Hello "/**/"world!\n"/**/)/**/;/**/
/**/return/**/STAT/**/;/**/////////////////////////////
/**/}/**///////////////////////////////////////////////
/**/#/**/endif/**//////////////////////////////////////

তবে উপরের ম্যাক্রো সংজ্ঞাটি কোনও ফাংশনের মতো ম্যাক্রোর সংজ্ঞা দেয় না তবে একটি নিয়মিত ম্যাক্রো STATযা প্রসারিত হয়( a ) - 1

পরিবর্তনীয় নামগুলি, অন্যান্য টোকেনের মতো পালানো নিউলাইনগুলি দ্বারা ভাগ করা যায়। পালানো নিউলাইনগুলি সিকোয়েন্স বা হয়\ তত্ক্ষণাত্ একটি নতুন লাইন অনুসরণ করা। প্রোগ্রাম অনুচ্ছেদের দ্বিতীয় ধাপের সময় এই ক্রমগুলি উত্স কোড থেকে সরানো হয়েছে। তাদের মূল উদ্দেশ্য একাধিক লাইনে দীর্ঘ ম্যাক্রো সংজ্ঞাগুলি ভাঙ্গা।

নীচে একটি কোড টুকরা 3 রয়েছে যা একই 14 টোকেন উত্পাদন করে:

\
i\
nt\
 ma\
in()
{\
i/\
*nt\
*/a \
= 10;
r\
et\
urn\
 0;}

কীভাবে কোড কালারাইজারটি কাটা এবং ডাইসযুক্ত কীওয়ার্ড এবং মন্তব্যটি মিস করেছে :) দেখুন


1) এই আচরণটি এএনএসআই-সি ওরফে সি 89 এ নির্দিষ্ট করা হয়েছিল। কিছু প্রাচীন সংকলকগুলির টোকেন পেস্টের ফলস্বরূপ সম্পূর্ণ ভিন্ন আচরণ ছিল, তবে এই জাতীয় বিশেষত্বগুলি কেবল historicalতিহাসিক আগ্রহের বিষয়।

২) আপনি প্রায় স্ট্রিং ধ্রুবকটির ভিতরে একটি মন্তব্য লিখতে পারেন যে সত্যতা যে সংলগ্ন স্ট্রিং ধ্রুবকগুলি প্রোগ্রামের অনুবাদের phase ম ধাপে সংযুক্ত করা হয়েছে: printf("Hello "/* my name is Luca */"world!\n");

3) এই ক্রিসমাস ট্রি উপস্থাপনা শৈলীটি বাস্তব প্রোগ্রামগুলিতে ব্যবহার করার জন্য নয়, এটি সি এর ইনপুট হ্যান্ডলিং ক্ষমতার অপব্যবহারের চিত্র তুলে ধরে। আরও বিস্তৃত কৌশল কৌশলগত আন্তর্জাতিক কোড সিটি প্রতিযোগিতা জিতেছে


আমি অবাক হয়েছি কেন স্ট্যান্ডার্ডটির প্রয়োজন হয় যে কোনও লাইন-ধারাবাহিকতা ব্যাকস্ল্যাশ অক্ষরটিকে অন্য সাদা অংশের অক্ষর দ্বারা নিউলাইন থেকে আলাদা করা উচিত নয়, কারণ এমন কোনও পরিস্থিতি নেই যেখানে ফাঁকা ফাঁকা স্থান রয়েছে বা এর অভাব শব্দার্থগতভাবে তাত্পর্যপূর্ণ হবে এবং কিছু পাঠ্য ফাইলের ফর্ম্যাটগুলি নাও হতে পারে যে রেখাগুলি ফাঁকা নয় তা শেষ করতে পারে এমন লাইনগুলিকে আলাদা করতে?
সুপারক্যাট

@ সুপের্যাট: আমি একমত এটি সিগ এলএফ সিকোয়েন্সগুলি লাইন শেষ হিসাবে ইউনিক্স সিস্টেমে সংকলন ত্রুটির কারণ হিসাবে ব্যবহার করে যা সিগ এলএফ সিকোয়েন্সগুলি ব্যবহার করে এমন লিগ্যাসি সিস্টেমগুলি থেকে আগত ফাইলগুলির ক্ষেত্রেও এটি আবৃত হবে যা \rপূর্বে একটি অন্তর্ভুক্ত থাকা পলিত নিউলাইনগুলিকে স্বীকৃতি দেয় না \n। তবুও এমন একটি মামলা রয়েছে যেখানে এটি পিছিয়ে যাবে: মন্তব্যগুলিতে space অক্ষরগুলি পরে থাকতে পারে সাদা স্থান, বিশেষত লাইন const char *path = "C:\\"; // the default path is C:\ 
প্যাস্টিং

স্ট্যান্ডার্ডটির প্রয়োজন হয় না যে টেক্সট ফাইলগুলি একটি লাইনের শেষে সাদা স্থানের অক্ষরগুলিকে সমর্থন করতে সক্ষম হয়। কোডটির The path is "C:\"অর্থ পেছনের নিউলাইনের উপর নির্ভর করার চেয়ে এই জাতীয় মন্তব্যটি লেখা ভাল বলে মনে হয়।
সুপারক্যাট

4
Teeeechnically, মানক ধরনের কোনো প্রয়োজন করে তোলে, কারণ অনেকবার-উপেক্ষিত অনুবাদ ফেজ 1 প্রতিটি লাইন থেকে ফাঁকা ফাঁকা ফেলা অনুমোদিত ।
zwol

4
এই উত্তরটি দীর্ঘ পথ পাড়ি দেয়, কেবল প্রমাণ করার জন্য যে কোনও বোকা প্রশ্ন নেই। সাবাশ.
ওভারব্রিড

65

অলৌকিক দৃষ্টিকোণ থেকে, একটি মন্তব্য হোয়াইটস্পেসের সমান।

লিক্সিক উপাদানগুলির বিষয়ে সি স্ট্যান্ডার্ডের 6.4 Section অনুচ্ছেদে বলা হয়েছে:

... প্রাক প্রসেসিং টোকেনগুলি সাদা স্থান দ্বারা পৃথক করা যায় ; এটিতে মন্তব্যগুলি (পরে বর্ণিত) বা সাদা-স্থানের অক্ষর (স্পেস, অনুভূমিক ট্যাব, নতুন লাইন, উল্লম্ব ট্যাব এবং ফর্ম-ফিড) বা উভয়ই রয়েছে। ...

আরও নির্দিষ্টভাবে, একটি মন্তব্য একটি একক জায়গায় অনুবাদ করা হয়। এটি বিভাগ 5.1.1.2p3 এ নির্দিষ্ট করা হয়েছে:

উত্স ফাইলটি প্রাক-প্রসেসিং টোকেন এবং শ্বেত-স্থানের অক্ষরের ক্রম (মন্তব্য সহ )গুলিতে বিভক্ত। একটি উত্স ফাইল আংশিক প্রাকপ্রসেসিং টোকেন বা আংশিক মন্তব্যে শেষ হবে না। প্রতিটি মন্তব্য একটি স্থান অক্ষর দ্বারা প্রতিস্থাপিত হয়। নতুন-লাইন অক্ষরগুলি ধরে রাখা হয়। নতুন-রেখা ব্যতীত সাদা-স্পেস অক্ষরের প্রতিটি নোম্পটি ক্রমটি কোনও স্থান অক্ষর দ্বারা বজায় রাখা বা প্রতিস্থাপন করা হয় তা বাস্তবায়ন-সংজ্ঞায়িত।

এটি উদাহরণস্বরূপ, আপনি যদি প্রিপ্রসেসরের মাধ্যমে আপনার কোডটি পাস করেন তবে আপনি পাবেন:

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

  }

তাই সাদা অংশের মত মন্তব্যগুলিও আলাদা টোকেন পরিবেশন করে।

এর অর্থ কোডটিতে 14 টি টোকেন থাকবে, 13 নয়।



12

অনুবাদ দেখুন (ওরফে সংকলন) পর্যায় 3 , পদক্ষেপ 2: "প্রতিটি মন্তব্য একটি স্থানের অক্ষর দ্বারা প্রতিস্থাপিত হয়"

সুতরাং, ধারণাগতভাবে, এই মুহূর্তে i/*nt*/aহয়ে ওঠে i a


মন্তব্যগুলি বর্ধিত আলোচনার জন্য নয়; এই কথোপকথন চ্যাটে সরানো হয়েছে ।
Machavity

1

শুধু আপনার কোড টুকরা কি তা পরীক্ষা করে দেখুন

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

প্রিপ্রোসেসিংয়ের পরে থাকবে। আপনার সংকলকটিতে কেবল "-E" পতাকা যুক্ত করুন, gcc -E myscript.c এবং আপনি ফলাফল পাবেন:

e.sharaborin@landau:~$ gcc -E myscript.c
# 1 "myscript.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 31 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 32 "<command-line>" 2
# 1 "myscript.c"
int main()
{
    int i a = 10;
    return 0;
}

এবং স্পষ্টতই, আপনি সিদ্ধান্ত নিতে পারেন যে একটি ভুল আছে।


-9

হ্যাঁ আপনি এটি করতে পারেন। মন্তব্যগুলি সংকলক দ্বারা এড়ানো হবে। তারা পরিবর্তনশীল প্রভাবিত করবে না। এটি একই হবে কেবল মন্তব্য ট্যাগ শেষ করতে ভুলবেন না।


4
"পরিবর্তনশীলকে প্রভাবিত করবে না। এটি একই হবে" কি হিসাবে একই, i aবা ia?
হলিব্ল্যাকট্যাগ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.