C ++ 03 এ 'অটো' কীওয়ার্ডটি ব্যবহার করার কোনও কারণ আছে কি?


85

নোট করুন এই প্রশ্নটি মূলত ২০০৯ সালে পোস্ট করা হয়েছিল, সি ++ 11 অনুমোদনের আগে এবং মূলশব্দটির অর্থ autoহঠাৎ পরিবর্তিত হওয়ার আগে । প্রদত্ত উত্তরগুলি কেবলমাত্র সি ++ 03 এর সাথে সম্পর্কিত auto- এটি স্টোরেজ শ্রেণি নির্দিষ্ট করা - এবং সি ++ 11 এর অর্থ নয় auto- এটি স্বয়ংক্রিয় টাইপ ছাড় being আপনি কখন সি ++ 11 ব্যবহার করবেন সে সম্পর্কে পরামর্শ খুঁজছেন auto, এই প্রশ্নটি এই প্রশ্নের সাথে প্রাসঙ্গিক নয়।

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

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

উত্তর:


74

autoএকটি সংগ্রহস্থলের শ্রেণী সুনির্দিষ্টভাবে উল্লেখ করা হয়, static, registerএবং externখুব। আপনি কেবলমাত্র একটি ঘোষণায় এই চারটির একটি ব্যবহার করতে পারেন।

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

আমি এটি সি ++ এ ব্যবহার করার কোনও কারণ জানি না। পুরাতন সি সংস্করণগুলিতে অন্তর্ভুক্ত অন্তর্নিহিত নিয়ম রয়েছে, আপনি এটিকে এর মতো একটি চলক ঘোষণার জন্য ব্যবহার করতে পারেন:

int main(void) { auto i = 1; }

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

