"((;;))" "যখন (সত্য)" এর চেয়ে দ্রুত? যদি তা না হয় তবে লোকেরা কেন এটি ব্যবহার করবে?


164
for (;;) {
    //Something to be done repeatedly
}

আমি এই ধরণের জিনিসটি প্রচুর ব্যবহৃত দেখেছি, তবে আমি মনে করি এটি বরং অদ্ভুত ... এই ধরণের while(true)লাইন ধরে আরও কিছু বলা কি পরিষ্কার হবে না ?

আমি অনুমান করছি যে (বহু-এ-প্রোগ্রামার ক্রিপ্টিক কোড অবলম্বন করার কারণ হিসাবে) এটি একটি ছোট মার্জিনটি দ্রুত?

কেন, এবং এটি কি সত্যই মূল্যবান? যদি তা হয় তবে কেন এটি কেবল এইভাবে সংজ্ঞায়িত করা হবে না:

#define while(true) for(;;)

আরও দেখুন: কোনটি দ্রুত: যখন (1) বা যখন (2)?


51
কি TRUE???
এএনটি

20
@ স্টিভেন সুদিত: TRUEসি এর সাথে কী করার আছে? সি 99 এর সত্যিকারের বোলেন ফলাফলের জন্য মানক ম্যাক্রো এখনও রয়েছে true। কোথা TRUEথেকে এল?
এএনটি

31
এই ম্যাক্রো কাজ করে না, #define EVER ;;যদিও আইওসিসি-তে ব্যবহৃত হয়েছে .. :)

18
যে ম্যাক্রো এমন ম্যাক্রো #define while(TRUE)ঘোষণার জন্য নয় যা একটি যুক্তি নেয় TRUEযা কখনও ব্যবহৃত হয় না, তাই আপনার প্রোগ্রামের লুপটি যখন একটি অনন্ত লুপে পরিণত হয় তখন প্রত্যেকটি একক করে?
অ্যাশলেসব্রিন

9
@ স্টিভেন সুদিত: না। "ভিএস 6.0 এ স্ট্যান্ডার্ড ম্যাক্রো" নেই। ম্যাক্রো TRUEউইন্ডোজ এপিআইয়ের সাথে যুক্ত হেডার ফাইলগুলি থেকে আসে। এটি কোনওভাবেই ভিএস 6.0 এর সাথে সম্পর্কিত নয়। এবং, যেমনটি আমি আগেই বলেছি, এর সি বা সি ++ এর সাথে কোনও সম্পর্ক নেই। সি ++ এ "সত্য" আক্ষরিকটি কেবল true(ভিএস 6.0 তেও), সি 98/90 এ তেমন কিছুই নেই, এবং সি 99 এ ম্যাক্রো true। এটি সমস্ত সি / সি ++ কম্পাইলারের ক্ষেত্রে প্রযোজ্য।
এএনটি

উত্তর:


262
  1. এটি দ্রুত নয়।
  2. আপনি যদি সত্যিই যত্নবান হন তবে আপনার প্ল্যাটফর্মের জন্য এসেম্বলারের আউটপুট দিয়ে সংকলন করুন এবং দেখুন look
  3. এটা কোন ব্যাপার না। এটি কখনই গুরুত্বপূর্ণ নয়। আপনার পছন্দ মতো আপনার অসীম লুপগুলি লিখুন।

227
স্বজ্ঞাতভাবে, একটি অসীম লুপটি অপ্টিমাইজ করা অসীম গতির জন্য সম্ভাবনা সরবরাহ করে। ভাল জিনিস আমরা অন্তর্দৃষ্টি উপর প্রোগ্রাম না, তারপর। :-)
স্টিভেন সুদিত

5
আমার ধারণা আপনি ঠিক আছেন আমি মনে করি ছোট জিনিস সম্পর্কে আমি "ধর্মীয়" বিতর্কে জড়িয়ে পড়েছিলাম। আমার বিবেককে looseিলে .ালা করার জন্য ধন্যবাদ : ডি
ক্রিস কুপার

6
@ স্টিভেন এলওএল, এটি আকর্ষণীয় তবে বিবেচনা করুন যে আপনি কেবলমাত্র অসীম গতিবেগের সম্ভাবনাটিতে পৌঁছেছেন যখন লুপটি কখনও ভেঙে না যায় এবং সত্যই অসীমভাবে চালিত হয়, সম্ভবত এটি কোনও বাগ, বা যদি উদ্দেশ্য হয় তবে তা হবে এটি সম্ভাবনা পৌঁছানোর আগে একটি অসীম অপেক্ষা।
হারুনএলএস

