int a [] = {1,2,}; অদ্ভুত কমা অনুমোদিত। কোন বিশেষ কারণ?


334

হতে পারে আমি এই গ্রহ থেকে নই, তবে আমার কাছে মনে হবে যে নিম্নলিখিতটি একটি সিনট্যাক্স ত্রুটি হওয়া উচিত:

int a[] = {1,2,}; //extra comma in the end

কিন্তু এটা না. আমি যখন এই কোড ভিসুয়াল স্টুডিও উপর কম্পাইল বিস্মিত, কিন্তু আমি যতদূর সি ++ নিয়ম উদ্বিগ্ন, তাই আমি মান পরীক্ষিত এবং এটি MSVC কম্পাইলার বিশ্বাস করতে না শিখেছে হয় মান দ্বারা হিসাবে ভাল অনুমোদিত। ব্যাকরণ নিয়মের জন্য আপনি 8.5.1 দেখতে পাবেন যদি আপনি আমাকে বিশ্বাস না করেন।

এখানে চিত্র বর্ণনা লিখুন

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

সুতরাং, আবারও, এই অনর্থক কমাটি স্পষ্টভাবে অনুমোদিত হওয়ার কোনও বিশেষ কারণ আছে ?


10
কিন্তু হয় - প্রতি এক 'নতুন লাইন যোগ কর্মের' থেকে সম্মত হবে বলে মনে হয় মানুষ ভাষা স্পেসিফিকেশনের এই ধরনের জিনিস সম্পর্কে সত্যিই বিরক্ত সংজ্ঞা? যদি তারা সত্যই বুঝতে পারে তবে তারা কেন তার অনুপস্থিতিকে অগ্রাহ্য করবে না ;যখন এটি স্পষ্ট হবে পরবর্তী টোকেনটি আসলে একটি পরবর্তী বিবৃতি।
তথাপি অন্য ব্যবহারকারীরা

35
@ ইয়িটঅনথর ইউজার: হ্যাঁ, ভাষা ডিজাইনাররা এ জাতীয় বিষয় বিবেচনা করে। আপনাকে সেমিকোলনগুলি ফেলে দেওয়ার ফলে অনেক বড় প্রভাব পড়বে এবং ভাষার বেশিরভাগ অংশে এটি দ্ব্যর্থক অস্পষ্ট হবে (মনে রাখবেন, হোয়াইটস্পেস সিতে শব্দার্থক নয়)। অতিরিক্ত কমা হ'ল এই ক্ষেত্রে অস্পষ্ট নয়। একটি অতিরিক্ত অর্ধবৃত্ত প্রায় অস্পষ্ট নয়, এবং পাশাপাশি অনুমতি দেওয়া হয়। ক্ষেত্রে যেখানে এটি অস্পষ্ট ( for()উদাহরণস্বরূপ), এটি সংযোজনকারী সংকেত ছুঁড়ে দেয়।
রব নেপিয়ার

5
@ তোমালাক: এটি একটি মানব পাঠকের কাছে অস্পষ্ট এবং এটি প্রায়শই একটি ভুল। যে কারণে এটি একটি সতর্কতা ছুড়ে দেয়। একইভাবে if (x = 1)ব্যাকরণে অস্পষ্ট নয়, তবে এটি মানুষের কাছে অত্যন্ত অস্পষ্ট, এবং এইভাবে একটি সতর্কতা নিক্ষেপ করে।
রব নেপিয়ার

12
@ রব: আপনার ifউদাহরণটি অস্পষ্ট নয়। আমি মনে করি না "অস্পষ্ট" এর অর্থ আপনি যা ভাবেন তার অর্থ কি!
অরবিটে

5
যতক্ষণ আমরা সম্মত হই যে এটি আমাদের রক্ষা করার জন্য সংকলকটির পক্ষে দরকারী কিছু, তবে অ্যারে ঘোষণায় একটি ট্রেলিং কমা আমাদের থেকে রক্ষা করার জন্য সংকলকটির পক্ষে দরকারী কিছু নয়।
রব নেপিয়ার

উত্তর:


435

এটি সোর্স কোড উত্পন্ন করা সহজ করে এবং কোড লেখার জন্য সহজ করে তোলে যা পরে কোনও তারিখে সহজেই বাড়ানো যেতে পারে। এতে অতিরিক্ত এন্ট্রি যুক্ত করার জন্য কী প্রয়োজন তা বিবেচনা করুন:

int a[] = {
   1,
   2,
   3
};