ব্লক স্কোপে কোনও স্টোরেজ-শ্রেণি-নির্দিষ্টকরণ ছাড়াই ঘোষিত বা ফাংশন প্যারামিটার হিসাবে ঘোষিত কোনও অবজেক্টের ডিফল্টরূপে স্বয়ংক্রিয় স্টোরেজ সময়কাল থাকে। [দ্রষ্টব্য: অতএব, অটো নির্দিষ্টকারী প্রায় সবসময় অপ্রয়োজনীয় এবং প্রায়শই ব্যবহৃত হয় না; অটো ব্যবহারের একটি হ'ল প্রকাশ-বিবৃতি (8.৮) থেকে স্পষ্ট করে একটি ঘোষণা-বিবৃতি আলাদা করতে হয়। - শেষ নোট]

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

int(a);

autoসি ++ 0 এক্স এর সাথে আগত নতুন অর্থ সহ, আমি কোডে সি ++ 03 এর অর্থ সহ এটি ব্যবহার করে নিরুৎসাহিত করব।



4
আমি কেবল এটিকে আমার সংকলক বলার উপায় হিসাবে স্বীকৃতি দিয়েছি আমি কোনও ফাংশন ফরোয়ার্ড-ডিক্লেয়ার করতে ভুলে গিয়েছি। এটি আমাকে বলবে যে আমার কোনও ক্রিয়াকলাপের ব্যবহার যেহেতু অন্তর্নিহিত ইন্টের কারণে এটি ঘোষিত হয়েছিল তার চেয়ে আলাদা ছিল।
কারসন মায়ার্স

29
সর্বোত্তম অংশটি হ'ল প্রোগ্রামাররা "ইনট" (তিনটি অক্ষর) লেখার হাত থেকে নিজেকে বাঁচানোর জন্য "অটো" (চারটি অক্ষর) লিখতেন।
ম্যাক্স লাইববার্ট

30
@ ম্যাক্স - আরে, অনেক লোক "ওয়ার্ল্ড ওয়াইড ওয়েব" এর সংক্ষেপণ হিসাবে "ডাবল-ইউ-ডাবল-ইউ-ডাবল-ইউ" বলে।
ড্যানিয়েল আর্উইকার

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

86

সি ++ এ, autoএর নতুন অর্থ রয়েছে: এটি আপনাকে একটি ভেরিয়েবলের ধরণটি স্বয়ংক্রিয়ভাবে কমিয়ে আনতে দেয়।

কেন এটি কখনও দরকারী? আসুন একটি প্রাথমিক উদাহরণ বিবেচনা করুন:

std::list<int> a;
// fill in a
for (auto it = a.begin(); it != a.end(); ++it) {
  // Do stuff here
}

autoধরনের কোনো ইটারেটরে সেখানে সৃষ্টি std::list<int>::iterator

এটি কিছু গুরুতর জটিল কোড পড়তে আরও সহজ করে তুলতে পারে।

আরেকটি উদাহরণ:

int x, y;
auto f = [&]{ x += y; };
f();
f();

সেখানে, autoএকটি ভেরিয়েবলে ল্যাম্বডা এক্সপ্রেশন সংরক্ষণ করার জন্য প্রয়োজনীয় প্রকারটি কর্তিত। উইকিপিডিয়ায় বিষয়টিতে ভাল কভারেজ রয়েছে


4
এটি নিশ্চিত না যে এটি অটোর দুর্দান্ত ব্যবহার। কোড পড়া সহজ হওয়া উচিত, লিখতে সহজ নয়!
ড্যানডান

38
আমি আপনার সম্পর্কে dunno কিন্তু আমি এটির পাঠক টাইপ স্প্যাম চেয়ে পড়া খুব সহজ মনে করি।
ওভারভি

17
এবং যদি কিছু রেজোন চিড় জন্য <<< তালিকা থেকে অন্য কোনও শ্রেণিতে ক্লাস পরিবর্তন করার সিদ্ধান্ত নেয়, আপনাকে প্রতিটি পুনরুক্তি সংক্রান্ত ঘোষণার জন্য অনুসন্ধান করতে হবে এবং এটি পরিবর্তন করতে হবে না।
রোস্লাভ

4
@ কারাটস্নোম্যাচাইন: আপনি যদি কনস্ট চাইতেন, আপনি "অটো" এর পরিবর্তে "কনস্ট অটো" ব্যবহার করবেন।
দার্থ হ্যাফফেস

4
@ সার্থক const auto it = a.begin();আপনাকে কন্সট দেবে iterator, একটি নয় const_iterator। আপনি এখনও উপাদান পরিবর্তন করতে পারেন, তবে ++itসংকলন করতে ব্যর্থ হবে। একটি পেতে const_iterator, আপনি ব্যবহার করবেনauto it = a.cbegin();
ফ্রেডওভারফ্লো

35

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

এটির C ++ 0x এ একেবারে নতুন অর্থ রয়েছে। এটি আপনাকে কতটা অকেজো বলে কিছু ধারণা দেয়!


4
ওহ মানুষ, এটি কি কখনও অকেজো? যদিও আমি নতুন অর্থ পছন্দ করি। এটি কিছু কোডকে অনেক কম ভার্বোস এবং অনর্থক করে তোলে।
কারসন মায়ার্স

হ্যাঁ, সি # তে সমতুল্য ব্যবহার করা সম্ভবত এটি একটি বিশাল পার্থক্য তৈরি করবে। আরও তাই সি ++ এ আপনি যদি প্রকাশের টেম্পলেট ব্যবহার করেন যেখানে প্রকারগুলি এত জটিল যে সেগুলি কখনও হাতে হাতে লেখার ইচ্ছা ছিল না।
ড্যানিয়েল আর্উইকার

7

জিসিসির autoনেস্টেড ফাংশনগুলির জন্য বিশেষ ব্যবহার রয়েছে - এখানে দেখুন

এর সংজ্ঞা দেওয়ার আগে যদি আপনি কল করতে চান এমন নেস্টিং ফাংশন থাকে তবে আপনাকে এটির সাথে এটি ঘোষণা করতে হবে auto


এটি একটি দুর্দান্ত, যদিও সংকলক নির্ভর, স্বয়ংক্রিয়ার বাস্তবায়ন। গবেষণার জন্য ধন্যবাদ :)
কারসন মায়ার্স

