লুপের জন্য একাধিক নেস্টেড থেকে বেরিয়ে যাওয়ার জন্য আমি বিরতি ব্যবহার করতে পারি?


305

breakবেশ কয়েকটি নেস্টেড forলুপগুলি থেকে বেরিয়ে আসার জন্য কী ফাংশনটি ব্যবহার করা সম্ভব ?

যদি তা হয় তবে আপনি কীভাবে এটি চালিয়ে যাবেন? আপনি কতগুলি লুপগুলি breakপ্রস্থান করে তাও নিয়ন্ত্রণ করতে পারেন ?


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

উত্তর:


239

আফাইক, সি ++ জাভা এবং অন্যান্য ভাষার মতো নামকরণ লুপগুলিকে সমর্থন করে না। আপনি একটি গোটো ব্যবহার করতে পারেন বা আপনি যে পতাকা ব্যবহার করছেন তা তৈরি করতে পারেন। প্রতিটি লুপের শেষে পতাকাটির মানটি পরীক্ষা করুন। যদি এটি সত্যতে সেট করা থাকে, তবে আপনি সেই পুনরাবৃত্তিটি ভেঙে ফেলতে পারেন।


317
gotoএটি সর্বোত্তম বিকল্প হলে কোনওটি ব্যবহার করতে ভয় পাবেন না ।
জেকি

18
গোটোতে লোকের অনুদান সম্পর্কে পড়ার পরে আমি একজন নতুন সি ++ প্রোগ্রামার (এবং কোনও আনুষ্ঠানিক প্রোগ্রামিং প্রশিক্ষণ ব্যতীত একজন)। আমার প্রোগ্রামটি হঠাৎ হঠাৎ বিস্ফোরিত হয়ে আমাকে মেরে ফেলবে এই ভয়ে আমি এটি ব্যবহারে দ্বিধাগ্রস্ত। তা ছাড়া, যখন আমি আমার টিআই -৩৩ এ প্রোগ্রাম লিখতাম (অবশ্যই গণিতের ক্লাসে বিরক্তিকর) তখন বেসিক এডিটর প্রদত্ত ফাংশনগুলির জন্য গোটো ব্যবহারের প্রয়োজন ছিল।

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

41
@ ফাকা: গোটো ব্যবহারে কোনও ভুল নেই। এটি এমন একটি গোটোর অপব্যবহার করছে যা সমস্যাজনক।
সবাই

28
@ হুকড: এটি ঠিক, ব্যতীত gotoখুব কম ব্যবহার করা সবচেয়ে ভাল বিকল্প। কেন লুপগুলি তাদের নিজস্ব ফাংশনে রাখবেন না ( inline, যদি আপনি গতির বিষয়ে উদ্বিগ্ন হন) এবং এ returnথেকে?
এসবিআই

265

না, এটি দিয়ে লুণ্ঠন করবেন না break। এটি ব্যবহারের জন্য সর্বশেষ অবশিষ্ট দুর্গ goto


19
মিস্রা সি ++ কোডিং মানটি এই সঠিক ধরণের পরিস্থিতিটি coverাকতে গোটো ব্যবহারের অনুমতি দেয়।
রিচার্ড কর্ডেন

11
রিয়েল প্রোগ্রামাররা গোটো ব্যবহার করতে ভয় পান না। এটি 25 বছর ধরে হয়ে গেছে - কোনও আফসোস নেই - উন্নয়নের এক টন সময় সাশ্রয় হয়েছে।
ডগ নুল

1
আমি রাজী. আপনার কাছে 8K পিক্সেল না থাকলে গোটসগুলি অবশ্যই আবশ্যক এবং 30 উইন্ডোজ ওএস কলগুলির সিক্যুয়েন্স কল করতে হবে।
মাইচল রায়

অথবা কোনও ফাংশনে কোড রেখে একটি সাধারণ "রিটার্ন"।
তারা

68

ল্যাম্বডাস ব্যবহার করে কেবল একটি সুস্পষ্ট উত্তর যুক্ত করতে:

  for (int i = 0; i < n1; ++i) {
    [&] {
      for (int j = 0; j < n2; ++j) {
        for (int k = 0; k < n3; ++k) {
          return; // yay we're breaking out of 2 loops here
        }
      }
    }();
  }