7
@Chris। জীবনের মতো প্রোগ্রামিংয়ে, ধর্মীয় বিতর্কগুলি সত্যই গুরুত্বপূর্ণ বিষয়গুলির জন্য আপনার সময়ের জন্য উপযুক্ত। এটি কেবল এই জিনিসগুলির মধ্যে একটি নয়। আপনি দেখতে পাচ্ছেন যে, প্রত্যেকেরই একটি অবিরত লুপ লেখার একটি পোষ্য উপায় রয়েছে। আপনাকে ছোট জিনিসগুলির জন্য সবচেয়ে খুশী করে তোলে তা নিজের জন্য চয়ন করুন এবং তারপরে গুরুত্বপূর্ণ কোডটিতে আপনার প্রোফাইলারটি চালান। :)
বেন জোটো

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

176

আমি for(;;)দুটি কারণে পছন্দ করি ।

একটি হ'ল কিছু সংকলক এতে সতর্কতা তৈরি করে while(true)("লুপের অবস্থাটি ধ্রুবক" এর মতো কিছু)। সতর্কতা এড়ানো সর্বদা একটি ভাল কাজ।

আর একটি হ'ল আমি মনে করি for(;;)এটি আরও পরিষ্কার এবং আরও বেশি বলা। আমি একটি অসীম লুপ চাই এটা আক্ষরিক হয়েছে কোন অবস্থা, এটা কিছুই উপর নির্ভর করে। আমি এটিকে চিরতরে চালিয়ে যেতে চাই, যতক্ষণ না আমি এর থেকে বেরিয়ে আসার জন্য কিছু করি।

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

এবং না, একেবারে পারফরম্যান্সের পার্থক্য নেই।


73
সতর্কতা এড়ানোর জন্য +1। তবে স্পষ্টতা হিসাবে, আমি এই প্রসঙ্গে তুলনায় আরও স্পষ্ট মনে করি। আমি অনুমান করি যে দিকটি কেবল ব্যক্তিগত পছন্দকে নেমে আসে।
টিম

14
হ্যাঁ, পছন্দ এবং অভ্যাস। যদি আপনি দেখার অভ্যস্ত না হন তবে for(;;)এটি অবশ্যই অদ্ভুত লাগবে look কিন্তু আমি এটি ব্যবহার করতে পারেন, কারণ এটি চেষ্টা বলতে চাই হয় একটি সাধারণ বাগ্ধারা, এবং আপনি আবার তা চালানোর জন্য যাচ্ছি। ;)
জাল্ফ

7
এটি অহংকারী হিসাবে জালফের মন্তব্যটি এখানে সত্যই উত্তর answer এটি "অসীম লুপ" এর জন্য সাধারণত ব্যবহৃত হয় কারণ এটি সি'তে "অসীম লুপ" লেখার সাধারণভাবে ব্যবহৃত উপায় কোনও মূর্খতার জন্য কোনও ভাল কারণ থাকতে হবে না - এটি কেবল একটি স্ব-চাঙ্গা কনভেনশন।
ক্যাফে

7
@ স্টিভ: আমি কেন কখনও ব্যবহার করব তা দেখছি না for(;condition;)। কিছুক্ষণের জন্য এটি লুপ হয় । তবে আমি যেমন বলেছিলাম, অসীম লুপের সাহায্যে, আমি সত্যিই চাই না যে সংকলকটি কোনও শর্তের তুলনা করবে । নিঃসন্দেহে, একটি whileলুপ দিয়ে, এটি trueপ্রতিটি পুনরাবৃত্তি পরীক্ষা করতে হবে (স্পষ্টতই, নির্বোধ সংকলকও এটি করবে না, তবে এটি নীতিই আমাকে বিরক্ত করে It এটি আমাকে আপনার কোডকে অবিচ্ছিন্ন হিসাবে আঘাত করে), যখন for(;;)আপনি আক্ষরিকভাবে বলছেন "পরীক্ষার কোনও শর্ত নেই। কেবল লুপ"। আমি এটিকে আপনার কাল্পনিকের নিকটতম সমতুল্য বলে মনে করিloop {...}
jalf

32
while(true)কোনও সংকেত দিলে আপনার সংকলক চুষে যায়।
অ্যালবার্ট

56

ব্যক্তিগতভাবে আমি ব্যবহার করি for (;;)কারণ এতে কোনও সংখ্যা নেই, এটি কেবল একটি কীওয়ার্ড। আমি পছন্দ এটি while (true), while (1), while (42), while (!0)ইত্যাদি ইত্যাদি


38
0, 1 এবং অনন্তটি গ্রহণযোগ্য যাদু সংখ্যা, 0 এবং 1 টি মিথ্যা ও সত্য পর্যন্ত প্রসারিত কোনও ক্ষতি নয়। ম্যাজিক কীওয়ার্ডের trueচেয়ে কোনও ম্যাজিক সংখ্যা আর forযা for(;;)কোনও অন্তর্নিহিত যাদু অনন্ত ব্যবহার করে। ( while (42)প্রকৃতপক্ষে একটি ঘৃণা।)