... আপনাকে বিদ্যমান লাইনে কমা যোগ করতে হবে এবং একটি নতুন লাইন যুক্ত করতে হবে। সেই ক্ষেত্রে এর সাথে তুলনা করুন যেখানে তিনটির ইতিমধ্যে কমা রয়েছে, যেখানে আপনাকে কেবল একটি লাইন যুক্ত করতে হবে। তেমনিভাবে যদি আপনি কোনও লাইন মুছে ফেলতে চান তবে এটি শেষ লাইন কিনা তা নিয়ে চিন্তা না করেই আপনি এটি করতে পারেন এবং কমা নিয়ে কোনও বিব্রত না করে আপনি লাইনগুলি পুনরায় অর্ডার করতে পারেন। মূলত এর অর্থ হ'ল আপনি কীভাবে লাইনগুলি ব্যবহার করেন তার মধ্যে একটি অভিন্নতা রয়েছে।

এখন কোড উত্পন্ন করার বিষয়ে চিন্তা করুন। এর মতো কিছু (সিউডো কোড):

output("int a[] = {");
for (int i = 0; i < items.length; i++) {
    output("%s, ", items[i]);
}
output("};");

আপনি যে বর্তমান আইটেমটি লিখেছেন তা প্রথম বা শেষটি কিনা তা নিয়ে চিন্তা করার দরকার নেই। অনেক সহজ।


89
এছাড়াও, একটি ভিসিএস ব্যবহার করার সময়, দুটি সংস্করণগুলির মধ্যে "ডিফ" পরিষ্কার হয় কারণ কোনও আইটেম যুক্ত করা বা অপসারণ করা হলে কেবল একটি লাইন পরিবর্তন হয়।
কেভিন পানকো

47
@ নস্টার: "দুর্ভাগ্যজনক" কেন? এখানে খারাপ কি? কেবলমাত্র ভাষার এক ক্ষুদ্র অংশের জন্য কোড উত্পন্নকরণ (এবং সহজ ম্যানিপুলেশন) কে কিছু বিবেচনা দেওয়া হয়েছে তার অর্থ এই নয় যে এটি ভাষার সমস্ত সিদ্ধান্তের পিছনে প্রাথমিক অনুপ্রেরণা হতে পারে। টাইপ অনুমান, আধা-কলোন অপসারণ ইত্যাদির ভাষার জন্য বিশাল প্রভাব রয়েছে। আপনি এখানে একটি মিথ্যা দ্বৈতত্ত্ব স্থাপন করছেন, আইএমও।
জন স্কিটি

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

8
@ মিছরিফ: এটি টাইপ রেটের বিষয় নয় - আইটেমগুলি অনুলিপি করা, অপসারণ বা পুনরায় অর্ডার করার সময় এটি সরলতার বিষয়। এটি গতকাল আমার জীবনকে আরও সহজ করে তুলেছে। কোনও খারাপ দিক না থাকলে জীবনকে সহজ করে তোলেন না কেন ? এমএসের দিকে আঙুল তুলে দেখানোর চেষ্টা করার মতো, আমি দৃ strongly়ভাবে সন্দেহ করি যে এটি মাইক্রোসফ্টের অস্তিত্বের আগে থেকেই সিতে ছিল ... আপনি বলে যে এই ন্যায্যতাটিকে অদ্ভুত বলে মনে হচ্ছে, তবে আমি বাজি ধরেছি যে এটি প্রতিটি একদিনে কয়েক হাজার সংখ্যক বিকাশকারীকে উপকৃত করে। সংকলক লেখকদের উপকারের জন্য এমন কিছুর সন্ধান করার চেয়ে কি এটি আরও ভাল ব্যাখ্যা নয়?
জন স্কিটে


126

আপনি যদি এমন কিছু করেন তবে এটি কার্যকর useful

int a[] = {
  1,
  2,
  3, //You can delete this line and it's still valid
};

6
জাভাস্ক্রিপ্ট এই বাক্য গঠনটিকে সমর্থন করে: var a = [1, 2,];তাই আমি জানি বেশিরভাগ অন্যান্য ভাষাও ... অ্যাকশনস্ক্রিপ্ট, পাইথন, পিএইচপি।
শান ফুজিওয়ারা

14
@ সান এটি আই জাভা স্ক্রিপ্টে একটি পার্স ত্রুটি ঘটাবে, তাই সাবধান!
স্কিলড্রিক

10
আইই 9 তে এটি আমার জন্য নয়। তবে এটি অদ্ভুত কিছু করে ... এটি একটি নাল উপাদান তৈরি করে। আমি সাবধান থাকব।
শান ফুজিওয়ারা

