(;;) বা যখন (সত্য) এর জন্য সঠিক সি # অসীম লুপটি কোনটি? [বন্ধ]


97

আমার সি / সি ++ দিনের মধ্যে ফিরে আসার মতো একটি "অসীম লুপ" কোডিং

while (true)

আরো প্রাকৃতিক অনুভূত হয়েছিল এবং এর বিপরীতে আমার কাছে আরও স্পষ্ট মনে হয়েছিল

for (;;)

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


5
দুই মিনিটের মধ্যে চারটি অভিন্ন উত্তর। খারাপ না.
জন বি

5
আপনি আপনার অসীম লুপটি বাতিল করে পুরো ধর্মীয় যুক্তি এড়াতে পারেন। বেশি সময় নেওয়া উচিত নয় ...
স্টিফেন ডার্লিংটন

7
কৌতূহলের বাইরে: কেন সি; সি ++ এর জন্য (;;) ভাল?
ভিলক্স-

6
@ ভিলাক্স যেমন আমি এটি স্মরণ করি, পুরানো সংকলকগণ (1) এর চেয়ে (;;) এর জন্য আরও কার্যকর কোড লিখতেন। আমি নিশ্চিত যে যে কোনও শালীন আধুনিক সংকলক খুব বেশি অভিন্ন কোড আউটপুট দেবে।
স্টিফেন ডার্লিংটন 21

4
স্টিফেন এবং সেরিওর মন্তব্যের ভিত্তিতে: 1. while(true)একটি শর্ত প্রয়োজন। for(;;)অতএব অসীম লুপগুলির জন্য এটি আরও ভাল প্রতিনিধিত্ব যা শর্তহীন পুনরাবৃত্তি করে। ২. পুরানো আনোপিমাইজিং সংকলকগুলি (true)এটি লুপ হওয়ার সাথে সাথে প্রকৃতপক্ষে মূল্যায়ন করতে পারে । ৩. টেলি টাইপস, ৩০০ বাউড টার্মিনাল এবং ১-চর চলক নামগুলির দিন থেকে সি একটি সংক্ষিপ্ত ভাষা। একটি পরিবেশ যেখানে প্রতি কী স্ট্রোক সংখ্যা, for(;;)চেয়ে বেশ একটু খাটো while(true)
রিচার্ড ডিঙ্গওয়াল

উত্তর:


124
while(true)
{

}

আমি যা ব্যবহার করেছি এবং অন্যকে যা দেখেছি তা লুপের জন্য যা নিজে নিজেই ভেঙে যেতে পারে always


@ আরসোলবার্গ - এটি একে অপরের কয়েক সেকেন্ডের মধ্যে দেওয়া দুটি অনুরূপ প্রতিক্রিয়াগুলির মধ্যে একটি টস-আপ ছিল। অ্যাডামের ফলো-আপ মন্তব্য আমাকে সম্মেলনের পরিবর্তে ব্যবহারের ভিত্তিতে একটি উত্তর গ্রহণ করতে পরিচালিত করেছিল।
বব কাউফম্যান

4
এবং উভয়ই ম্যানুয়ালি ভেঙে যেতে পারে
অ্যালেন রাইস

4
দুর্ভাগ্যক্রমে, এই উত্তরটি প্রশ্নের উত্তর দেয় না। সঠিক উত্তরটি "উভয়ই সঠিক"।
ডেভিড আর ট্রিবল

4
@ লোডমাস্টার: এটি আপনার "সংশোধন" (বা তার পরিবর্তে আপনি কী ধরণের "নির্ভুলতা" পরেছেন) এর সংজ্ঞা উপর নির্ভর করে।
অ্যাডাম রবিনসন

319

সি # সংকলক উভয়কেই রূপান্তরিত করবে

for(;;)
{
    // ...
}

এবং

while (true)
{
    // ...
}

মধ্যে

{
    :label
    // ...
    goto label;
}

উভয়ের জন্য সিআইএল একই। বেশিরভাগ লোকেরা while(true)পড়া এবং বুঝতে সহজ বলে মনে করেন। for(;;)বরং রহস্যজনক।

সূত্র:

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

উভয় লুপগুলি (। নেট প্রতিফলক সহ) সংকলন করে:

Label_0000:
    goto Label_0000;

দ্রুত আক্রমণকারীদের আক্রমণ করা উচিত।


7
হ্যাঁ, ডাবল চেক করা হয়েছে, এটির সমস্ত একই আইএল কোড, এটি গ্রহণযোগ্য উত্তর আইএমও হওয়া উচিত :)
অ্যালেন রাইস

65
Xkcd রেফারেন্সের জন্য +1
Ikke