38
স্পর্শকাতর: আমার একজন সিএস অধ্যাপক বলেছিলেন "প্রোগ্রামিংয়ে কেবল তিনটি সংখ্যা রয়েছে: 0, 1 এবং এন। অন্য যে কোনও কিছুকে যাদু নম্বর বলা হয়।"
বেন জোটো

21
(৪২) শীতলতম, (১) বা যখন (সত্য) অথবা যখন (! 0) এর সাথে সম্মতিযুক্ত কোনও ভিন্ন ফলাফল দেয় না এবং এর দার্শনিক অর্থ রয়েছে। আমি মনে করি for(;;)যেভাবেই হোক অন্যের তুলনায় দ্রুত পার্স করা হয়েছে
শিনটেকজৌ

2
@ শিনটাকেজু এর থেকে অনেক বেশি ভাল #define LIFE 42 while (LIFE):)
এমআর 5

1
ভাল while(true)কোন সংখ্যা নেই। এবং (;;) এর জন্য কোনও কীওয়ার্ড নয়
রিয়াদ

49

কারণ ডেনিস রিচি

  • আমি ব্যবহার শুরু করেছি for (;;)কারণ ডেনিস রিচি যেভাবে কে ওআর তে এটি করে এবং নতুন ভাষা শেখার সময় আমি সর্বদা স্মার্ট ছেলেদের অনুকরণ করার চেষ্টা করি।

  • এটি আইডেম্যাটিক সি / সি ++। আপনি যদি সি / সি ++ স্পেসে অনেক কিছু করার পরিকল্পনা করে থাকেন তবে এটির অভ্যস্ত হওয়ার জন্য দীর্ঘমেয়াদে সম্ভবত এটি আরও ভাল।

  • আপনার #defineকাজ করবে না, যেহেতু # সংজ্ঞায়িত জিনিসটি সি সনাক্তকারী হিসাবে দেখতে হবে look

  • সমস্ত আধুনিক সংকলক দুটি নির্মাণের জন্য একই কোড উত্পন্ন করবে।


10
হ্যাঁ, আপনি কীভাবে কে ওআরআর থেকে কে সি শিখেছেন, এটি যেভাবে শেখা উচিত তা এইভাবেই আপনি জানেন। আমি যখনই দেখি while(TRUE), আমি সন্দেহ করি যে প্রোগ্রামারটি একজন সি নবাগত, বা ফর ডামি বই থেকে সি শিখেছে।
ক্রিস্টোফার জনসন

13
আমি শুনেছি those নতুনারা নতুন ফ্যাংড ফাংশন সংজ্ঞা স্টাইলটিও ব্যবহার করে।
জাস্টিন

46

এটি অবশ্যই কোনও বুদ্ধিমান সংকলকটিতে দ্রুত নয়। তারা উভয়ই নিঃশর্ত জাম্পে সংকলিত হবে। সংস্করণটির জন্য টাইপ করা সহজ (যেমন নীল বলেছেন) এবং লুপ সিনট্যাক্সের জন্য বুঝতে পারলে স্পষ্ট হবে।

আপনি যদি কৌতূহলী হন তবে এখানে জিসিসি 4.4.1 আমাকে x86 এর জন্য দেয়। উভয়ই x86 জেএমপি নির্দেশ ব্যবহার করে ।

void while_infinite()
{
    while(1)
    {
    puts("while");
    }
}

void for_infinite()
{
    for(;;)
    {
    puts("for");
    }
}

সংকলন (অংশে):

.LC0:
.string "while"
.text
.globl while_infinite
    .type   while_infinite, @function
while_infinite:
    pushl   %ebp
    movl    %esp, %ebp
    subl    $24, %esp
.L2:
    movl    $.LC0, (%esp)
    call    puts
    jmp .L2
    .size   while_infinite, .-while_infinite
    .section    .rodata
.LC1:
    .string "for"
    .text
.globl for_infinite
    .type   for_infinite, @function
for_infinite:
    pushl   %ebp
    movl    %esp, %ebp
    subl    $24, %esp
.L5:
    movl    $.LC1, (%esp)
    call    puts
    jmp .L5
    .size   for_infinite, .-for_infinite

আমি সন্দেহ করি এটি ডিবাগ মোডেও দ্রুত।
স্টিভেন সুদিত

106
for_infiniteদ্রুততর; 2 কম অক্ষর puts
ডেভ জার্ভিস

43

আমি পছন্দ করি for (;;) কারণ এটি বিভিন্ন সি-জাতীয় ভাষায় সর্বাধিক সামঞ্জস্যপূর্ণ।