5
@Sean দুঃখিত, আপনি সঠিক করছি - এটা আইই একটি বিশ্লেষণ ত্রুটি নয়, কিন্তু এটি হবে একটি অতিরিক্ত উপাদান সেট সন্নিবেশ undefined
স্কিলড্রিক

3
সবচেয়ে হতাশাজনকভাবে, JSON এই বাক্য গঠনটিকে সমর্থন করে না।
টিম্ম্ম

38

বিকাশকারীর জন্য ব্যবহারের সহজতা, আমি ভাবব।

int a[] = {
            1,
            2,
            2,
            2,
            2,
            2, /*line I could comment out easily without having to remove the previous comma*/
          }

অতিরিক্তভাবে, যদি কোনও কারণে আপনার কাছে এমন একটি সরঞ্জাম ছিল যা আপনার জন্য কোড তৈরি করে; সরঞ্জামটি আরম্ভের শেষ আইটেম কিনা তা নিয়ে কোনও চিন্তা করার দরকার নেই।


32

আমি সবসময় ধরে নিয়েছি অতিরিক্ত উপাদান যুক্ত করা সহজ করে তোলে:

int a[] = {
            5,
            6,
          };

কেবল হয়ে যায়:

int a[] = { 
            5,
            6,
            7,
          };

পরবর্তী তারিখে


3
আমি মনে করি না সম্পাদনাটি সামান্য দ্রুত করা সিনট্যাক্সকে বিশৃঙ্খলার জন্য একটি ভাল কারণ। আইএমএইচএও এটি কেবল অন্য একটি অদ্ভুত সি ++ বৈশিষ্ট্য।
জর্জিও

3
@ জর্জিও: আচ্ছা, এটি সি থেকে উত্তরাধিকারসূত্রে পাওয়া গেছে এটি সম্পূর্ণরূপে সম্ভব যে এটি মূল ভাষার স্পেসিফিকেশনের কেবলমাত্র একটি তদারকি, এটির একটি কার্যকর পার্শ্ব-প্রতিক্রিয়া দেখা দেয় happens
অলিভার চার্লসওয়ার্থ

ঠিক আছে, আমি জানতাম না যে এটি সি থেকে আসে I এটি যদিও এক ধরণের অদ্ভুত বোধ করে: আমার অন্তর্নিহিতের মধ্যে কমাটি বিভাজক নয়, টার্মিনেটর। তদতিরিক্ত, শেষ কমা বাদ দেওয়া সম্ভব। সুতরাং, এটি কি টার্মিনেটর, বিভাজনকারী বা উভয়ই? তবে ঠিক আছে, এই বৈশিষ্ট্যটি উপলব্ধ এবং এটি জেনে রাখা ভাল।
জর্জিও

11
@ জর্জিও - উত্স কোডটি মেশিন নয় মানুষের জন্য is আমাদের সরল স্থানান্তর ত্রুটি করা থেকে বিরত রাখার মতো ছোট ছোট জিনিসগুলি একটি আশীর্বাদ, তদারকি নয়। রেফারেন্সের জন্য, এটি এইভাবে পিএইচপি এবং ইসকামাস্ক্রিপ্টে (এবং তাই জাভাস্ক্রিপ্ট এবং অ্যাকশনস্ক্রিপ্ট) এও কাজ করে, যদিও এটি জাভাস্ক্রিপ্ট অবজেক্ট নোটেশন (জেএসএন) এ অবৈধ (যেমন [1,2,3,]ঠিক আছে তবে {a:1, b:2, c:3,}তা নয়)।

1
@ গ্রোকি: আমি এ সম্পর্কে যত বেশি চিন্তা করি ততই আমি নিশ্চিত যে একটি প্রোগ্রামিং ভাষার বাক্য গঠনটি যথাসম্ভব সহজ এবং সামঞ্জস্যপূর্ণ হওয়া উচিত এবং যতটা সম্ভব ব্যতিক্রম সহ: এটি ভাষা শিখতে সহজ করে তোলে (মনে রাখার জন্য কম বিধি) )। তালিকাতে / থেকে কোনও আইটেম যুক্ত / সরানোর সময় এক বা দুটি কী-স্ট্রোক সংরক্ষণের সুবিধা (যা আমি কোডিংয়ে ব্যয় করা মোট সময়ের তুলনায় প্রায়শই করি না) তুলনায় আমার তুলনায় তুচ্ছ মনে হয় একটি পরিষ্কারভাবে সংজ্ঞায়িত বাক্য গঠন আছে।
জর্জিও

21

