নিজের কোঁকড়ানো ধনুর্বন্ধনী ভিতরে লুপ জন্য


117

আমি এই লুপ লেআউট জুড়ে এসেছি:

#include <iostream>
int main()
{
    {
        for (int i = 0; i != 10; ++i)
        {
            std::cout << "delete i->second;" << std::endl;
        }
    }

    {
        for (size_t i = 0; i < 20; ++i)
        {
            std::cout << "delete m_indices[i];" << std::endl;
        }
    }
    return 0;
}

আমি ভাবছিলাম এই ধনুবর্ণের এই অতিরিক্ত স্তরটি কীসের জন্য? এটি আমাদের কোড বেসে কয়েকবার উপস্থিত হয়।


47
আপনার পোস্ট করা কোড স্নিপেটে তারা সম্পূর্ণরূপে অনাবশ্যক
এডচুম

25
এই কোডটি দিয়ে কি সংকলক ব্যবহার করা হয়েছে? বিশেষত ভিএস 6 ব্যবহার করা হয়নি?
ইউ কে মুনকি

5
@ এডনারম্যান এখন আপনার সম্পাদনাটি এটি আরও স্পষ্ট। দেখে মনে হচ্ছে সঠিক উত্তরটি ইউকেমনকি সরবরাহ করেছেন। আধুনিক সি ++ কম্পাইলারের সাহায্যে আপনি কোঁকড়ানো ধনুর্বন্ধনীকে সহজেই ফেলে দিতে পারেন।
জ্যাবারওয়াকি

8
বিকল্পভাবে, এটি কোড উত্পন্ন করা যেতে পারে (যে কেউ
রেপসোডির

4
এর একটি সম্ভাব্য কারণ হ'ল কোডটি যদি একবার (বা ভবিষ্যতে ধারণের উদ্দেশ্যে থাকে) ওপেনএমপি সমান্তরাল নির্দেশনা থাকে।
জামেস্কেফ

উত্তর:


286

একসময়, অনেক চাঁদ আগে, ভিএস 6 বিদ্যমান ছিল এবং জনপ্রিয় ছিল। এটি বেশ কয়েকটি সি ++ স্ট্যান্ডার্ডের সাথে সামঞ্জস্য করতে ব্যর্থ হয়েছে; এটি যুক্তিযুক্ত ছিল যেহেতু এটি প্রকাশিত হওয়ার ঠিক আগে (একই বছর) মানটি সরকারীভাবে প্রকাশিত হয়েছিল; এটি যতক্ষণ না আমি সচেতন ততই স্ট্যান্ডার্ডের খসড়াটি মেনে চলেন।

খসড়া এবং অফিসিয়াল স্ট্যান্ডার্ডের মধ্যে যে স্ট্যান্ডার্ডগুলি পরিবর্তিত হয়েছিল, তার মধ্যে একটি হ'ল প্রথম বিভাগে তৈরি লুপ ভেরিয়েবলের জীবনকাল; নিম্নলিখিত কোডটি সংকলন করতে ব্যর্থ হয়েছে leading

{
    for (int i=0; i<1; ++i){}
    for (int i=0; i<2; ++i){}
}

কারণ iলুপের জন্য দ্বিতীয়টির দ্বারা নতুন সংজ্ঞা দেওয়া হয়েছিল।

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

এর একটি সমাধান হ'ল সম্পূর্ণরূপে লুপের জন্য নিজের স্কোপে জোর করে দেওয়া যেমন আপনি দেখিয়েছেন।


49
@ বলোভকে দেখতে ভিএস 6 খুঁজে পাওয়ার দরকার নেই, ভিএস2015-এ "ফোনের লুপ স্কোপ ইন ইন ফোর্স কনফরমেশন" সেট করুন এবং উপভোগ করুন ;-)
আলেন

5
@ আলাইন "বিকল্প 'জেডিসি: ফরস্কোপ-' অবচিত করা হয়েছে এবং ভবিষ্যতে প্রকাশে অপসারণ করা হবে" এবং কোনও সমস্যা ছাড়াই সংকলন করেছে ... আমি দুঃখিত
বলভ

7
সংস্করণ ২.7 এর পূর্বে জিসিসিও এই আচরণটি প্রদর্শন করেছিল। Docs.freebsd.org/info/g++ FAQ
জেরেমি

5
@ দামন এটি ছিল না যখন ভিএস 6 প্রথম প্রকাশ হয়েছিল; তবে যখন মানগুলি পরিবর্তিত হয়েছিল, তখন তাদের সাথে মানানসই একটি আপডেট কখনই প্রকাশিত হয়নি। মান পরিবর্তন করার পরে ভিএস 6 বেশ কয়েক বছর ধরে জনপ্রিয় ছিল।
ইউ কে মুনকি

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

15

{এবং }একটি সুযোগ তৈরি করবে এবং যদি আপনি সুযোগের কিছু ভেরিয়েবল সংজ্ঞায়িত করেন তবে আপনি সেগুলি বাইরে থেকে অ্যাক্সেস করতে পারবেন না। তবে forইতিমধ্যে সেই সুযোগ তৈরি করুন। সুতরাং

{for(int i = 0; i < count; ++i){}} 

হিসাবে একই

for(int i = 0; i < count; ++i){}

আপনি যদি তাদের মধ্যে কিছু সংজ্ঞায়িত করেন তবে একটি পার্থক্য রয়েছে

{int a = 0; for(int i = 0; i < count; ++i){}}

এই উদাহরণে aবাইরের সুযোগ থেকে অ্যাক্সেসযোগ্য হবে না।


2

আপনার বিশেষ উদাহরণে তাদের কোনও কারণ নেই।

কখনও কখনও আপনি একটি ভেরিয়েবলের জন্য একটি সুযোগ তৈরি করতে চাইতে পারেন:

float average;
// ...

{
int sum = 0;
for (int i = 0; i < count; ++i)
{
   sum += v[i];
}
average = (float)sum / count;
}

// use average
// sum not in scope here

তবে আমি এটি একটি অ্যান্টি-প্যাটার্ন দেখছি। সাধারণত যদি আপনি নিজেকে এটি করার প্রয়োজনের সন্ধান করেন তবে সম্ভবত forএটির নিজস্ব কাজটি হওয়া উচিত।


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

2

এটি বন্ধনী দ্বারা চিহ্নিত একটি ব্লক স্কোপ{} । এটি সাধারণত স্বয়ংক্রিয় স্টোরেজের ক্ষেত্র চিহ্নিত করতে ব্যবহৃত হয় । আপনার ক্ষেত্রে এটি কিছু করার জন্য বলে মনে হচ্ছে না কারণ স্ট্যান্ডার্ড সি ++ এ লুপটির নিজস্ব সুযোগ রয়েছে।

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