সি ++ while (true)তে ঠিক আছে, তবে সিতে আপনি সংজ্ঞায়িত করতে একটি শিরোলেখের উপর নির্ভর করেন true, তবে TRUEএটি সাধারণত ব্যবহৃত ম্যাক্রোও। আপনি ব্যবহার করেন তাহলে while (1)এটা সি এবং C ++ সঠিক, এবং জাভাস্ক্রিপ্ট, কিন্তু না জাভা বা C #, যা লুপ শর্ত প্রয়োজন একটি বুলিয়ান যেমন হতে while (true)বা while (1 == 1)। পিএইচপি-তে, কীওয়ার্ডগুলি কেস-সংবেদনশীল তবে ভাষা মূলধনকে পছন্দ করে TRUE

যাইহোক, for (;;)languages ​​সমস্ত ভাষায় সর্বদা সম্পূর্ণ সঠিক।


9
আপনার উত্তরের জন্য ধন্যবাদ! আমি মনে করি এটি আসলে প্রথম উত্তর যা একটি উদ্দেশ্যমূলক উপায় দেখায় for (;;)যা আরও ভাল।
ক্রিস কুপার

8
আমি মনে করি না যে আমাকে সি, সি ++, জাভাস্ক্রিপ্ট, জাভা এবং সি # তে সঠিক কোড লিখতে হবে। তারা বিভিন্ন ভাষা।
কিথ থমসন

6
@ কিথথম্পসন এটি লেখার কোড সম্পর্কে নয় যা অনেক ভাষায় সঠিক; আমি মনে করি এটি বিভিন্ন পটভূমি সহ বিকাশকারীদের মধ্যে ভুল ব্যাখ্যাটি এড়ানো সম্পর্কে।
মাউরো সাম্পিয়েট্রো

6
@ স্যাম: উভয়ই while (1)এবং for (;;)সি-তে অসীম লুপগুলির জন্য সাধারণ আইডিয়া i যে কোনও সি প্রোগ্রাম পড়লে যে কেউ হয় বুঝতে অসুবিধে হয় তার বাকি কোডটিতে সমস্যা হতে পারে। সি কোডটি লেখার পক্ষে উপযুক্ত নয় যা সি জানে না এমন কেউ সহজেই পড়তে পারে
কেথ থম্পসন

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

21

আমি ব্যক্তিগতভাবে for (;;)আইডিয়ামটি পছন্দ করি (যা একই কোডে সংকলিত হবে)while (TRUE)

ব্যবহার while (TRUE)এক দিক থেকে আরও পঠনযোগ্য হতে পারে, আমি for (;;)মুশকিলটি ব্যবহার করার সিদ্ধান্ত নিয়েছি কারণ এটির অবস্থানটি বাইরে

একটি অসীম লুপ কনস্ট্রাক্ট সহজেই লক্ষ্য করা উচিত বা কোডে কল করা উচিত এবং আমি ব্যক্তিগতভাবে মনে করি for (;;)শৈলীটি এর চেয়ে কিছুটা ভাল করে while (TRUE)বাwhile (1)

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


17

আমি কিছু লোককে এটি পছন্দ করতে দেখেছি কারণ তাদের কোথাও এই জাতীয় # ডেফাইন রয়েছে:

#define EVER ;;

যা তাদের এটি লিখতে দেয়:

for (EVER)
{
    /* blah */
}

24
আমিও তা দেখেছি; তবে এটি পছন্দ করার পক্ষে ভাল কারণ নয়। একজন রক্ষণাবেক্ষণকারী হিসাবে, আপনাকে এখনও ম্যাক্রো সংজ্ঞাটি যাচাই করতে হবে তা নিশ্চিত করতে হবে যে এটি আপনি যা প্রত্যাশা করেছিলেন তা করেছে, মূল কোডটি যথেষ্ট পরিষ্কার ছিল। আরটিওএস ভেক্স ওয়ার্কসের একটি ম্যাক্রো FOREVERসংজ্ঞায়িত করা হয়েছে for(;;)তবে এটি এর চেয়ে ভাল আর নয়। আইএমও ম্যাক্রোগুলি একটি নতুন ভাষা 'আবিষ্কার' করতে ব্যবহার করা উচিত নয়।
ক্লিফোর্ড

8
আসলে কিছু ভাষায় ম্যাক্রোগুলির উদ্দেশ্য হ'ল নতুন সিনট্যাক্স আবিষ্কার করা। তবে নির্বিশেষে সি / সি ++ এর 'ফর (এভার)' জঘন্য।
ড্যান ওলসন