যোগ / অপসারণ / উত্পাদনের লাইনগুলি সহজ করার বিষয়ে প্রত্যেকে যা কিছু বলছে তা সঠিক, তবে উত্স ফাইলগুলি একত্রে মার্জ করার সময় এই সিনট্যাক্সটি যে আসল জায়গাটি জ্বলজ্বল করছে। ভাবুন আপনি এই অ্যারে পেয়েছেন:

int ints[] = {
    3,
    9
};

এবং ধরে নিন যে আপনি এই কোডটিকে একটি ভান্ডার হিসাবে পরীক্ষা করেছেন।

তারপরে আপনার বন্ধুটি এটিকে সম্পাদনা করে শেষ পর্যন্ত যুক্ত করে:

int ints[] = {
    3,
    9,
    12
};

এবং আপনি একই সাথে এটি সম্পাদনা করুন, শুরুতে যুক্ত করুন:

int ints[] = {
    1,
    3,
    9
};

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

সুতরাং, আমার থাম্বের নিয়মটি হ'ল: তালিকাটি যদি একাধিক লাইন বিস্তৃত করে, তবে পিছনে কমা ব্যবহার করুন, যদি তালিকাটি একটি লাইনে থাকে তবে এটি ব্যবহার করবেন না।


15

পিছনে সামঞ্জস্যের কারণেই আমি বিশ্বাস করি ট্রেলিং কমা। প্রচুর বিদ্যমান কোড রয়েছে, প্রাথমিকভাবে স্বয়ংক্রিয়ভাবে উত্পন্ন, যা একটি পিছনে কমা রাখে। এটি শেষে বিশেষ শর্ত ছাড়াই একটি লুপ লেখা সহজ করে তোলে। যেমন

for_each(my_inits.begin(), my_inits.end(),
[](const std::string& value) { std::cout << value << ",\n"; });

প্রোগ্রামারটির পক্ষে আসলে কোনও সুবিধা নেই।

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


5
আমি সম্পূর্ণ অসম্মতি; [এটি আমার মতামত] এটি সি এর অনেক পরে তৈরি বহু ভাষায় তার পথ খুঁজে পেয়েছে কারণ প্রোগ্রামার পক্ষে অ্যারের সামগ্রীগুলি ঘুরিয়ে নিতে, লাইনে উইলি-নিলিতে মন্তব্য করতে সক্ষম হওয়ায় সুবিধাজনক is নিরীহ স্থানান্তর-প্রেরণামূলক সিনট্যাক্স ত্রুটি সম্পর্কে চিন্তা না করেই। আমরা ইতিমধ্যে যথেষ্ট চাপ না?

12
@ দেয়ারলেজ - একই যুক্তি অনুসারে, কেন কোনও কিছুকে (কেন কিছু) অনুমতি দেওয়া উচিত নয়, কীভাবে int a = b + c +;বা কীভাবে if(a && b &&);এটি সহজেই কোনও কিছু অনুলিপি-পেস্ট করা সহজ হবে এবং কোড জেনারেটর লিখতে আরও সহজ হবে। এই সমস্যাটি তুচ্ছ এবং বিষয়গত উভয়ই, এ জাতীয় ক্ষেত্রে কোড রিডারের পক্ষে সবচেয়ে ভাল যা করা সবসময় করা ভাল।
জিন বুশুয়েভ

1
@ জিন বুশুয়েভ: একদম ঠিক! লাইনের শেষে অপারেটরের সাথে আমার প্রায়শই + বা && এর সাথে দীর্ঘ প্রকাশ হয় এবং অবশ্যই আমি যখন এক্সপ্রেশনটির শেষ অপারেন্ডটি সরাতে চাই তখন আমাকে কিছুটা অতিরিক্ত সময় ব্যয় করতে হয়। আমি মনে করি এই কমা সিনট্যাক্সটি সত্যিই অদ্ভুত!
জর্জিও

2
@ জেনবুশুয়েভ - আমি তাদের সাথে একমত নই। অ্যারেতে কমা কমা করার অনুমতি দেওয়া এবং এটির মতো একটি বাগ-অপসারণ বৈশিষ্ট্য এবং প্রোগ্রামার হিসাবে আপনার জীবনকে সহজ করে তুলতে, আমি পঠনযোগ্যতার জন্য খাঁটি শর্ত থেকে (এবং &&) বিবৃতি, সংযোজন এবং অন্যান্য বিবিধ অপারেটর অপসারণের ব্যবস্থা গ্রহণ করব would বিবৃতি। এটি কেবল সরল কুশল, আইএমও।
সুন রাসমুসেন