অবশ্যই এই প্যাটার্নটির একটি নির্দিষ্ট সীমাবদ্ধতা রয়েছে এবং স্পষ্টতই কেবল সি ++ 11 তবে আমি মনে করি এটি বেশ কার্যকর।


7
এটি পাঠককে ভেবে বিভ্রান্ত করতে পারে যে প্রত্যাবর্তনের ফলে ল্যাম্বদা ফাংশনটি ফিরে আসবে এবং ল্যাম্বদা নিজেই নয়।
জুনি

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

17
আমি মনে করি এই সমাধানটি খুব সুন্দর
টুকট করুন

আপনি লাম্বদাটিকে একটি আরআইআইএ টেম্পলেটে ক্যাপচার করতে পারেন যা এটিকে একটি নাম দেয় এবং ডাক্টারে ডাকে (ওরফে স্কোপ গর্ড)। এটি কোনও কার্যকারিতা লাভ যোগ করবে না তবে পঠনযোগ্যতা উন্নত করতে পারে এবং ফাংশন কল বন্ধনী অনুপস্থিত হওয়ার ঝুঁকি হ্রাস করতে পারে।
Red.Wave

56

নেস্টেড লুপটি ভেঙে ফেলার আরেকটি পদ্ধতি হ'ল উভয় লুপকে আলাদা ফাংশনে ফ্যাক্ট করা এবং returnসেই ফাংশন থেকে যখন আপনি প্রস্থান করতে চান।

অবশ্যই, এটি অন্য যুক্তিটি সামনে এনেছে যে আপনার returnশেষে কখনও ব্যতীত অন্য কোনও অনুষ্ঠান থেকে স্পষ্টভাবে হওয়া উচিত কিনা ।


7
এটি একটি সি সমস্যা। আরআইএএর সাথে তাড়াতাড়ি রিটার্ন কোনও সমস্যা নয় কারণ প্রথম দিকের রিটার্ন সম্পর্কিত সমস্ত সমস্যা সঠিকভাবে পরিচালনা করা হয়।
মার্টিন ইয়র্ক

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

21
আরআইএএ কী? এটি কি আরআইআইয়ের মতো কিছু? = ডি
জেকি

1
কতটা লুপ পেয়েছে তার উপর নির্ভর করে এবং নীড়টি কত গভীর যায় ... আপনি কি নীল বড়ি বা লাল বড়ি চান?
ম্যাট

34

বিরতি এটিতে অন্তর্ভুক্ত কেবলমাত্র অন্তরের লুপটি প্রস্থান করবে।

আপনি যেকোন সংখ্যক লুপ ভেঙে ফেলার জন্য গোটো ব্যবহার করতে পারেন ।

অবশ্যই গোটো প্রায়শই ক্ষতিকারক হিসাবে বিবেচিত হয়

ব্রেক ফাংশনটি ব্যবহার করা কি যথাযথ [...]?

বিরতি এবং গোটো ব্যবহার করে কোনও প্রোগ্রামের যথার্থতার বিষয়ে যুক্তি আরো জটিল করে তুলতে পারে। এটি সম্পর্কে একটি আলোচনার জন্য এখানে দেখুন: ডিজকস্ট্রা উন্মাদ ছিল না


16
একটি উত্তরের উত্তর যা এটি ব্যাখ্যা করে যে "গোটো ক্ষতিকারক" মেমকে দৃ general়ভাবে আরও সাধারণীকরণ করা হয় "নিয়ন্ত্রণ প্রবাহের বাধা ক্ষতিকারক" বিবৃতিতে। "গোটো ক্ষতিকারক" বলে অর্থহীন, এবং তারপরে ঘুরিয়ে ঘুরিয়ে ব্যবহার করার breakবা সুপারিশ করা উচিত return
পাভেল মিনায়েভ

