সি অটো কীওয়ার্ডটি কোথায় ব্যবহৃত হয়?


104

আমার কলেজের দিনগুলিতে আমি autoকীওয়ার্ডটি পড়েছিলাম এবং সময়ের সাথে সাথে আমি আসলে এটি কীটি ভুলে গিয়েছিলাম। এটি হিসাবে সংজ্ঞায়িত করা হয়:

স্থানীয় জীবনকাল হিসাবে স্থানীয় পরিবর্তনকে সংজ্ঞা দেয়

আমি এটি কোথাও ব্যবহার করা হচ্ছে এমনটি কখনও পাইনি, এটি কি সত্যই ব্যবহৃত হয় এবং যদি তাই হয় তবে এটি কোথায় ব্যবহৃত হয় এবং কোন ক্ষেত্রে?

উত্তর:


90

autoএকটি পরিবর্তনকারী মত static। এটি ভেরিয়েবলের স্টোরেজ ক্লাসটি সংজ্ঞায়িত করে। তবে স্থানীয় ভেরিয়েবলের জন্য যেহেতু ডিফল্ট auto, তাই আপনাকে সাধারণত এটি ম্যানুয়ালি নির্দিষ্ট করার প্রয়োজন হয় না।

এই পৃষ্ঠায় সি বিভিন্ন স্টোরেজ ক্লাস তালিকাভুক্ত করা হয়।


13
আমার উত্তরটি কেউ আপ-আপ করার পরে কেবল এটি আবার দেখছিল। আপনি বলছেন যে "সাধারণত এটিকে ম্যানুয়ালি নির্দিষ্ট করার দরকার নেই।" আমাকে কেবল জিজ্ঞাসা করতে হবে: আসলেই এমন কোনও পরিস্থিতি রয়েছে যা নির্দিষ্ট করা auto যেতে পারে তবে ডিফল্টরূপে ঘটবে না?
জেরি কফিন

2
@ জেরি কফিন সি-তে নেই, সি ++ ১১-এ, এটি পুনরুদ্ধার করা হয়েছে এবং আপনি স্থানীয় ভেরিয়েবল টাইপ অনুমানের জন্য কার্যকরভাবে এটি ব্যবহার করতে পারেন।
মেহরদাদ আফশারি

2
একটি সম্ভাব্য ব্যবহার হ'ল জিএনইউ সি-তে নেস্টেড ফাংশনগুলির ঘোষণা করার আগে - যদিও এটি মূল সংজ্ঞাটির হাইজ্যাকিং autotigcc.ticalc.org/doc/keywords.html#auto
য়োশিয

2
লিঙ্কযুক্ত পৃষ্ঠাটি পুরানো। C11 সাল থেকে, এর রয়েছে _Thread_localবিবরণ: en.cppreference.com/w/c/language/storage_duration এবং stackoverflow.com/a/14289720/6557621
MCCCS

132

আপনি যদি আইএকিউ (প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী) তালিকাটি পড়েন তবে আপনি জানতে পারবেন যে গাড়িটি সংজ্ঞায়িত বা ঘোষণার জন্য মূলত অটোই কার্যকর :

auto my_car;

একটি বাহন যা নিয়মিত বাইরে বাইরে পার্ক করা হয়:

extern auto my_car;

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

দ্বারা ক্ষুদ্র সংযোজন Kaz :

এছাড়াও আছে:

static auto my_car;

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

পূর্বোক্তগুলিতেও extern auto my_carএকটি ডায়াগোনস্টিক প্রয়োজন, এবং সেই কারণেই এটি কখনই সংকলকের মাধ্যমে চালানো হয় না, পার্কিং প্রয়োগের দায়িত্ব দেওয়া নগরীর কর্মীরা ছাড়া other

আপনি যদি extern static auto ...কোনও কোড বেসে প্রচুর দেখতে পান তবে আপনি খারাপ প্রতিবেশে আছেন; পুরো জায়গাটি মরচে পরিণত হওয়ার আগে, তত্ক্ষণাত আরও ভাল কাজের সন্ধান করুন।


@ নিজে: আইএসও কোনও "আইএসও ২০১১" জানে বলে মনে হচ্ছে না। আপনি কী বিশ্বাস করেন এটি মানিক হতে পারে?
জেরি কফিন

6
এটি আমার পক্ষে কফি, কোলা, স্টাউট বা অন্য কোনও গা dark় রঙের তরল ছিল না এটি একটি ভাল জিনিস। @ জেরি কফিন, আপনি আমার কাছে একটি কম্পিউটার স্ক্রিন ধার্য করতেন। সর্বকালের সেরা উত্তর!
ডেভিড হামেন

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

@ জেরি কফিন আমি ইতিমধ্যে এটি ব্যাখ্যা করেছি, আমার মন্তব্যটি আবার পড়ুন। হিন্দ্সাইট 20/20।
ড্যান বেচার্ড 4'17