2
&&অপারেটর সম্পর্কে , কখনও কখনও আমি শর্তযুক্ত করি if (true \n && b1 \n && b2)যাতে আমি প্রয়োজন হিসাবে লাইনগুলি যুক্ত করতে এবং সরাতে পারি।
খ্রিস্টান মান

12

যতদূর আমি জানি এটির অন্যতম কারণ হ'ল স্বয়ংক্রিয়ভাবে কোড উত্পন্ন করা সহজ হওয়া উচিত; শেষ উপাদানটির জন্য আপনার কোনও বিশেষ পরিচালনা করার দরকার নেই।


11

এটি কোড জেনারেটরগুলিকে তৈরি করে যা অ্যারে বা অঙ্কগুলি সহজতর করে।

কল্পনা করুন:

std::cout << "enum Items {\n";
for(Items::iterator i(items.begin()), j(items.end); i != j; ++i)
    std::cout << *i << ",\n";
std::cout << "};\n";

অর্থাৎ, পেছনের কমাটি থুতু এড়ানোর জন্য প্রথম বা শেষ আইটেমটির বিশেষ পরিচালনা করার দরকার নেই।

যদি কোড জেনারেটরটি পাইথনে লেখা থাকে, উদাহরণস্বরূপ, str.join()ফাংশনটি ব্যবহার করে পেছনের কমাটি থুতু দেওয়া এড়ানো সহজ :

print("enum Items {")
print(",\n".join(items))
print("}")

10

আমি এতক্ষণ পরেও আশ্চর্য হয়েছি যে কেউ এনোটেটেড সি ++ রেফারেন্স ম্যানুয়াল ( এআরএম ) উদ্ধৃত করেনি , এটি আমার উপর জোর দিয়ে [dcl.init] সম্পর্কে নিম্নরূপ বলেছে :

প্রারম্ভিককরণের জন্য স্পষ্টতই অনেকগুলি স্বরলিপি রয়েছে, তবে প্রতিটিগুলি একটি নির্দিষ্ট শৈলীর ব্যবহার ভাল করে দেখায় বলে মনে হয়। = {Initializer_list, অপ্ট} স্বরলিপি C থেকে উত্তরাধিকার সুত্রে প্রাপ্ত হয় এবং ডাটা স্ট্রাকচার এবং অ্যারে আরম্ভের জন্য ভাল কাজ করে। [...]

যদিও ব্যাকরণটি বিবর্তিত হয়েছে যখন থেকে এআরএম লেখা হয়েছিল মূল অবশেষ।

এবং আমরা সি 99 এর যুক্তিতে যেতে পারি এটি কেন সিটিতে অনুমোদিত হয়েছিল এবং এটি বলে:

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


1
সাহিত্যের দ্বারা সর্বাধিক ব্যাক আপ আপ উত্তর এবং এই বৈশিষ্ট্যের সত্যিকারের উত্সের জন্য উত্সাহ দিন।
মার্কো

10

আমি এমন একটি ব্যবহারের কেস দেখছি যা অন্য উত্তরে উল্লেখ করা হয়নি, আমাদের প্রিয় ম্যাক্রো:

int a [] = {
#ifdef A
    1, //this can be last if B and C is undefined
#endif
#ifdef B
    2,
#endif
#ifdef C
    3,
#endif
};

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


7

এটি কেবলমাত্র যেখানে ভাষা - অনুশীলনে * - জাভাস্ক্রিপ্ট অনুমোদিত নয় এবং এটি অগণিত পরিমাণে সমস্যা সৃষ্টি করে। উদাহরণস্বরূপ, আপনি যদি অ্যারের মাঝামাঝি থেকে কোনও লাইন অনুলিপি করে আটকান, শেষে এটি পেস্ট করুন এবং কমা অপসারণ করতে ভুলে গেছেন তবে আপনার সাইটটি আপনার IE দর্শকদের জন্য সম্পূর্ণরূপে নষ্ট হয়ে যাবে।

* তত্ত্বে এটি অনুমোদিত তবে ইন্টারনেট এক্সপ্লোরার মানটিকে অনুসরণ করে না এবং এটিকে একটি ত্রুটি হিসাবে গণ্য করে


জাভাস্ক্রিপ্টের "অ্যারে" (যা কেবলমাত্র একটি যাদুকরী দৈর্ঘ্যের সম্পত্তি সহ বস্তু) যাইহোক বরং অস্বাভাবিক: var x = [,,,]বৈধ (আই আই 9 ব্যতীত, তবে অনুমানটি এটি আইনী বলে)
পিটার সি