6
@ পাভেল: breakএবং এর returnচেয়ে সুবিধা হ'ল gotoআপনার কোথায় লেবেল রয়েছে তা অনুসন্ধান করার জন্য আপনাকে কোনও লেবেল অনুসন্ধান করার দরকার নেই। হ্যাঁ, নীচে এগুলি একরকম goto, তবে খুব সীমাবদ্ধ। কোনও প্রোগ্রামার প্যাটার্ন-ম্যাচিং মস্তিস্ককে বাধা না বাড়ানোর চেয়ে এগুলি বোঝা অনেক সহজ goto। সুতরাং আইএমও তারা পছন্দসই।
এসবিআই

@ এসবিআই: সত্য, তবে বিরতি এখনও কাঠামোগত প্রোগ্রামিংয়ের অংশ নয়। এটি একটি ভাল তুলনায় ভাল সহ্য করা হয় goto
জকি

2
@ কার্লভয়েগল্যান্ডল্যান্ড ডিজকস্ট্রার লিঙ্কটি পুরানো; এটি কাজ করছে বলে মনে হচ্ছে: blog.plover.com/2009/07
অ্যারন

3
এই পরিস্থিতিতে গোটো ব্যবহার করে কোনও ভুল নেই wrong অন্যথায় প্রস্তাবিত অনেকগুলি চুক্তিবদ্ধ সমাধানের চেয়ে একটি ভাল স্থাপনযোগ্য গোটো হ'ল লাফিয়ে যায় এবং আরও সীমাবদ্ধ থাকে more
জেমস

22

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

for(unsigned int z = 0; z < z_max; z++)
{
    bool gotoMainLoop = false;
    for(unsigned int y = 0; y < y_max && !gotoMainLoop; y++)
    {
        for(unsigned int x = 0; x < x_max && !gotoMainLoop; x++)
        {
                          //do your stuff
                          if(condition)
                            gotoMainLoop = true;
        }
    }

}

5
যা ভাল তবে এখনও এতটা পঠনযোগ্য নয়, আমি সে ক্ষেত্রে
গোটো

2
এটি আপনার কোডটিকে "বেশ" ধীর করে তোলে কারণ gotoMainLoopপ্রতিটি চক্রটি পরীক্ষা করা হয়
থমাস

1
এই ক্ষেত্রে, gotoআসলটি ব্যবহার করাকে মূল আরও পাঠযোগ্য এবং আরও ভাল-সম্পাদন করে তোলে।
Петър Петров

20

এ কেমন?

for(unsigned int i=0; i < 50; i++)
{
    for(unsigned int j=0; j < 50; j++)
    {
        for(unsigned int k=0; k < 50; k++)
        {
            //Some statement
            if (condition)
            {
                j=50;
                k=50;
            }
        }
    }
}

2
আকর্ষণীয় দৃষ্টিভঙ্গি তবে আমি অবশ্যই নিশ্চিতভাবে পছন্দ করেছি যেভাবে @ inf.ig.sh এটি পরিচালনা করে। এর জন্য (স্বাক্ষরবিহীন int y = 0; y <y_max &&! getoMainLoop; y ++)।
অ্যান্ডি


11

বেশ কয়েকটি নেস্টেড লুপগুলি ভেঙে ফেলার একটি দুর্দান্ত উপায় হ'ল আপনার কোডটিকে কোনও ফাংশনে রিফ্যাক্টর করা:

void foo()
{
    for(unsigned int i=0; i < 50; i++)
    {
        for(unsigned int j=0; j < 50; j++)
        {
            for(unsigned int k=0; k < 50; k++)
            {
                // If condition is true
                return;
            }
        }
    }
}

4
... এই বিকল্পটি স্ট্যাক করার জন্য যদি আমাদের 10-20 ভেরিয়েবলগুলি পাস করতে হয় তবে এটি কোনও বিকল্প নয়।
Петър Петров

1
@ ПетърПетров তারপরে একটি ল্যাম্বডায় যান যা এটির চেয়ে ভাল যা আপনি এটির যেখানে প্রয়োজন ঠিক ঠিক এটি সংজ্ঞা দিতে পারেন।
দারিওপি

ল্যাম্বডাসের জন্য +1 তবে গেম ইঞ্জিন কোরে ওভারহল যেখানে এমনকি একটি স্ট্যাক ফ্রেম এখনও একটি বাধা। বলার জন্য দুঃখিত, তবে ল্যাম্বডাস কমপক্ষে এমএসভিসি ২০১০
Петров r