3

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


4
হুবহু নয় - আপনি যদি এটি "রেজিস্টার" দিয়ে ঘোষণা করেন, সংকলকগণ আপনাকে ভেরিয়েবলের অ্যাড্রেস-অফ অপারেটর (& foo) ব্যবহার করতে দেয় না কারণ ভাল, এটি মেমরির কোথাও নেই (এবং এর কোনও ঠিকানা নেই)।
টিম

3

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

auto unsigned int auiStack[1];   //variable must be on stack

এবং তারপরে আমি ভেরিয়েবলের বাইরে প্রবেশ করি:

#define OFFSET_TO_RETURN_ADDRESS 8     //depends on compiler operation and current automatics
auiStack[OFFSET_TO_RETURN_ADDRESS] = alternate_return_address;

সুতরাং autoকীওয়ার্ডটি উদ্দেশ্যটি ডকুমেন্ট করতে সহায়তা করে।


4
আমি ধরে নিই এটি কেবলমাত্র অভিপ্রায় সংকেত, কারণ মূল শব্দটি স্ট্যাক প্লেসমেন্টটি বাস্তবায়িত করে না, কেবল এটি বাদ দেওয়া ছাড়া।
আন্ডারস্কোর_ডি

2

স্ট্রোস্ট্রাপের মতে, "দ্য সি প্রোগ্রামিং ল্যাঙ্গুয়েজ" (চতুর্থ সংস্করণ, সি ১১-এর আওতাভুক্ত) -এ 'অটো' ব্যবহারের নিম্নলিখিত প্রধান কারণ রয়েছে (বিভাগ ২.২.২) (স্ট্রস্ট্রপ শব্দগুলির উদ্ধৃতি দেওয়া হয়েছে):

1)

সংজ্ঞাটি একটি বৃহত স্কোপে যেখানে আমরা এই ধরণেরটি আমাদের কোডের পাঠকদের কাছে স্পষ্টভাবে দৃশ্যমান করতে চাই।

'অটো' এবং এর প্রয়োজনীয় ইনিশিয়ালাইজারের সাহায্যে আমরা ভেরিয়েবলের ধরণটি এক নজরে জানতে পারি!

2)

আমরা ভেরিয়েবলের ব্যাপ্তি বা নির্ভুলতা সম্পর্কে স্পষ্ট হতে চাই (উদাহরণস্বরূপ, ভাসমানের চেয়ে দ্বিগুণ)

আমার মতে একটি মামলা এখানে খাপ খায় এমনটি হ'ল:

   double square(double d)
    {
        return d*d; 
    }

    int square(int d)
    {
        return d*d; 
    }

    auto a1 = square(3);

    cout << a1 << endl;

    a1 = square(3.3);

    cout << a1 << endl;

3)

'অটো' ব্যবহার করে আমরা অতিরিক্ত কাজ করা এবং দীর্ঘ প্রকারের নাম লেখা এড়ানো করি

কোনও টেম্প্লেটাইজড ইেটেরেটরের কাছ থেকে কিছু দীর্ঘ টাইপের নাম কল্পনা করুন:

(বিভাগ 6.3.6.1 থেকে কোড)

template<class T> void f1(vector<T>& arg) {
    for (typename vector<T>::iterator p = arg.begin(); p != arg.end();   p)
        *p = 7;

    for (auto p = arg.begin(); p != arg.end();   p)
        *p = 7;
}

এই পয়েন্টগুলি C ++ 11 এ প্রযোজ্য, তবে সি ++ 03 তে নয়। টাইপ অনুমান সি ++ 11 এ নতুন ছিল।
জিরকা হানিকা

1

পুরাতন সংকলকটিতে মোটামুটি স্থানীয় পরিবর্তনশীল ঘোষণার জন্য অটো ছিল এক উপায় way আপনি অটো কীওয়ার্ড বা এ জাতীয় কিছু ছাড়াই টার্বো সি এর মতো পুরানো সংকলকগুলিতে স্থানীয় ভেরিয়েবলগুলি ঘোষণা করতে পারবেন না।