15
কিছু মানুষ, মজার জিনিস করতে যদি তারা পাসকাল মত তারা বলে মত #define BEGIN {এবং #define END }। আমি এমনকি দেখেছি #define DONKEYS_FLY (0)যাতে তারা বলতে পারে if DONKEYS_FLY ...। কে বলে সফ্টওয়্যার নিস্তেজ?
মাইক ডুনলাভে

11
ক্যালিফোর্নিয়ায় আমি আপনাকে বোকা বানাচ্ছি আপনাকে (;;) LIKE_FOREVER
মার্টিন বেকেট

1
আমি প্রতিরোধ করতে পারিনি: #define never while(0)এবং#define always
alfC

16

কী সম্পর্কে (যদি আপনার ভাষা এটি সমর্থন করে):

start:
/* BLAH */
goto start;

... যা কোনও যুক্তিসঙ্গত সংকলকের হাতে অভিন্ন আউটপুট উত্পন্ন করা উচিত।
বেন জোটো

9
+1! এটি gotoএর অসংখ্য অসুবিধাগুলি কমিয়ে দেয় না তবে, আপনি যে অ্যালগরিদমটি প্রয়োগ করার চেষ্টা করছেন সেটি যদি একটি ফ্লো-চার্ট থেকে আসে তবে এটি সর্বাধিক প্রত্যক্ষ অনুবাদ।
এডমন্ড

4
আমি গোটো সম্পর্কে ব্যক্তিগতভাবে দৃষ্টিভঙ্গি গ্রহণ করি। কোনও ধর্ষক নেই। ধর্ষকরা মানুষ। এবং এটি সেই ব্যক্তিরা যারা স্প্যাগেটি কোড তৈরি করতে গোটো ব্যবহার শুরু করেছিলেন। এছাড়াও, একটি লুপের জন্য একত্রিত আউটপুট দেখতে বেশ সুন্দর লাগে। কম্পিউটারগুলির জন্য নির্দেশাবলী সেটগুলিতে "জন্য" বা "যখন" কেবল "লাফান" এর ধারণা নেই।
জোসফাতভ

কখনও কখনও ব্যবহার করবেন নাgoto
এডওয়ার্ড কারাক

সত্যিই দুর্দান্ত জিনিসটি gotoহ'ল breakআপনার লুপটি কম সীমাহীন করার জন্য আপনাকে কেউ যুক্ত করার বিষয়ে চিন্তা করতে হবে না । (যদি না আপনি ইতিমধ্যে অন্যের ভিতরে থাকেন whileবা forঅবশ্যই লুপ ...)

12

উত্পাদিত মেশিন কোডের ক্ষেত্রে কোনও পার্থক্য নেই।

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


6
এটি আপনার ভাষার উপর নির্ভর করে। for(;;)এটি সি এবং সি ++ এ করার theতিহ্যগত উপায়। while(true)সি # এবং জাভা এবং অন্যান্য ভাষায় এই সম্মেলন বলে মনে হচ্ছে। আপনার মাইলেজ পরিবর্তিত হতে পারে.
বিলি ওনিল

9
হ্যাঁ, এবং যে কেউ সি বা সি ++ এর সাথে খুব বেশি পরিচিত নন তিনি এসআরএসএফের চেয়ে STRING_SCAN_FORMATTED বেশি পঠনযোগ্য খুঁজে পেতে পারেন তবে আপনি তাদের কোডের শীর্ষে # ডিফাইন STRING_SCAN_FORMATTED স্ক্যান্ফ লাগিয়ে দেখছেন না।
ta.speot.is

4
আমি করছেন এটা কথ্য পথ বলতে চাই অনেক ভালো থাকতো আপনার বিকাশকারী সবচেয়ে পাঠযোগ্য হবে। অন্যথায় আপনার আরও ভাল বিকাশকারী প্রয়োজন need
jalf

5
@ ডেস্পার্ট: যদি কেউ কারও কাছে সেই আইডিয়োমটি সনাক্ত করার জন্য সি ++ এর সাথে যথেষ্ট পরিচিত না হয় তবে তাদের আমার কোডবেস থেকে দূরে থাকতে হবে।
বিলি ওনিল

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


11
while(true)

ভিজ্যুয়াল স্টুডিও সহ একটি সতর্কতা উত্পন্ন করে (শর্ত স্থির থাকে)। বেশিরভাগ জায়গাগুলি আমি সংকলন উত্পাদনকে ত্রুটি হিসাবে সতর্কতা দিয়ে তৈরি করি। সুতরাং

for(;;)

পছন্দসই


7
আপনি ভিজ্যুয়াল স্টুডিওর কোন সংস্করণ ব্যবহার করছেন? ২০০৮ এর সাথে আমি এই সতর্কতাটি পেয়েছি না, এমনকি সতর্কবার্তা পর্যায়েও 4.
জর্জেন সিগওয়ার্ডসন