ECMAScript স্পেসিফিকেশন অনুসারে, এটি পুরোপুরি বৈধ; তত্ত্ব অনুসারে এটি যে কোনও ব্রাউজারে কাজ করা উচিত যা বর্ণিত স্পেসিফিকেশন অনুযায়ী জাভাস্ক্রিপ্ট প্রয়োগ করে, বিশেষত এখানে প্রাপ্ত স্পেসিফিকেশনের অংশটি

1
দুর্ভাগ্যক্রমে জাভাস্ক্রিপ্ট সর্বসাধারণের জন্য অ্যাপ তৈরি করা। সুতরাং না, যখন 50% ব্যবহারকারীদের আপনার অ্যাপ্লিকেশনটি ব্যবহার করতে সমস্যা হয় তখন এটি পুরোপুরি বৈধ নয়। এবং হ্যাঁ, আমি যদি আইই 9 কে নিষিদ্ধ করতে পারতাম - সেখানে কাজ করার জন্য কেবলমাত্র ভাল কোড তৈরি করতে খুব বেশি ঘন্টা ব্যয় করা হত ...
কেগ্রাডেক

@ ডিয়ার: হ্যাঁ, আমি আমার উত্তরে যতটা বলেছি =)
টমাস বোনিিনি

@ ডিয়ারলিজেড মাইক্রোসফ্টস নিজস্ব বৈশিষ্ট্য আবিষ্কার করেছে এবং আদেশ দেয় যে অন্যরা অন্তত মানসিকতার পরিবর্তন ঘটছে (godশ্বরের ধন্যবাদ)
ক্রিস ম্যাকগ্রা

7

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

সি ধরে নিচ্ছি, আপনি কি নিম্নলিখিত লিখবেন?

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

int main(void)
{
    puts("Line 1");
    puts("Line 2");
    puts("Line 3");

    return EXIT_SUCCESS
}

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

আপনি বহিরাগত কোডের সেমিকোলনগুলিকে কোডের বহিরাগত ব্লকগুলি বাদ দিবেন না একই কারণে বহু লাইন সংগ্রহগুলিতে কমাগুলি বাদ দেবেন না। মানে, ভাষাটি অনুমতি দিলেও আপনি এটি করবেন না, তাই না? রাইট?


এমন ভাষা রয়েছে (যেমন পাস্কাল) যা এটির অনুমতি দেয়। অর্থাৎ আপনি এর মধ্যে নির্বাচন করতে হবে; টার্মিনেটর (সি) বা বিভাজক (পাস্কাল) হিসাবে। ',' এর জন্য একই। ',' একটি টার্মিনেটর হলে আমার পক্ষে ঠিক হবে তবে তারপরে then 1, 2, 3 a অবশ্যই একটি সিনট্যাক্স ত্রুটি হতে পারে।
জর্জিও

6

কারণ তুচ্ছ: লাইন যুক্ত / অপসারণের সহজতা।

নিম্নলিখিত কোডটি কল্পনা করুন:

int a[] = {
   1,
   2,
   //3, // - not needed any more
};

এখন, আপনি কখনও কখনও ট্রেইলিং কমা যুক্ত / সরিয়ে না রেখে তালিকায় আইটেমগুলি সহজেই যুক্ত / সরিয়ে ফেলতে পারেন।

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


6

এটি প্রতিটি লাইনকে একই ফর্ম অনুসরণ করতে দেয়। প্রথমত এটি নতুন সারি যুক্ত করা সহজ করে তোলে এবং একটি সংস্করণ নিয়ন্ত্রণ সিস্টেমটি পরিবর্তিত অর্থবহভাবে ট্র্যাক করে এবং এটি আপনাকে আরও সহজে কোডটি বিশ্লেষণ করতে দেয়। আমি প্রযুক্তিগত কারণ চিন্তা করতে পারি না।


5

দীর্ঘ তালিকাতে উপাদানগুলি সরানোর কারণে সৃষ্ট ভুল থেকে রক্ষা করার অনুমতি এটি রয়েছে।

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

#include <iostream>
#include <string>
#include <cstddef>
#define ARRAY_SIZE(array) (sizeof(array) / sizeof *(array))
int main() {
    std::string messages[] = {
        "Stack Overflow",
        "Super User",
        "Server Fault"
    };
    size_t i;
    for (i = 0; i < ARRAY_SIZE(messages); i++) {
        std::cout << messages[i] << std::endl;
    }
}

এবং এটি দুর্দান্ত, কারণ এটি স্ট্যাক এক্সচেঞ্জ সাইটের মূল ট্রিলজি দেখায়।

Stack Overflow
Super User
Server Fault