2
আমি সম্প্রতি একটি গুরুতর সংঘর্ষ (দুটি লেন বন্ধ) পাস করেছি যা তার প্রয়োজনের প্রস্তাব দেয়char auto my_car;
পুরো

46

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

বি এর জন্য রেফারেন্স ম্যানুয়াল এখানে ।

যেমন আপনি দেখতে পাচ্ছেন, ম্যানুয়ালটি উদাহরণগুলিতে autoব্যবহার করা হয়েছে যাতে তা ব্যবহারযোগ্য। কোনও intকীওয়ার্ড না থাকায় এটি এমন । "এটি একটি ভেরিয়েবলের ঘোষণা" বলতে কিছু প্রকারের কীওয়ার্ডের প্রয়োজন হয় এবং সেই কীওয়ার্ডটি এটি স্থানীয় বা বাহ্যিক ( autoবনাম extrn) কিনা তাও নির্দেশ করে । আপনি যদি একটি বা অন্যটি ব্যবহার না করেন তবে আপনার একটি সিনট্যাক্স ত্রুটি রয়েছে। এটি বলতে গেলে, x, y;এটি নিজেই কোনও ঘোষণা নয়, তবে auto x, y;তা।

যেহেতু বি তে লিখিত কোড বেসগুলিকে NB এবং C তে ভাষা বিকাশ করা হয়েছিল তাই ভাষার নতুন সংস্করণগুলিতে উন্নত অনগ্রসর সামঞ্জস্যের জন্য কিছু লাগেজ বহন করা হয়েছে যা কম কাজে অনুবাদ করেছে। এর ক্ষেত্রে auto, প্রোগ্রামারদের প্রতিটি ঘটনা খুঁজে বার করে autoএটি সরাতে হবে না।

এটি ম্যানুয়ালটি থেকে স্পষ্ট যে সি-তে এখন অপ্রচলিত "অন্তর্নিহিত ইনট" ক্রাফটও এসেছে ( সামনে main() { ... }কোনও লেখা ছাড়াই লিখতে সক্ষম হয়ে int) বি থেকেও এসেছে এটি বি কোড সমর্থন করার জন্য আরও একটি পশ্চাদপদ সামঞ্জস্য বৈশিষ্ট্য। বি তে কোনও ফাংশনগুলির কোনও রিটার্নের ধরণ নির্দিষ্ট নেই কারণ কোনও প্রকার নেই। অনেকগুলি সমাবেশ ভাষার মতো সবকিছুই একটি শব্দ।

একটি ফাংশন কীভাবে ঘোষিত হতে পারে তা নোট করুন extrn putcharএবং তারপরে এটি কেবল একটি জিনিস যা এটি শনাক্তকারীর ব্যবহারকে একটি ফাংশন করে তোলে : এটি একটি ফাংশন কল এক্সপ্রেশনের মতো ব্যবহৃত হয় putchar(x)এবং এটিই কম্পাইলারকে সেই টাইপলেস শব্দটিকে একটি ফাংশন পয়েন্টার হিসাবে বিবেচনা করতে বলে।


24

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

যাইহোক, সি ++ 11 স্ট্যান্ডার্ডে autoকীওয়ার্ডটি 'হাইজ্যাক' করা হয়েছে টাইপ অনুমিতিকে সমর্থন করার জন্য, যেখানে ভেরিয়েবলের ধরণটি তার আরম্ভকারীর ধরণ থেকে নেওয়া যেতে পারে:

auto someVariable = 1.5;   // someVariable will have type double

মূলত টেমপ্লেটগুলিতে ভেরিয়েবলগুলি ঘোষণা করতে বা টেম্পলেট ফাংশনগুলি থেকে ফিরে আসে যেখানে টেম্পলেট প্যারামিটারের ভিত্তিতে (বা টেমপ্লেট ইনস্ট্যান্ট করার সময় সংকলক দ্বারা অনুমিত) প্রকারভেদটি ম্যানুয়ালি ঘোষিত করার জন্য বেশ যন্ত্রণাদায়ক হতে পারে Type


1
"ভেরিয়েবল একটি ব্লকের কাছে স্থানীয়" - এটি মোটেও সত্য নয়। কোনও ব্লকে ঘোষিত সমস্ত ভেরিয়েবলগুলি সেই ব্লকের স্থানীয় (স্কোপের ক্ষেত্রে) are তারা প্রোগ্রামের অন্যান্য ভেরিয়েবলের সাথে লিঙ্কযুক্ত হতে পারে, তবে ঘোষণাটি কেবল সেই ব্লকটিতে দৃশ্যমান। autoস্টোরেজ ক্লাস সম্পর্কে যা দৃশ্যমানতার সাথে কিছুই করার নেই।
ফুজ

12

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

তবে স্পষ্টভাবে ঘোষিত ভেরিয়েবলগুলি autoসেই ক্ষেত্রেই ছিল left (পুনরাবৃত্ত ক্রিয়াকলাপগুলির জন্য একটি আবশ্যক যা অন্যথায় সঠিকভাবে কাজ করবে না!)


7