11

উভয়ই একই হতে হবে যদি আপনার কোডটি সংকলক দ্বারা অনুকূলিত হয়। অপ্টিমাইজেশনের মাধ্যমে আমি কী বোঝাতে চাই তা বোঝাতে এখানে এমএসভিসি 10 তে একটি নমুনা কোড লেখা রয়েছে:

int x = 0;

while(true) // for(;;)
{
    x +=1;

    printf("%d", x);
}

যদি আপনি এটি ডিবাগ মোডে ( কোনও অপ্টিমাইজেশন (/ ওডি) ছাড়াই) তৈরি করেন তবে স্পষ্টত পার্থক্য দেখায় dis trueভিতরে অবস্থার জন্য অতিরিক্ত নির্দেশাবলী রয়েছে while

while(true)
00D313A5  mov         eax,1                //extra 
00D313AA  test        eax,eax              //extra
00D313AC  je          main+39h (0D313B9h)  //extra
    {
        x +=1;
00D313AE  mov         eax,dword ptr [x]  
00D313B1  add         eax,1  
00D313B4  mov         dword ptr [x],eax  
    printf("%d", x);
    ...
    }
00D313B7  jmp         main+25h (0D313A5h)  


for(;;)
    {
        x +=1;
00D213A5  mov         eax,dword ptr [x]  
00D213A8  add         eax,1  
00D213AB  mov         dword ptr [x],eax  
    printf("%d", x);
    ...
    }
00D213AE  jmp         main+25h (0D213A5h)  

তবে, আপনি যদি রিলিজ মোডে আপনার কোডটি তৈরি করেন (ডিফল্ট ম্যাক্সিমাইজ স্পিড (/ ও 2) সহ ) আপনি উভয়ের জন্য একই আউটপুট পাবেন। দুটি লুপ এক লাফ নির্দেশে হ্রাস পেয়েছে।

for(;;)
    {
        x +=1;
01291010  inc         esi  

        printf("%d", x);
    ...
    }
0129101C  jmp         main+10h (1291010h)  

    while(true)
    {
        x +=1;
00311010  inc         esi  

        printf("%d", x);
    ...
    }
0031101C  jmp         main+10h (311010h)  

আপনি যে কোনওটিই ব্যবহার করবেন না কেন দ্রুত গতি অপ্টিমাইজেশন সহ একটি শালীন সংকলকের জন্য কিছু যায় আসে না।


এটি আসলে খুব ভাল পয়েন্ট! অপ্টিমাইজেশন ছাড়াই এমনকি আধুনিক সংকলকগুলি বিভিন্ন নির্দেশাবলীর দ্বারা পৃথক হবে।

9

এটি কোন ব্যক্তিগত পছন্দের বিষয়, কোন দিকটি দ্রুত। ব্যক্তিগতভাবে, আমি একজন টাচটাইপস্ট এবং প্রোগ্রামিং চলাকালীন কখনই আমার কীবোর্ডের দিকে তাকাব না - আমি আমার কীবোর্ডের সমস্ত 104 কী টাচ টাইপ করতে পারি।

আমি "যখন (সত্য)" টাইপ করতে চাই তবে দ্রুত পাই।

আমি মানসিকভাবে কিছু আঙ্গুলের চলাফেরার পরিমাপ যুক্ত করেছি এবং সেগুলি মোট করে তুলেছি। "(;;)" এর পিছনে এবং চতুর্থ (হোম কীগুলি এবং কীগুলির মধ্যে এবং হোম কী এবং শিফট কী এর মধ্যে) চলনের প্রায় 12 কী-প্রস্থ রয়েছে "যখন (সত্য)" প্রায় 14 টি প্রস্থের চলাচল করে এবং চতুর্থ।

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

(আমার টাইপিংয়েস্ট.কম. বেঞ্চমার্ক = 136 ডাব্লুপিএম)


3
আমি বিশ্বাস করি যে ওপি রান টাইম গতির উল্লেখ করছিল, টাইপিং গতি নয়।

আমি জানি. কেবল সেই বেসটিও coverাকতে হয়েছিল।
মার্ক রেজন

7
s / ব্যক্তিগত পছন্দ / স্বতন্ত্র অভ্যাস /
SamB

@ সাম্ব: এস /// এর জন্য মন্তব্য-আপ করুন। এক্সডি এবং হ্যাঁ, যদিও আমি প্রস্তাব দিয়েছি এটি রানটাইম গতির কারণে হতে পারে তবে আমি আসল উত্তরটি জানতাম না। এটি যদি হত তবে আমি খুশি হতাম।
ক্রিস কুপার