@। তারপরে ফাংশনগুলির জুটিকে একটি শ্রেণিতে এবং স্ট্যাক ভেরিয়েবলগুলি ব্যক্তিগত সদস্যগুলিতে পরিবর্তন করুন।
আর্থার টাচকা

এটি কেবল ইতিমধ্যে জটিল কোডকে উপভোগ করেছে :) কখনও কখনও, গোটো একমাত্র সমাধান। অথবা আপনি যদি "গোটো স্টেট এক্স" ডকুমেন্টেশন সহ জটিল অটোমেটা লিখেন, তবে গোটো আসলে নথিতে লিখিতভাবে কোডটি পঠন করে দিচ্ছে। এছাড়াও, সি # এবং গো উভয়ই একটি উদ্দেশ্য নিয়ে গেছেন: কোনও ভাষা গোটো ছাড়া টুরিং-সম্পূর্ণ হয় না, এবং গোটোস প্রায়শই অন্তর্বর্তী অনুবাদক বা সমাবেশ-জাতীয় কোড লেখার জন্য সেরা ব্যবহৃত সরঞ্জাম are
35 Петров

5

নেস্টেড লুপগুলি ভাঙ্গার জন্য গোটো খুব সহায়ক হতে পারে

for (i = 0; i < 1000; i++) {
    for (j = 0; j < 1000; j++) {
        for (k = 0; k < 1000; k++) {
             for (l = 0; l < 1000; l++){
                ....
                if (condition)
                    goto break_me_here;
                ....
            }
        }
    }
}

break_me_here:
// Statements to be executed after code breaks at if condition

3

breakবিবৃতি নিকটতম এনক্লোজিং সঞ্চালনের বন্ধ do, for, switch, অথবা whileবিবৃতি যেখানে এটি প্রদর্শিত হবে। নিয়ন্ত্রণটি বিবৃতিতে যায় যা সমাপ্ত বিবৃতি অনুসরণ করে।

থেকে MSDN


3

আমি মনে করি একটি gotoএই পরিস্থিতিতে বৈধ:

একটি break/ নকল করতে continue, আপনি চাইবেন:

বিরতি

for ( ;  ;  ) {
    for ( ;  ;  ) {
        /*Code here*/
        if (condition) {
            goto theEnd;
        }
    }
}
theEnd:

চালিয়ে

for ( ;  ; ) {
    for ( ;  ;  ) {
        /*Code here*/
        if (condition) {
            i++;
            goto multiCont;
        }
    }
    multiCont:
}

"চালিয়ে যান" সেখানে কাজ করবে না, কারণ প্রথম লুপটির পুনরাবৃত্তি প্রকাশ করা হবে না
ফ্যাবিও এ।

আমি ধরে নিচ্ছি যে প্রথম লুপের জন্য পুনরুক্তি হয় i। অত: পর i++এতে যান সামনে
JuliusAlphonso

0

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


0

আমি জানি এটি পুরানো পোস্ট। তবে আমি কিছুটা যৌক্তিক ও সহজ উত্তর দেওয়ার পরামর্শ দেব।

for(unsigned int i=0; i < 50; i++)
    {
        for(unsigned int j=0; j < conditionj; j++)
        {
            for(unsigned int k=0; k< conditionk ; k++)
            {
                // If condition is true

                j= conditionj;
               break;
            }
        }
    }

3
এটি খুব স্কেলযোগ্য সমাধান নয় কারণ এটির j = conditionjপরিবর্তে আপনার কাছে জটিল প্রাকটিক্ট থাকলে কাজ করবে না j < conditionj
সের্গে

0

boolনীচে দেখুন কেবলমাত্র একটি পরিবর্তনশীল দ্বারা যে কোনও লুপের সংখ্যা ভাঙ্গুন :

bool check = true;

for (unsigned int i = 0; i < 50; i++)
{
    for (unsigned int j = 0; j < 50; j++)
    {
        for (unsigned int k = 0; k < 50; k++)
        {
            //Some statement
            if (condition)
            {
                check = false;
                break;
            }
        }
        if (!check)
        {
            break;
        }
    }
    if (!check)
    {
        break;
    }
}