তবে এটির সাথে একটি সমস্যা আছে। আপনি দেখুন, এই ওয়েবসাইটের পাদলেখ সুপার ব্যবহারকারীর আগে সার্ভার ফল্ট দেখায়। কারও নজরে আসার আগে এটি ভাল করা।

#include <iostream>
#include <string>
#include <cstddef>
#define ARRAY_SIZE(array) (sizeof(array) / sizeof *(array))
int main() {
    std::string messages[] = {
        "Stack Overflow",
        "Server Fault"
        "Super User",
    };
    size_t i;
    for (i = 0; i < ARRAY_SIZE(messages); i++) {
        std::cout << messages[i] << std::endl;
    }
}

সর্বোপরি, চারপাশে চলমান লাইনগুলি এত কঠিন হতে পারে না, তা কি হতে পারে?

Stack Overflow
Server FaultSuper User

আমি জানি, "সার্ভার ফল্টসুপার ব্যবহারকারী" নামে কোনও ওয়েবসাইট নেই, তবে আমাদের সংকলক দাবি করে যে এটি বিদ্যমান। এখন, বিষয়টি হ'ল সিটির একটি স্ট্রিং কনটেনটেশন বৈশিষ্ট্য রয়েছে, যা আপনাকে দুটি ডাবল উদ্ধৃতিযুক্ত স্ট্রিং লিখতে এবং কিছুই ব্যবহার না করে তাদেরকে সংযুক্ত করতে দেয় (অনুরূপ ইস্যুটি পূর্ণসংখ্যার সাথেও ঘটতে পারে, কারণ চিহ্নটির -একাধিক অর্থ রয়েছে)।

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


4

অনেক কিছুর মতো, অ্যারে ইনিশিয়ালাইজারে ট্রেলিং কমা হ'ল সি ++ থেকে উত্তরাধিকারসূত্রে প্রাপ্ত জিনিসগুলির মধ্যে একটি (এবং চিরকাল সমর্থন করতে হবে)। "ডিপ সি সিক্রেটস" বইটিতে এখানে স্থাপন করা স্থানগুলির থেকে সম্পূর্ণ আলাদা একটি দৃশ্য উল্লেখ করা হয়েছে

এতে একাধিক "কমা প্যারাডক্স" সহ একটি উদাহরণ রয়েছে:

char *available_resources[] = {
"color monitor"           ,
"big disk"                ,
"Cray"                      /* whoa! no comma! */
"on-line drawing routines",
"mouse"                   ,
"keyboard"                ,
"power cables"            , /* and what's this extra comma? */
};

আমরা পড়ি:

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

... আমার কাছে এটি আরও অর্থবহ


2
মামলায় কমা বিরুদ্ধে নিষেধাজ্ঞা enumকিছুটা আকর্ষণীয়, যেহেতু এটি সেই ক্ষেত্রে যেখানে নিখোঁজ কমাটি স্বল্পতম দ্বিধা প্রকাশ করে। দেওয়া struct foo arr[] = {{1,2,3,4,5}, {3,4,5,6,7}, }; ভাষাটি নির্ধারণ করতে পারে এমন দুটি বুদ্ধিমান অর্থ রয়েছে: একটি দ্বি-উপাদান অ্যারে তৈরি করুন, বা একটি থ্রি-এলিমেন্ট অ্যারে তৈরি করুন যেখানে শেষ আইটেমটির ডিফল্ট মান রয়েছে। সি যদি পরবর্তী ব্যাখ্যা গ্রহণ করে, আমি enum foo {moe, larry, curly, };এই নীতির উপর নিষেধাজ্ঞা দেখতে পেতাম যে বিবৃতিটি লেখার কেবল একটি উপায় থাকতে হবে (কমা ছাড়া) তবে ...
সুপারক্যাট

1
... প্রদত্ত যে সি কোনও ক্ষেত্রে কমা উপেক্ষা করতে ইচ্ছুক যেখানে এটি যুক্তিসঙ্গতভাবে হতে পারে (তবে তা ছিল না) একটি উল্লেখযোগ্য অর্থ নির্ধারিত হয়েছিল (যা সেখানে এটি নিষিদ্ধ করার পক্ষে একটি শক্ত যুক্তি হতে পারে) এটি কৌতূহল যে এটি ইস্যু নয় 'টি মামলা যেখানে কমা একটি অর্থ নেই পারে ইচ্ছুক [এমনকি যদি এক ব্যাখ্যা enum foo {moe,,larry,curly,};মধ্যে একটি সংখ্যা কুঁদন যেমন moeএবং larryনা সাধারণভাবে ব্যাপার, এটা হবে কিনা চিহ্ন কমা প্রক্রিয়া হয়েছে বা উপেক্ষা করেছেন। কেবলমাত্র এটিই বিবেচনা করতে পারে যদি শেষ আইটেমটি তার ঘোষিত ধরণের সর্বোচ্চ মান হয় এবং ...
সুপারক্যাট