চালান time head -10 >/dev/null, প্রতি 10 বার টাইপ করুন, এবং ফলাফলগুলি পরিমাপ করুন। আমি বাজি ধরছি for(;;)যদি আপনি প্রতারণা না করেন তবে আপনি দ্রুত হবেন । আমি প্রায় 14% দ্বারা ছিল।
পিএসকোকিক

6

সমস্ত ভাল উত্তর - আচরণ ঠিক একই হওয়া উচিত।

HOWEVER - ধরুন এটি কোনও পার্থক্য করেছে। মনে করুন তাদের মধ্যে একজন পুনরাবৃত্তির জন্য আরও 3 টি নির্দেশনা নিয়েছে।

আপনার যত্ন করা উচিত?

আপনি কেবল লুপের ভিতরে যা করেন তা প্রায় কিছুই না , যা প্রায়শই ঘটে না

আমার বক্তব্যটি হ'ল মাইক্রো-অপটিমাইজেশন এবং ম্যাক্রো-অপটিমাইজেশন রয়েছে। মাইক্রো-অপটিমাইজেশন হ'ল "ওজন কমাতে চুল কাটা" like


3
আপনি কত ঘন ঘন লোককে ++iবেশি পছন্দ করতে দেখেন i++?
ডেনিস জিকিফুজ

7
@Dennis Zickefoose: মধ্যে পার্থক্য ++iএবং i++সম্ভাব্য উল্লেখযোগ্য হতে পারে iএকটি ক্লাসের একটা নিদর্শন বদলে একটি অন্তর্নিহিত এবং কম্পাইলার তুচ্ছ অপ্টিমাইজেশান প্রযোজ্য নয়। পরামর্শটি হ'ল কোনও অভ্যাস অর্জন করা যাতে এটি গণনা করার সময় আপনাকে খুঁজে না পায়।
ক্লিফোর্ড

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

2
@ ডেনিস জিকিফুজ: আপনি ঠিক বলেছেন। আমি দেখতে পাচ্ছি যে এসও-তে অনেক কিছুই আছে এবং ক্লিফোর্ডের মন্তব্য ঠিক is তদুপরি, এসও তে আমি খুব একটা দেখতে পাই না এমন কিছু আছে এবং এটি 43c স্পিডআপের মতো ম্যাক্রো-অপ্টিমাইজেশন কীভাবে করতে হয়: স্ট্যাকওভারফ্লো / সিকিউশনস / ৯২২666666/২ । সুতরাং আমি আমাদের অগ্রাধিকার সম্পর্কে অবাক।
মাইক ডুনলাভে

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

5

আমি কল্পনা করতে পারি না যে একটি উপযুক্ত সংকলক কোনও আলাদা কোড উত্পন্ন করবে। এমনকি যদি এটি হয় তবে নির্দিষ্ট সংকলকটি যা আরও দক্ষ ছিল তা পরীক্ষা না করে নির্ধারণের কোনও উপায় থাকবে না।

তবে আমি আপনাকে for(;;)নিম্নোক্ত কারণে অগ্রাধিকার দেওয়ার পরামর্শ দিচ্ছি :

  • আমি ব্যবহৃত বেশ কয়েকটি সংকলক যথাযথ সতর্কতা স্তর সেটিংস সহ কিছু সময়ের জন্য (সত্য) ধ্রুবক অভিব্যক্তি সতর্কতা তৈরি করবে।

  • আপনার উদাহরণে ম্যাক্রো সত্যকে আপনি যেমন প্রত্যাশা করেছিলেন তেমন সংজ্ঞায়িত করা হতে পারে না

  • সেখানে অসীম অনেক সম্ভব রূপগুলো হয় যখন লুপ যেমন while(1), while(true), while(1==1)ইত্যাদি .; সুতরাং for(;;)বৃহত্তর সামঞ্জস্যের ফলস্বরূপ।


সত্য # টি সংজ্ঞায়িত সত্য 1 নাও হতে পারে, তবে যে কোনও কোড বেসটি যা while(TRUE)মূল্যায়ন করে তাতে লাভ while(0)হবে না for(;;)
জাস্টিন

@ জাস্টিন: আমি সম্মত, এটি সত্যই বিকৃত হবে, এবং এটি তিনটি যুক্তির মধ্যে সবচেয়ে শক্তিশালী নয়, তবে সি ++ এর ন্যূনল ম্যাক্রো এড়ানোর জন্য বার্জন স্টুস্ট্রুপ অনুরূপ যুক্তি ব্যবহার করেছেন। while(true)যে কোনও ক্ষেত্রে পছন্দ করা উচিত। সি ++ boolএ সংরক্ষিত, এবং সি স্টিডবুল। H এ সি সংজ্ঞায়িত করা হয়েছে (এটি সি তে কম নিরাপদ করে তোলে)। for(;;)সমস্ত সন্দেহ দূর করে।
ক্লিফোর্ড