4
পেডেন্টিক হতে, সংকলকটি একটি বিবৃতি ফর্মটিকে অন্যটিতে রূপান্তরিত করে না ; বরং এটি উভয় বিবৃতিতে অভিন্ন কোড উত্পন্ন করে। এই কোডটি gotoবিটিডব্লিউ-এর একটি বিবৃতিতে সমান , যা অবাক হওয়ার কিছু নেই।
ডেভিড আর ট্রিবিবল

4
এবং তারপরে গোটোটি জ্যাম্পের নির্দেশে অনুবাদ করা হয়েছে ..
মার্কো এম।

25
স্পষ্টতই goto LOOPসঠিক সি # অসীম লুপ :)
ডাস্টিন গেটেজ

61

আমি মনে করি এটি পড়তে সহজ হতে পারে এবং সি # তে ব্যবহারের জন্য এটি অবশ্যই মানক:

while(true)
{
   //Do My Loop Stuff
}

19
@ ভ্রমণকারী: 1 সি # তে 'সত্য' এর বিকল্প নয়।
অ্যাডাম রবিনসন

17
মনে রাখবেন যে (1) অবৈধ সি #: কনস্ট্যান্ট 1 টি
বুলে

4
while(1)সি # তে বৈধ নয়, যেহেতু 1এটি একটি নয় bool
পাভেল মিনায়েভ

48

হাঁসফাঁস, ব্যবহার:

while (!false)
{

}

বা জাইটসাইড হিসাবে উল্লেখ করা হয়েছে, আপনি দ্বিগুণ নিশ্চিত হতে চাইতে পারেন:

while (!false && true)
{
}

লোকেরা আমার দিকে চিত্কার করার আগে, এটি সমস্ত একই সিআইএল কোড, আমি পরীক্ষা করেছি :)


সর্বকালের সেরা উত্তর।
ল্যারি

38

কয়েকটি পুরানো রসিকতা পুনঃস্থাপন করতে:

  1. " for (;;) {}" ব্যবহার করবেন না - এটি বিবৃতিটি কাঁদে।
  2. অবশ্যই, যদি না আপনি অবশ্যই " #define EVER ;;"।

25
বা #define ever (;;)যা আমি বেশি পঠনযোগ্য বলে মনে করি। for ever {}
ক্রিস লুটজ

4
আমি ভাবি নি যে আপনি সি # তে কখনও একটি # ডিফাইন করতে পারেন (যদিও;) যদিও রসিকতা মজার মজাদার :)
অ্যালেন রাইস

4
আহ। আমি ওএস এক্স-তে সি প্রোগ্রাম করি I আমি জানতাম না যে সি # প্রিপ্রোসেসরটি এত কাস্ট্রেট হয়েছে। আমি কীভাবে এই প্রশ্নটি পড়তে শুরু করি তা সম্পর্কে আমি নিশ্চিত নই, আমার কাছে সি # একটি অবহেলিত ট্যাগ হিসাবে রয়েছে ...
ক্রিস লুটজ

সি # প্রিপ্রোসেসর প্রকৃতপক্ষে প্রিপ্রসেসর নয়, কমপক্ষে সি, সি ++, পিএল / 1 এবং এমনকি ম্যাক্রো এসেম্বেবলাররা যা সরবরাহ করেন তার নিরিখে নয়। এটি কেবলমাত্র প্রিপ্রোসেসর প্রতীকগুলি সংজ্ঞায়িত / সংজ্ঞা দিয়ে কোডের ব্লকগুলিকে সক্ষম বা অক্ষম করতে দেয়।
ডেভিড আর ট্রিবল 18

6
বা আরও ভাল #define forever while(true)
:;

26

আপনি যদি পুরানো স্কুলে যেতে চান তবে গোটো এখনও সি # তে সমর্থিত:

STARTOVER:  
    //Do something
    goto STARTOVER;

সত্যিকারের অসীম লুপের জন্য, এটি হ'ল কমান্ড। =)



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

@ লোডমাস্টার: ধন্যবাদ, আমি এটিকে অন্য বিকল্প হিসাবে কেবল সেখানে ফেলে দিচ্ছিলাম, অগত্যা এটি সমর্থন করেই নয়।
জনএফএক্স

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

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


10

সেই পরিস্থিতিতে যেখানে আমার সত্যিকারের অসীম লুপের প্রয়োজন ছিল, আমি সর্বদা ব্যবহার করেছি

while(true) {...}

এটি বিবৃতিতে খালি চেয়ে অভিপ্রায়টি আরও ভাল বলে মনে হচ্ছে।


10

ব্যক্তিগতভাবে, আমি সর্বদা for(;;)সুনির্দিষ্টভাবে পছন্দ করেছি কারণ এর কোনও শর্ত নেই ( while (true)যার বিপরীতে একটি সর্বদা-সত্য থাকে)। যাইহোক, এটি সত্যিই একটি খুব ছোট স্টাইল পয়েন্ট, যা আমি মনে করি না যে কোনওভাবেই তর্ক করা উচিত। আমি এখনও একটি সি # শৈলীর গাইডলাইন দেখতে পাই যা বাধ্যতামূলক বা উভয় পদ্ধতির প্রবেশ নিষিদ্ধ।