এই কোড আমরা break;সব লুপ।


0

এটির মূল্য আছে কিনা তা সম্পর্কে আমি নিশ্চিত নই তবে আপনি কয়েকটি সাধারণ ম্যাক্রো দিয়ে জাভার নামযুক্ত লুপগুলি অনুকরণ করতে পারেন:

#define LOOP_NAME(name) \
    if ([[maybe_unused]] constexpr bool _namedloop_InvalidBreakOrContinue = false) \
    { \
        [[maybe_unused]] CAT(_namedloop_break_,name): break; \
        [[maybe_unused]] CAT(_namedloop_continue_,name): continue; \
    } \
    else

#define BREAK(name) goto CAT(_namedloop_break_,name)
#define CONTINUE(name) goto CAT(_namedloop_continue_,name)

#define CAT(x,y) CAT_(x,y)
#define CAT_(x,y) x##y

ব্যবহারের উদাহরণ:

#include <iostream>

int main()
{
    // Prints:
    // 0 0
    // 0 1
    // 0 2
    // 1 0
    // 1 1

    for (int i = 0; i < 3; i++) LOOP_NAME(foo)
    {
        for (int j = 0; j < 3; j++)
        {
            std::cout << i << ' ' << j << '\n';
            if (i == 1 && j == 1)
                BREAK(foo);
        }
    }
}

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

#include <iostream>

int main()
{
    // Prints: 
    // 0
    // 1
    // 0
    // 1
    // 0
    // 1

    int count = 3;
    do LOOP_NAME(foo)
    {
        for (int j = 0; j < 3; j++)
        {
            std::cout << ' ' << j << '\n';
            if (j == 1)
                CONTINUE(foo);
        }
    }
    while(count-- > 1);
}

-1
  while (i<n) {
    bool shouldBreakOuter = false;
    for (int j=i + 1; j<n; ++j) {
      if (someCondition) {
          shouldBreakOuter = true;
      }
    }

    if (shouldBreakOuter == true)
      break;

  }

-3

আপনি চেষ্টা করতে পারেন ... ধরা।

try {
    for(int i=0; i<10; ++i) {
        for(int j=0; j<10; ++j) {
            if(i*j == 42)
                throw 0; // this is something like "break 2"
        }
    }
}
catch(int e) {} // just do nothing
// just continue with other code

যদি আপনাকে একবারে কয়েকটি লুপ ভেঙে দিতে হয় তবে এটি প্রায়শই যাই হোক ব্যতিক্রম।


1
এই উত্তরটি কেন এই নিচে-ভোট পেতে পারে তার কারণটি জানতে চাই।
hkBattousai

6
@hkBattousai সমাধানটি ভোট কম হয়েছে কারণ এটি কার্যকর করার প্রবাহকে নিয়ন্ত্রণ করতে একটি ব্যতিক্রম ব্যবহার করছে। নামটি যেমন বোঝায়, ব্যতিক্রম কেবলমাত্র ব্যতিক্রমী ক্ষেত্রে ব্যবহার করা উচিত।
হেলিও স্যান্টোস

4
@ হেলিওস্যান্টোস কি এটি একটি ব্যতিক্রমী পরিস্থিতি নয় যার জন্য ভাষা সঠিক সমাধান সরবরাহ করে না?
hkBattousai

8
ব্যতিক্রমগুলি ধীর।
গর্ডন

2
নিক্ষেপটির পারফরম্যান্স প্রভাব এমন কোনও কিছুর জন্য বিশাল যে সময়টির 99% ভাগ অপরিবর্তনযোগ্য ত্রুটি নয়।
মীচল রায়

-4

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


11
এটা মোটেও অদ্ভুত নয়। আপনি যদি কিছু সংগ্রহ করার জন্য কোনও সংগ্রহকে ঘুরে দেখেন (এবং অনুসন্ধানের আরও দ্রুত উপায় নেই) তবে লুপটি শেষ করার কোনও মানে নেই। (একটি উদাহরণ হিসাবে)
জো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.