5
for(;;Sleep(50))
{
    // Lots of code
}

এর থেকে পরিষ্কার:

while(true)
{
    // Lots of code
    Sleep(50);
}

আপনি যদি ব্যবহার না করেন তবে এটি প্রযোজ্য তা নয় Sleep()


1
এটি অভিশাপজনক খারাপ কোড, ঘুমের পরিবর্তে টাইমার ব্যবহার করা উচিত, তাই এটি খারাপ উদাহরণ
এসটি 3

12
@ এসটি 3 - হ্যাঁ, আপনি ঠিক বলেছেন। আমার কোডটি ভয়াবহ। পরের বার যখন আমি অসীম লুপ তৈরি করি তখন আমার আরও চেষ্টা করা উচিত।
আর্মদা

1
@ ফ্রেমো - আপনার ওএসের উপর নির্ভর করে তবে সাধারণত এমন কিছু হয়timerService.scheduleRepeating (50, [] () { /* lots of code */ });
পেরিটা ব্রেটা

2
লুপের মতো ঘুমের মতো কোনও ফাংশন ডাকার মতো পরিষ্কার কিছুই নেই
গ্রেগ

1
ওএমজি, টাইমারসেবা.সচেডুলিপিটিং (50, [] () {}) ঠিক তখন টাইপ করা এবং বোঝার পরে ঘুম (50) বোঝা খুব সহজ।
শীতল জ্যাভালিন

4

"চিরকালের" লুপটি এম্বেড থাকা সিস্টেমে ব্যাকগ্রাউন্ড লুপ হিসাবে জনপ্রিয়। কিছু লোক এটি প্রয়োগ করে:

for (; ;)
{
 // Stuff done in background loop
}

এবং কখনও কখনও এটি হিসাবে প্রয়োগ করা হয়:

while (TRUE /* or use 1 */)
{
 // Stuff done in background loop
}

এবং এখনও অন্য বাস্তবায়ন হ'ল:

do
{
 // Stuff done in background loop
} while (1 /* or TRUE */);

একটি অনুকূলকরণ সংকলক এই টুকরা জন্য একই বা অনুরূপ সমাবেশ কোড উত্পন্ন করা উচিত। একটি গুরুত্বপূর্ণ দ্রষ্টব্য: এই লুপগুলি চিরকাল চলে এবং লুপগুলির কার্যকর করার সময়টি বড় উদ্বেগের বিষয় নয় এবং প্রসেসিং বিভাগে আরও বেশি সময় ব্যয় করা হয়।


8
যদি কোনও সংকলক তাদের জন্য আলাদা কোড উত্পন্ন করে, তবে সময়টি সংকলকটি খনন করার এবং গত দুই দশক থেকে একটি পাওয়ার সময় এসেছে।
GManNickG

5
"এই লুপগুলি চিরকালের জন্য
চলার

3
@ ব্লিনডি - কারণ এটি ভুল, উদ্বেগের বিষয় হ'ল রানটাইম ব্যয় প্রক্রিয়াজাতকরণ লুপিং লজিকের ভগ্নাংশ, বা দরকারী কাজের প্রতি ইউনিট লুপিং লজিকের পরিমাণ, যার কোনটিই লুপ অসীম হতে সহায়তা করে না
বেন ভয়েগট

3

আমি মনে করি (সত্য;) ((;;)) এর চেয়ে বেশি পঠনযোগ্য - এর মতো দেখতে প্রোগ্রামার লুপের জন্য কিছু মিস করে না :)


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

2

"(;;)" ব্যবহারের সর্বাধিক গুরুত্বপূর্ণ কারণ আপনি যখন অনুসন্ধানী প্রোগ্রামিং করেন তখন "যখন (সত্য)" ব্যবহার করার ভয়। "For" এর সাথে পুনরাবৃত্তির পরিমাণ নিয়ন্ত্রণ করা আরও সহজ এবং "for" লুপকে অসীমে রূপান্তর করা আরও সহজ।

উদাহরণস্বরূপ, যদি আপনি একটি পুনরাবৃত্ত ফাংশন নির্মাণ করে থাকেন তবে আপনি অসীম লুপে রূপান্তরিত করার আগে ফাংশনে কলগুলির পরিমাণ সীমাবদ্ধ করতে পারেন।

    for(int i=0;i<1000;i++) recursiveFunction(oneParam);

যখন আমি আমার ফাংশন সম্পর্কে নিশ্চিত, তখন আমি এটিকে একটি অসীম লুপে রূপান্তর করি:

    for(;;) recursiveFunction(oneParam);

3
প্রথম লুপটিতে একটি সিনট্যাক্স ত্রুটি রয়েছে (একটি সেমিকোলন অনুপস্থিত)।
জেনস

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