আমি ভীত আপনি ভুল হয়েছে। ১৯৮6 সালে উইজার্ড-সি নামে মূলত টার্বো সি-এর মূল সংস্করণে বা এর সমসাময়িকদের মধ্যে: এমএসসি, ল্যাটিস সি, কনক্র্যান্ট-সি, হাই-সি, ওয়াটকম-সি ...
চক্রলি

1

এমএসডিএন এর চ্যানেল 9 সাইটে পাওয়া এসটিএলে একটি অবাধে দেখা / ডাউনলোডযোগ্য ভিডিও বক্তৃতায় মাইক্রোসফ্টের স্টিফান টি লাভাভেজ সি ++ 0 এক্স-এ অটো কীওয়ার্ডের নতুন অর্থটি খুব সুন্দরভাবে বর্ণনা করেছেন here

বক্তৃতাটি সম্পূর্ণরূপে দেখার মতো, তবে অটো কীওয়ার্ডটির অংশটি প্রায় 29 তম মিনিটের চিহ্নের (প্রায়)।


1

'লোকাল ভেরিয়েবল' ব্যতীত 'অটো' এর অন্য কোনও অর্থ আছে কি?

সি ++ 03 এ নেই।

এটি যে কোনও কিছু করে যা এটি আপনার জন্য স্পষ্টভাবে সম্পন্ন হয় না আপনি যেখানেই এটি ব্যবহার করতে চান?

সি ++ 03 তে যা কিছু নেই।

প্রোগ্রামের সুযোগে একটি অটো ভেরিয়েবল কীভাবে আচরণ করে? ফাইল-সুযোগে একটি স্ট্যাটিক অটো ভেরিয়েবল সম্পর্কে কী?

কোনও ফাংশন / পদ্ধতির মূল অংশের বাইরে কীওয়ার্ডটির অনুমতি নেই।

এই কীওয়ার্ডটির কি সম্পূর্ণতার জন্য বিদ্যমান বিদ্যমান ব্যতীত [সি ++ 03 এ) অন্য কোনও উদ্দেশ্য রয়েছে?

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

এই কীওয়ার্ডটির সি-তে কেবলমাত্র সম্পূর্ণতার জন্য বিদ্যমান ছাড়াও কোনও উদ্দেশ্য রয়েছে?

আমি সম্প্রতি একটি শিখেছি: বি থেকে প্রাচীন প্রোগ্রামগুলির পোর্টিংয়ের স্বাচ্ছন্দতা বি নামক একটি ভাষা থেকে উদ্ভূত হয়েছিল যার বাক্য গঠন সি এর সাথে বেশ মিল ছিল তবে বি এর কোনও প্রকার ছিল না। বিতে ভেরিয়েবল ঘোষণার একমাত্র উপায় ছিল এর স্টোরেজ প্রকার ( autoবা extern) নির্দিষ্ট করা। এটার মত:

অটো আমি;

এই বাক্য গঠনটি এখনও সি তে কাজ করে এবং এর সমতুল্য

int i;

কারণ সি তে, স্টোরেজ ক্লাসটি ডিফল্ট হয় autoএবং টাইপটি ডিফল্ট হয় int। আমার ধারণা, বি তে উত্পন্ন এবং সি তে পোর্ট করা প্রতিটি প্রোগ্রাম আক্ষরিক অর্থে পূর্ণ ছিলauto ভেরিয়েবলে ।

সি ++ 03 আর সি স্টাইলকে অন্তর্নিহিত ইন্টের অনুমতি দেয় না, তবে এটি আর দীর্ঘ-হুবহু-কার্যকর autoকী - ওয়ার্ডটি সংরক্ষণ করে কারণ অন্তর্নিহিত ইন্টের বিপরীতে, এটি সি এর বাক্য গঠনতে কোনও সমস্যার কারণ হিসাবে পরিচিত ছিল না known

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