1
... কেবল এই বলেই পরিচালনা করা যেতে পারে যে শেষ নির্ধারিত গণনার মান অনুসরণ করে যে ওভারফ্লো হয় তা উপেক্ষা করা উচিত।
সুপারক্যাট

@ সুপের্যাট সি # এর মতো ভাষা রয়েছে, যেখানে ভাষার অগ্রগতি করার সময় অগ্রাধিকার নকশা গবেষণা আইডিই বৈশিষ্ট্য এবং সংহতকরণ বিবেচনা করা যায়। সি এই ভাষার একটি ছিল না (এবং হতে পারে না)।
নিকোস অথানাসিউ

এমনকি সি # এর মতো ভাষার সাথেও ডিজাইনের উদ্দেশ্য পরিবর্তন করার ফলে বেশ কয়েকটি মারাত্মক নকশার অসঙ্গতি দেখা দিয়েছে। উদাহরণস্বরূপ, ভাষা সাধারণ পদ্ধতি এবং অপারেটরগুলির জন্য কোনও ধরণের রিটার্ন-টাইপ ওভারলোডিংকে সমর্থন করা থেকে বিরত থাকে (যদিও অন্তর্নিহিত কাঠামো এটি সমর্থন করতে পারে) কারণ এটি একটি সহজ-সংকলন ভাষা থাকার লক্ষ্যটির বিপরীতে দেখা গিয়েছিল, তবে ল্যাম্বডা মূল্যায়নের মধ্যে টাইপ অনুমানের নিয়ম রয়েছে যার রেজোলিউশন এনপি-সম্পূর্ণ। নতুন পদ্ধতি / অপারেটর ওভারলোডিং বিধিগুলি যুক্ত করা বিদ্যমান
কোডগুলি

2

কোড উত্পন্নকরণ এবং সম্পাদন সহজতরকরণের পাশাপাশি, আপনি যদি কোনও পার্সার বাস্তবায়ন করতে চান তবে এই ধরণের ব্যাকরণটি সহজ এবং বাস্তবায়নের পক্ষে সহজ। সি # এই নিয়মটি বেশ কয়েকটি স্থানে অনুসরণ করে যেখানে একটি enumসংজ্ঞা অনুসারে আইটেমের মতো কমা-বিচ্ছিন্ন আইটেমের একটি তালিকা রয়েছে ।


1

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

#define LIST_BEGIN int a[] = {
#define LIST_ENTRY(x) x,
#define LIST_END };

ব্যবহার:

LIST_BEGIN
   LIST_ENTRY(1)
   LIST_ENTRY(2)
LIST_END

এটি একটি খুব সরলীকৃত উদাহরণ, তবে প্রায়শই এই প্যাটার্নটি ম্যাক্রো দ্বারা প্রেরণ, বার্তা, ইভেন্ট বা অনুবাদ মানচিত্র এবং টেবিলের মতো জিনিসগুলির জন্য ব্যবহৃত হয়। যদি শেষে কমা না দেওয়া হয় তবে আমাদের একটি বিশেষ প্রয়োজন:

#define LIST_LAST_ENTRY(x) x

এবং এটি ব্যবহার করা খুব বিশ্রী হবে।


0

যাতে দুটি ব্যক্তি যখন পৃথক শাখায় একটি তালিকায় একটি নতুন আইটেম যুক্ত করে, গিট পরিবর্তনগুলি যথাযথভাবে মার্জ করতে পারে, কারণ গিট একটি লাইন ভিত্তিতে কাজ করে।


-4

আপনি যদি নির্দিষ্ট দৈর্ঘ্য ব্যতীত কোনও অ্যারে ব্যবহার করেন, উপাচার্য ++ 6.0 স্বয়ংক্রিয়ভাবে এর দৈর্ঘ্যটি সনাক্ত করতে পারে, তাই আপনি যদি "int a [] = {1,2,};" ব্যবহার করেন তবে a এর দৈর্ঘ্য 3, তবে শেষের একটি হ্যাসন ' টি আরম্ভ করা হয়নি, আপনি "cout <ব্যবহার করতে পারেন


এটি কি ভিসি 6 এর জন্য কোনও বাগ যা মানের সাথে সঙ্গতিপূর্ণ নয়?
থমসন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.