.NET নেই মূল্য না, যখন কম্পাইলার রূপান্তরিত আপনার (খারাপ পাঠযোগ্য) জন্য একটি শর্ত ছাড়া যখন শর্ত।
serhio

4
@ সেরিও: দয়া করে "সংকলক রূপান্তর ... একটি while" দ্বারা আপনার অর্থ কী তা ব্যাখ্যা করুন । প্রোগ্রামার হিসাবে, সংকলক উচ্চ-স্তরের কোডকে আইএল রূপান্তর করে। আইএলে কোনও while(বা for) লুপ নেই, কেবলমাত্র লেবেল এবং গোটো রয়েছে।
পাভেল মিনায়েভ

4
পিয়েরে-আলাইন ভিজিয়েন্টের উত্তর দেখুন।
Serhio

4
"উত্তর সংকলক উভয়ের জন্য অভিন্ন আইএল উত্পন্ন করে" হিসাবে তার উত্তরটি আরও ভালভাবে পুনঃব্যবস্থা করা যেতে পারে (আপনি সত্যই জানেন না যে এটি কখন এএসটি স্তরে কোনও কিছুর রূপান্তরিত করে, এবং এটি কোনও অবস্থাতেই বাস্তবায়নের বিবরণ)। যাই হোক না কেন, এটি ".NET এর পক্ষে উপযুক্ত নয়" এর ব্যাখ্যা দেয় না। সি ++, জাভা ... তেও একই কথা ...
পাভেল মিনায়েভ

6

আমি ব্যক্তিগতভাবে for (;;)আইডিয়ামটি পছন্দ করি (একটি সি / সি ++ দৃষ্টিকোণ থেকে আসা)। যদিও আমি একমত যে এটি while (true)এক অর্থে আরও পঠনযোগ্য (এবং এটি আমি যখন সি / সি ++ তেও ছিলাম ফিরে এসেছি), আমি এই forপ্রতিচ্ছবিটি ব্যবহার করার দিকে মনোযোগ দিয়েছি কারণ:

  • এটা দাঁড়ানো

আমি মনে করি যে লুপটি শেষ হয় না (একটি সাধারণ ফ্যাশনে) 'কলিং আউট' মূল্যবান এবং আমি মনে করি এটি for (;;)আরও কিছুটা করে।


অবশেষে, এটি ব্যবহার করে আমরা প্রোগ্রামগুলি
সংকলিত

4
@ সেরিও: আসলেই না। এটা না রুপান্তর থেকে এটা forকরার জন্য while। উভয়ের জন্য for (;;){}এবং while (true){}এটি নতুন while(true){}কোড উত্পন্ন করে । এই উত্তর দেখুন ।
wchargin

6

সি এর জন্য মূল কে অ্যান্ড আর বই, যা থেকে সি # এর পূর্বসূরিকে সনাক্ত করতে পারে

for (;;) ...

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

সংযোজন (ফেব্রুয়ারী 2017)

অবশ্যই, যদি আপনি ভাবেন যে এই লুপিং ফর্মটি (বা অন্য কোনও ফর্ম) খুব ক্রিপ্টিক, আপনি সর্বদা একটি মন্তব্য যুক্ত করতে পারেন ।

// Infinite loop
for (;;)
    ...

বা:

for (;;)    // Loop forever
    ...

4
হ্যাঁ, তবে এটি সি এর জন্য নয়, সি # এর জন্য নয়।
Serhio

4
এটি সি # তে কাজ করে। এবং সি # ভাষা সি থেকে উদ্ভূত হয়েছে (অপ্রত্যক্ষভাবে)
ডেভিড আর ট্রিবিলে

4
8 বছর পরে আপনি নিজের উত্তর আপডেট করার সিদ্ধান্ত নিয়েছেন। ভাল
মেটোনিয়াম

4

এটি হওয়া উচিত while(true)নয় while(1), তাই while(1)সি # তেও ভুল, হ্যাঁ;)


3

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

যদিও আমি এটির মতো করি:

for (float f = 16777216f; f < 16777217f; f++) { } 

4
-1: সবাই কোডটি পড়ে আপনার "অসীম লুপ" বুঝতে পারবেন না, সম্ভবত কেউ এটি একটি বাগ হিসাবে ভাবতে পারে এবং এটি "সংশোধন" করার চেষ্টা করতে পারে ...
সেরিও

সি # f < 16777217fতে সর্বদা false... তাই এটি কখনই লুপ করে না।
নেটমেজ