মূল autoশব্দটি পাইথনের অর্ধিকোলনের অন্তর্ভুক্তির অনুরূপ, এটি পূর্ববর্তী একটি ভাষা দ্বারা প্রয়োজন হয়েছিল ( B) তবে বিকাশকারীরা বুঝতে পেরেছিলেন যে এটি অপ্রয়োজনীয় কারণ বেশিরভাগ জিনিস ছিল auto

আমি সন্দেহ করি এটি বি থেকে সি তে রূপান্তর করতে সহায়তা করার জন্য রেখে গেছে, সংক্ষেপে, একটি ব্যবহার বি ভাষার সামঞ্জস্যের জন্য।

উদাহরণস্বরূপ বি এবং 80 এর দশকে:

/* The following function will print a non-negative number, n, to
   the base b, where 2<=b<=10.  This routine uses the fact that
   in the ASCII character set, the digits 0 to 9 have sequential
   code values.  */

printn(n, b) {
        extrn putchar;
        auto a;

        if (a = n / b)        /* assignment, not test for equality */
                printn(a, b); /* recursive */
        putchar(n % b + '0');
}

1

অটো কীওয়ার্ড হ'ল স্টোরেজ ক্লাস (কিছু ধরণের কৌশল যা ভেরিয়েবল এবং স্টোরেজ স্থানের আজীবন সিদ্ধান্ত নেয়) উদাহরণ। এটির একটি আচরণ রয়েছে যার সাহায্যে সেই কীওয়ার্ডটির সাহায্যে তৈরি ভেরিয়েবলের জীবনকাল (আজীবন) কেবল কোঁকড়া ধনুর্বন্ধনী মধ্যে থাকে

{
    auto int x=8;        
    printf("%d",x);  // here x is 8

    { 
        auto int x=3;
        printf("%d",x);  // here x is 3
    }              

    printf("%d",x);  // here x is 8
}          

0

autoশুধুমাত্র ব্লক-স্কোপড ভেরিয়েবলগুলির জন্য ব্যবহার করা যেতে পারে। extern auto intআবর্জনাযুক্ত কারণ সংকলকটি এটি নির্ধারণ করতে পারে না যে এটি বাহ্যিক সংজ্ঞা ব্যবহার করে কিনা বা কোনও অটো সংজ্ঞা দিয়ে বাহ্যকে ওভাররাইড করবে কিনা (এছাড়াও স্বয়ংক্রিয় এবং বহিরাগতভাবে সম্পূর্ণ পৃথক স্টোরেজ সময়কাল, যেমন static auto intস্পষ্টতই আবর্জনাও রয়েছে)। এটি সর্বদা এটি একটি উপায়ে ব্যাখ্যা করা বেছে নিতে পারে তবে পরিবর্তে এটি একটি ত্রুটি হিসাবে বিবেচনা করে বেছে নেওয়া হয়।

একটি বৈশিষ্ট্য রয়েছে যা সরবরাহ autoকরে এবং এটি একটি ফাংশনের অভ্যন্তরে 'সবকিছুই একটি ইনট' নিয়ম সক্ষম করে। কোনও ফাংশনের বাইরে a=3যেমন সংজ্ঞা হিসাবে ব্যাখ্যা করা হয় int a =3কারণ অ্যাসাইনমেন্টগুলি ফাইল স্কোপে উপস্থিত থাকে না, a=3এটি কোনও ফাংশনের অভ্যন্তরে একটি ত্রুটি কারণ স্পষ্টতই সংকলক এটি সংজ্ঞার পরিবর্তে বহিরাগত ভেরিয়েবলের একটি অ্যাসাইনমেন্ট হিসাবে ব্যাখ্যা করে (এমনকি সেখানে থাকলেও) নেই extern int aফাংশনে বা ফাইল সুযোগ এগিয়ে ঘোষণা), কিন্তু মত একটি সুনির্দিষ্টভাবে উল্লেখ করা static, const, volatileবা autoসূচিত করা হবে এটি একটি সংজ্ঞা নেই এবং কম্পাইলার একটি সংজ্ঞা যেমন লাগে, ছাড়া autoঅন্য নির্দিষ্টকরী পার্শ্বপ্রতিক্রিয়া নেই। auto a=3সুতরাং অন্তর্নিহিত auto int a = 3। বোঝা যাচ্ছে যে নেতারা,signed a = 3একই প্রভাব রয়েছে এবং unsigned a = 3সর্বদা স্বাক্ষরবিহীন অন্তর্নিহিত।

এছাড়াও দ্রষ্টব্য ' autoকোনও বিষয়টিকে কোনও নিবন্ধকে বরাদ্দ দেওয়া হবে কিনা তার কোনও প্রভাব নেই (যদি না কোনও নির্দিষ্ট সংকলক এতে মনোযোগ দেয় তবে তা অসম্ভব বলে মনে হয়)' "


-1

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

এই তত্ত্বটি জিসিসি সংকলকের জন্য কাজ করেনি তবে আমি অন্য সংকলকগুলির চেষ্টা করিনি।

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