2

আমি কিছুটা বেশি "সাক্ষর" কোড পছন্দ করি। অনুশীলনে আমি এরকম কিছু করার সম্ভাবনা অনেক বেশি:

bool shouldContinue = true;
while (shouldContinue)
{
    // ...

    shouldContinue = CheckSomething();
}

4
উঃ আসলে, এটি do ... while()ছদ্মবেশ একটি লুপ। এটি দেখতে আমার কয়েক সেকেন্ড সময় লেগেছে। আপনি যদি একটি do ... while()লুপ লিখে থাকেন তবে তা অবিলম্বে পরিষ্কার হয়ে যেত। -1
এসবিআই

আপনি যখন (সত্য) ব্যবহার করতে পারবেন তখন কেন সময় এবং সংস্থানকে পরিবর্তনশীল হিসাবে ঘোষণা করে? এটি আমার মতে
অর্থবোধ

আমি এটিকে আরও পঠনযোগ্য বলে মনে করি, বিশেষত যদি আপনি একটি নির্দিষ্ট অর্থবহুল পতাকা সংযুক্ত করতে পারেন, যেমন "যখন (! This.canceled)" নির্দেশ করে যে বাতিল হওয়া লুপটি থামানোর একমাত্র উপায়, "যখন (প্রক্রিয়াটি উত্তেজিত)" লুপটি নির্দেশ করে? বাহ্যিক প্রক্রিয়া চলে না যাওয়া পর্যন্ত চলতে হবে ইত্যাদি etc. There things argu lots lots lots।।।।।।।।।।।।।। "যখন (সত্য)" সব খারাপ নয়, তবে আমার অভিজ্ঞতায় সাধারণত আরও ভাল উপায় থাকে।
ববিএমসিআর

4
+1 বেশিরভাগ ক্ষেত্রে, সত্যিকারের অসীম লুপটি আসলে যা ঘটে তা নয় এবং আপনার কিছু শর্ত রয়েছে যেখানে আপনি থামাতে চান (যেমন প্রিন্টারে আগুন লাগলে)।
মিথ্যা রায়ান

4
… কোন ক্ষেত্রে আপনার ব্যবহার করা উচিত break
রাই-

2

এমনকি আমি এটিও বলেছি যে নীচেরটিটি আরও ভাল :)

while(true)
{

}

1

আপনি যদি কোড-গল্ফিং হন তবে আমি পরামর্শ দেব for(;;)। এর বাইরেও while(true)একই অর্থ রয়েছে এবং আরও স্বজ্ঞাত বলে মনে হচ্ছে। যে কোনও হারে, বেশিরভাগ কোডার সম্ভবত উভয় প্রকারগুলি বুঝতে পারবেন, তাই এটি আসলেই কিছু যায় আসে না। সবচেয়ে আরামদায়ক যা ব্যবহার করুন।


4
আপনি যদি গল্ফ করছেন তবে সি # হ'ল যাইহোক ভুল ভাষা।
সিঙ্গেলাইজেশন ইলিমিনেশন

1

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

যদি পারফরম্যান্সের কোনও পার্থক্য থাকে তবে আমি নিশ্চিত এমএসআইএলে অনুবাদটি অপ্টিমাইজ করবে। আপনি যদি সত্যিই এটি চান তা পরীক্ষা করতে পারেন।


1

কেবলমাত্র আমি বলতে চাইছি for(;;)কোডডম সীমাবদ্ধতার কারণে (যখন কোডডম ব্যবহার করে লুপগুলি ঘোষণা করা যায় না এবং লুপগুলির জন্য পুনরাবৃত্তির লুপ হিসাবে আরও সাধারণ ফর্ম হিসাবে দেখা হয়)।

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

একটি নোট হিসাবে, আপনি একটি whileলুপ তৈরি করতে কোড স্নিপেট ব্যবহার করতে পারেন , তবে পুরো লুপটির একটি স্নিপেট হওয়া দরকার ...


1

তাদের উভয় একই ফাংশন আছে, কিন্তু মানুষ সাধারণত পছন্দ করে while(true)। এটি পড়া এবং বুঝতে সহজ মনে হয় ...


0

যে কোনও এক্সপ্রেশন যা সর্বদা সত্য ফিরে আসে তা লুপের জন্য ঠিক থাকে।

উদাহরণ:

1==1 //Just an example for the text stated before 
true

সত্য যখন কাজ করে তখন কেন আপনি কখনই 1 = 1 এর মতো তুলনা করতে বাধ্য করবেন? গণনাযুক্ত এক্সপ্রেশন ব্যবহার করে NUMBER_OF_ARMS = 598-3596 এর মতো ধ্রুবককে সংজ্ঞায়িত করার মতো নির্বোধ মনে হয়;
জনএফএক্স

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