সুইচ স্টেটমেন্ট: ডিফল্ট অবশ্যই শেষ কেস হতে হবে?


178

নিম্নলিখিত switchবিবৃতি বিবেচনা করুন :

switch( value )
{
  case 1:
    return 1;
  default:
    value++;
    // fall-through
  case 2:
    return value * 2;
}

এই কোডটি সংকলন করে তবে এটি কি সি 90 / সি 99 এর জন্য বৈধ (= সংজ্ঞায়িত আচরণ)? আমি কখনই এমন কোড দেখিনি যেখানে ডিফল্ট কেসটি সর্বশেষ ঘটনা নয়।

সম্পাদনা করুন:
হিসাবে জন কেজ এবং KillianDS লিখুন: এই সত্যিই কুশ্রী এবং কোড বিভ্রান্তিকর এবং আমি তা ভাল সচেতন নই। আমি কেবল সাধারণ বাক্য গঠন (এটি সংজ্ঞায়িত?) এবং প্রত্যাশিত আউটপুট সম্পর্কে আগ্রহী।


19
+1 এমনকি কখনও সে আচরণটি বিবেচনা
জেমি ওয়াং

@ পিটার টার্ক: আপনার অর্থ যদি মান == 2 হয় তবে এটি 6 হবে?
আলেকজান্দ্রি সি

4
@ পিটার টার্ক নং, আদেশটি কোনও ব্যাপার নয় - যদি মান কোনও ক্ষেত্রে লেবেলের ধ্রুবকের সাথে মেলে, তবে নিয়ন্ত্রণ লেবেলের পরে সেই বিবৃতিতে চলে যাবে, অন্যথায় যদি উপস্থিত থাকে তবে ডিফল্ট লেবেলের পরে নিয়ন্ত্রণ বিবৃতিতে চলে যাবে।
পিট কিরখাম

11
@Jon কেজ gotoমন্দ নয়। কার্গো ধর্মের অনুসারীরা হলেন! লোকেরা কী কী চূড়ান্ত তা এড়াতে পারে তা আপনি কল্পনা করতে পারেননি gotoকারণ এটি অত্যন্ত খারাপ, তাদের কোডের সত্যিকারের অপঠনযোগ্য গোলযোগ তৈরি করে।
প্যাট্রিক Schlüter

3
আমি gotoপ্রধানত finallyফাংশনগুলির মধ্যে একটি ধারাটির মতো কিছু অনুকরণ করতে ব্যবহার করি , যেখানে থামার সময় রিসোর্সগুলি (ফাইল, মেমরি) প্রকাশ করতে হয় এবং প্রতিটি ত্রুটির ক্ষেত্রে একটি তালিকা পুনরাবৃত্তি করে freeএবং closeপাঠযোগ্যতার জন্য সহায়তা করে না। যদিও এর একটি ব্যবহার gotoআমি এড়াতে চাই তবে তা করতে পারি না, যখন আমি কোনও লুপটি ভেঙে ফেলতে চাই এবং আমি switchসেই লুপের মধ্যেই থাকি ।
প্যাট্রিক Schlüter

উত্তর:


83

C99 স্ট্যান্ডার্ডটি এ সম্পর্কে সুস্পষ্ট নয়, তবে সমস্ত তথ্য এক সাথে নেওয়া, এটি পুরোপুরি বৈধ।

caseএবং defaultলেবেল একটি gotoলেবেলের সমতুল্য । 6.8.1 লেবেলযুক্ত বিবৃতি দেখুন। বিশেষত আকর্ষণীয় 6.8.1.4, যা ইতিমধ্যে উল্লিখিত ডাফের ডিভাইসটিকে সক্ষম করে:

কোনও বিবৃতি একটি উপসর্গের আগে থাকতে পারে যা কোনও সনাক্তকারীকে লেবেলের নাম হিসাবে ঘোষণা করে। নিজের মধ্যে লেবেলগুলি নিয়ন্ত্রণের প্রবাহকে পরিবর্তন করে না, যা তাদের জুড়ে নির্বিঘ্নে অবিরত থাকে।

সম্পাদনা : একটি স্যুইচের মধ্যে কোডটি বিশেষ কিছু নয়; এটি ifস্টিপমেন্টের মতো কোডের একটি সাধারণ ব্লক , অতিরিক্ত জাম্প লেবেল সহ। এটি পতনের মাধ্যমে আচরণ এবং কেন breakপ্রয়োজনীয় তা ব্যাখ্যা করে ।

6.8.4.2.7 এমনকি একটি উদাহরণ দেয়:

switch (expr) 
{ 
    int i = 4; 
    f(i); 
case 0: 
    i=17; 
    /*falls through into default code */ 
default: 
    printf("%d\n", i); 
} 

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

কেস ধ্রুবকগুলি অবশ্যই একটি স্যুইচ বিবৃতিতে অনন্য হতে হবে:

8.৮.৪.২.৩ প্রতিটি কেস লেবেলের অভিব্যক্তি একটি পূর্ণসংখ্যক ধ্রুবক প্রকাশ হতে হবে এবং রূপান্তরের পরে একই সুইচ স্টেটমেন্টে ধ্রুবক প্রকাশের ক্ষেত্রে দুটিরই একই মান থাকবে না। স্যুইচ স্টেটমেন্টে সর্বাধিক একটি ডিফল্ট লেবেল থাকতে পারে।

সমস্ত ক্ষেত্রেগুলি মূল্যায়ন করা হয়, তারপরে এটি ডিফল্ট লেবেলে লাফ দেয়, যদি দেওয়া হয়:

8.৮.৪.২.৫ পূর্ণসংখ্যা প্রচারগুলি নিয়ন্ত্রণের অভিব্যক্তিতে সম্পাদিত হয়। প্রতিটি কেস লেবেলে ধ্রুবক অভিব্যক্তি নিয়ন্ত্রণকারী অভিব্যক্তির প্রচারিত ধরণে রূপান্তরিত হয়। যদি কোনও রূপান্তরিত মান প্রচারিত নিয়ন্ত্রণকারী এক্সপ্রেশনের সাথে মিলে যায় তবে নিয়ন্ত্রণের সাথে ম্যাচ করা কেস লেবেলের অনুসরণ করে বিবৃতিতে লাফ দেওয়া হয়। অন্যথায়, যদি কোনও ডিফল্ট লেবেল থাকে, তবে লেবেলযুক্ত বিবৃতিতে জাম্প নিয়ন্ত্রণ করুন। যদি কোনও রূপান্তরিত ক্ষেত্রে ধ্রুবক অভিব্যক্তি মেলে না এবং কোনও ডিফল্ট লেবেল না থাকে তবে স্যুইচ বডিটির কোনও অংশই কার্যকর করা হয় না।


6
@ হিথহানিক্যুট আপনি উদাহরণটির উদ্দেশ্যটি পরিষ্কারভাবে বুঝতে পারেন নি। কোডটি এই পোস্টার দিয়ে তৈরি করা হয়নি, তবে কীভাবে অদ্ভুত সুইচ বিবৃতি রয়েছে এবং কীভাবে খারাপ অভ্যাসটি বাগের দিকে নিয়ে যাবে তার উদাহরণ হিসাবে সি স্ট্যান্ডার্ড থেকে সরাসরি নেওয়া হয়েছে। আপনি যদি কোডের নীচে লেখাটি পড়তে বিরক্ত হন তবে আপনি এতটা উপলব্ধি করতে পারতেন।
লন্ডিন

2
ডাউনওয়োটের ক্ষতিপূরণ দেওয়ার জন্য +1 কাউকে সি স্ট্যান্ডার্ড হিসাবে উদ্ধৃত করা বেশ কঠোর বলে মনে হচ্ছে।
লন্ডিন

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

12
ইন্টেল আপনাকে প্রথমে ব্রাঞ্চে একটি স্যুইচ স্টেটমেন্ট এবং মিসপ্রেডিক্টস রোধে লুপ পুনর্বিন্যাসের মধ্যে সবচেয়ে ঘন ঘন কোড স্থাপন করতে বলে । আমি এখানে আছি কারণ আমার defaultঅন্যান্য কেসগুলিকে প্রায় 100: 1 দ্বারা আধিপত্য বিস্তার করেছে এবং আমি জানি না যে defaultএটি প্রথম ক্ষেত্রে কে কার্যকর বা অপরিবর্তিত আছে কিনা ।
jwww

@jww আমি নিশ্চিত না যে আপনি ইন্টেল দ্বারা কী বোঝাতে চাইছেন। আপনি যদি বুদ্ধি বোঝাতে চান তবে আমি এটিকে হাইপোথিসিস বলব। আমার একই চিন্তাভাবনা ছিল, তবে পরে পড়াতে বলা হয়েছে যে বিবৃতি, সুইচ স্টেটমেন্টগুলি এলোমেলো অ্যাক্সেসের মত নয় are সুতরাং শেষের ক্ষেত্রে প্রথমটির তুলনায় ধীরগতি হয় না। ধ্রুবক কেস মানগুলি হ্যাশ করে এটি সম্পন্ন হয়। এই কারণেই শাখাগুলি খুব বেশি হলে বিবৃতিগুলির চেয়ে সুইচ স্টেটমেন্টগুলি দ্রুত হয়।

91

কেস স্টেটমেন্টস এবং ডিফল্ট বিবৃতিটি স্যুইচ স্টেটমেন্টের যে কোনও ক্রমে ঘটতে পারে। ডিফল্ট অনুচ্ছেদটি একটি alচ্ছিক ধারা যা ক্ষেত্রে বিবৃতিতে থাকা ধ্রুবকের কোনওটিই মিলে না যেতে পারে mat

ভালো উদাহরণ :-

switch(5) {
  case 1:
    echo "1";
    break;
  case 2:
  default:
    echo "2, default";
    break;
  case 3;
    echo "3";
    break;
}


Outputs '2,default'

আপনি যদি আপনার কেসগুলি কোডে একটি লজিকাল ক্রম হিসাবে উপস্থাপন করতে চান তবে খুব কার্যকর (যেমন কেস 1, কেস 3, কেস 2 / ডিফল্ট বলছেন না) এবং আপনার কেসগুলি খুব দীর্ঘ তাই আপনি পুরো কেসটির পুনরাবৃত্তি করতে চান না ডিফল্ট জন্য নীচে কোড


7
এটি হ'ল দৃশ্যে আমি সাধারণত শেষ ব্যতীত অন্য কোথাও ডিফল্ট রাখি ... সুস্পষ্ট মামলার একটি যৌক্তিক আদেশ রয়েছে (1, 2, 3) এবং আমি চাই ডিফল্টটিকে স্পষ্ট মামলার একটির মতোই আচরণ করা উচিত শেষ না।
আর্টঅফ ওয়ারফেয়ার

51

এটি বৈধ এবং কিছু ক্ষেত্রে খুব দরকারী।

নিম্নলিখিত কোড বিবেচনা করুন:

switch(poll(fds, 1, 1000000)){
   default:
    // here goes the normal case : some events occured
   break;
   case 0:
    // here goes the timeout case
   break;
   case -1:
     // some error occurred, you have to check errno
}

মুল বক্তব্যটি হ'ল উপরের কোডটি ক্যাসকেডের চেয়ে বেশি পঠনযোগ্য এবং দক্ষ if। আপনি রাখতে পারেনdefault শেষের দিকে রেখে , তবে এটি অর্থহীন কারণ এটি সাধারণ কেসগুলির পরিবর্তে ত্রুটির ক্ষেত্রে আপনার দৃষ্টি নিবদ্ধ করবে (যা এখানে defaultকেস)।

আসলে, এটি এত ভাল উদাহরণ নয়, pollআপনি জানেন যে সর্বাধিক কত ঘটনা ঘটতে পারে। আমার আসল বিন্দু সেখানে যে হয় ইনপুট মান যেখানে 'ব্যতিক্রম' এবং স্বাভাবিক মামলা আছে একটি পৃথক সেট সঙ্গে মামলা।সামনে যদি ব্যতিক্রম বা সাধারণ কেসগুলি সামনে রাখা ভাল তবে পছন্দ করার বিষয়।

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

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

মন্তব্যগুলি পড়া এটি নির্দিষ্ট কারণ কেন ইন্টেল সংকলক শাখা লুপ পুনর্গঠন পড়ার পরে মূল পোস্টারটি প্রশ্নটি করেছিল কোড অপ্টিমাইজেশন সম্পর্কে ।

তারপরে এটি কোডের পঠনযোগ্যতা এবং কোড সম্পাদনের মধ্যে কিছুটা সালিশ হয়ে যাবে। ভবিষ্যতে পাঠককে কেন একটি মামলা প্রথমে উপস্থিত হয় তা বোঝাতে সম্ভবত একটি মন্তব্য করা ভাল।


6
পতনের জন্য বিনা আচরণে একটি (ভাল) উদাহরণ দেওয়ার জন্য +1।
কিলিয়ানএসডিএস

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

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

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

1
@ ক্রিসস: "আমি তো পাইথন প্রোগ্রামারও নই!" :)
অ্যান্ড্রু গ্রিম

16

হ্যাঁ, এটি বৈধ, এবং কিছু পরিস্থিতিতে এটি এমনকি দরকারী। সাধারণত, আপনার যদি এটির প্রয়োজন না হয় তবে এটি করবেন না।


-1: আমার কাছে এই দুর্গন্ধের গন্ধ। কোডটি এক জোড়া সুইচ স্টেটমেন্টে বিভক্ত করা ভাল।
জন কেজ

25
@ জন কেজ: আমাকে এখানে এ -1 লাগানো দুষ্টু। এটি আমার বৈধতা নয় যে এটি বৈধ কোড।
জেনস গুস্ট্ট

শুধু কৌতূহলী, আমি জানতে চাই কোন পরিস্থিতিতে এটি দরকারী?
সলিল

1
এটি -1 এটির কার্যকর হওয়ার বিষয়ে আপনার দৃ at় প্রতিবেদনের লক্ষ্য ছিল। আপনি যদি নিজের দাবিটি ব্যাক আপ করার জন্য কোনও বৈধ উদাহরণ সরবরাহ করতে পারেন তবে আমি এটি +1 এ পরিবর্তন করব।
জন কেজ

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

8

একটি স্যুইচ বিবৃতিতে কোন সংজ্ঞায়িত আদেশ নেই। আপনি কেসগুলি কোনও নামী লেবেলের মতো, লেবেলের মতো দেখতে পারেন goto। লোকেরা এখানে যা মনে করে তার বিপরীতে, মান 2 এর ক্ষেত্রে ডিফল্ট লেবেলে লাফ দেওয়া হয় না। একটি শাস্ত্রীয় উদাহরণ দিয়ে উদাহরণস্বরূপ, এখানে ডাফের ডিভাইস , যা switch/caseসি এর চূড়ান্ততার পোস্টার চাইল্ড is

send(to, from, count)
register short *to, *from;
register count;
{
  register n=(count+7)/8;
  switch(count%8){
    case 0: do{ *to = *from++;
    case 7:     *to = *from++;
    case 6:     *to = *from++;
    case 5:     *to = *from++;
    case 4:     *to = *from++;
    case 3:     *to = *from++;
    case 2:     *to = *from++;
    case 1:     *to = *from++;
            }while(--n>0);
  }
}

4
এবং যে কেউ ডাফের ডিভাইসের সাথে পরিচিত নয় তাদের পক্ষে এই কোডটি সম্পূর্ণ
অপঠনযোগ্য

7

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

সুইচ (widget_state)
{
  ডিফল্ট: / * রেল বন্ধ বন্ধ - পুনরায় সেট করুন এবং চালিয়ে যান * /
    উইজেট_সেটেট = WIDGET_START;
    /* ব্যর্থ হত্তয়া */
  কেস WIDGET_START:
    ...
    বিরতি;
  কেস WIDGET_WHATEVER:
    ...
    বিরতি;
}

একটি বিকল্প ব্যবস্থা, যদি কোনও অবৈধ রাষ্ট্র মেশিনটিকে পুনরায় সেট না করে তবে অবৈধ রাষ্ট্র হিসাবে সহজেই চিহ্নিতযোগ্য:

সুইচ (widget_state) { কেস WIDGET_IDLE: উইজেট_ডিয়ার = 0; widget_hardware_off (); বিরতি; কেস WIDGET_START: ... বিরতি; কেস WIDGET_WHATEVER: ... বিরতি; ডিফল্ট: উইজেট_সেটেট = WIDGET_INVALID_STATE; /* ব্যর্থ হত্তয়া */ কেস WIDGET_INVALID_STATE: উইজেট_ডিয়ার = 0; widget_hardware_off (); ... "নিরাপদ" শর্ত প্রতিষ্ঠার জন্য আর যা কিছু প্রয়োজন তা করুন }

কোড অন্য কোথাও এর পরে (উইজেট_সেটেট == WIDGET_INVALID_STATE) যাচাই করতে পারে এবং ত্রুটি-প্রতিবেদনকরণ বা রাষ্ট্র-পুনরায় সেট করা আচরণ উপযুক্ত বলে মনে করে provide উদাহরণস্বরূপ, স্ট্যাটাস-বার কোডটি একটি ত্রুটি আইকন দেখাতে পারে এবং বেশিরভাগ অ-নিষ্ক্রিয় রাজ্যে অক্ষম থাকা "স্টার্ট উইজেট" মেনু বিকল্পটি WIDGET_INVALID_STATE পাশাপাশি WIDGET_IDLE এর জন্য সক্ষম হতে পারে।


6

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

  switch (style)
  {
  default:
    MSPUB_DEBUG_MSG(("Couldn't match dash style, using solid line.\n"));
  case SOLID:
    return Dash(0, RECT_DOT);
  case DASH_SYS:
  {
    Dash ret(shapeLineWidth, dotStyle);
    ret.m_dots.push_back(Dot(1, 3 * shapeLineWidth));
    return ret;
  }
  // more cases follow
  }

5

আপনি যখন কোনও ফাইল থেকে / পড়ছেন / পড়ছেন সেই ক্ষেত্রে আপনি যখন ENUM কে একটি স্ট্রিংয়ে রূপান্তর করছেন বা স্ট্রিংটিকে এনামে রূপান্তর করছেন cases

ম্যানুয়ালি ফাইল সম্পাদনা করে ত্রুটিগুলি কভার করতে আপনার কখনও কখনও মানগুলির একটির ডিফল্ট করা দরকার।

switch(textureMode)
{
case ModeTiled:
default:
    // write to a file "tiled"
    break;

case ModeStretched:
    // write to a file "stretched"
    break;
}

2

defaultশর্ত সুইচ যে একটি মামলা দফা বিদ্যমান পারেন মধ্যে জায়গা হতে পারে। এটি শেষ ধারা হতে হবে না। আমি এমন কোড দেখেছি যা ডিফল্টটিকে প্রথম দফা হিসাবে রেখে দেয়। দ্যcase 2:স্বাভাবিকভাবে মৃত্যুদন্ড কার্যকর করা, যদিও ডিফল্ট দফা এটা উপরে।

পরীক্ষা হিসাবে, আমি নমুনা কোডটি একটি ফাংশনে রেখেছি, ডেকে ডেকেছিলাম test(int value){}:

  printf("0=%d\n", test(0));
  printf("1=%d\n", test(1));
  printf("2=%d\n", test(2));
  printf("3=%d\n", test(3));
  printf("4=%d\n", test(4));

আউটপুটটি হ'ল:

0=2
1=1
2=4
3=8
4=10

1

এটি বৈধ, তবে কদর্য। আমি পরামর্শ দিচ্ছি যে এটি সাধারণত খারাপভাবে পড়ার অনুমতি দেয় কারণ এটি কিছু খুব অগোছালো স্প্যাগেটি কোডের দিকে নিয়ে যেতে পারে।

বেশ কয়েকটি সুইচ স্টেটমেন্ট বা ছোট ফাংশনগুলিতে এই কেসগুলি ছিন্ন করা প্রায় নিশ্চিতভাবেই ভাল।

[সম্পাদনা] @ ক্রিস্টোপিয়া: আপনার উদাহরণ:

Example from UCS-2 to UTF-8 conversion 

r is the destination array, 
wc is the input wchar_t  

switch(utf8_length) 
{ 
    /* Note: code falls through cases! */ 
    case 3: r[2] = 0x80 | (wc & 0x3f); wc >>= 6; wc |= 0x800; 
    case 2: r[1] = 0x80 | (wc & 0x3f); wc >>= 6; wc |= 0x0c0; 
    case 1: r[0] = wc;
}

এটি এর উদ্দেশ্য সম্পর্কে পরিষ্কার হবে (আমার মনে হয়) এটি যদি এভাবে লেখা থাকে:

if( utf8_length >= 1 )
{
    r[0] = wc;

    if( utf8_length >= 2 )
    {
        r[1] = 0x80 | (wc & 0x3f); wc >>= 6; wc |= 0x0c0; 

        if( utf8_length == 3 )
        {
            r[2] = 0x80 | (wc & 0x3f); wc >>= 6; wc |= 0x800; 
        }
    }
}   

[সম্পাদনা] @ ত্রিস্টোপিয়া: আপনার দ্বিতীয় উদাহরণটি সম্ভবত অনুসরণের জন্য ভাল ব্যবহারের সবচেয়ে পরিষ্কার উদাহরণ:

for(i=0; s[i]; i++)
{
    switch(s[i])
    {
    case '"': 
    case '\'': 
    case '\\': 
        d[dlen++] = '\\'; 
        /* fall through */ 
    default: 
        d[dlen++] = s[i]; 
    } 
}

.. তবে ব্যক্তিগতভাবে আমি মন্তব্য স্বীকৃতিটিকে তার নিজস্ব ফাংশনে ভাগ করব:

bool isComment(char charInQuestion)
{   
    bool charIsComment = false;
    switch(charInQuestion)
    {
    case '"': 
    case '\'': 
    case '\\': 
        charIsComment = true; 
    default: 
        charIsComment = false; 
    } 
    return charIsComment;
}

for(i=0; s[i]; i++)
{
    if( isComment(s[i]) )
    {
        d[dlen++] = '\\'; 
    }
    d[dlen++] = s[i]; 
}

2
এমন কিছু ঘটনা রয়েছে যেখানে পড়ে যাওয়া সত্যই সত্যই একটি ভাল ধারণা।
প্যাট্রিক Schlüter

ইউসিএস -২ থেকে ইউটিএফ -8 রূপান্তরটির উদাহরণ rগন্তব্য অ্যারে, wcইনপুট wchar_t সুইচ (utf8_leight) {/ * দ্রষ্টব্য: কোডগুলি কেসগুলির মধ্যে পড়ে! * / কেস 3: আর [2] = 0x80 | (ডাব্লুসিসি & 0x3f); ডাব্লুসিসি >> = 6; wc | = 0x800; কেস 2: আর [1] = 0x80 | (ডাব্লুসিসি & 0x3f); ডাব্লুসিসি >> = 6; wc | = 0xc0; কেস 1: আর [0] = ডব্লিউসি; }
প্যাট্রিক Schlüter

এখানে আরেকটি, চরিত্রের for(i=0; s[i]; i++) { switch(s[i]) { case '"': case '\'': case '\\': d[dlen++] = '\\'; /* fall through */ default: d[dlen++] = s[i]; } }
পালনের

হ্যাঁ, তবে এই রুটিনটি আমাদের হটস্পটগুলির মধ্যে একটি, এটি কার্যকর করার জন্য এটি ছিল দ্রুততম, বহনযোগ্য (আমরা সমাবেশ করব না) way এটি কোনও ইউটিএফ দৈর্ঘ্যের জন্য কেবল 1 টি পরীক্ষা আছে, আপনার 2 বা 3 হয় has এছাড়াও, আমি এটি নিয়ে আসি না, আমি বিএসডি থেকে নিয়েছি।
প্যাট্রিক Schlüter

1
হ্যাঁ, বিশেষত বুলগেরিয়ান এবং গ্রীক ভাষায় রূপান্তর (সোলারিস স্পার্কে) এবং আমাদের অভ্যন্তরীণ মার্কআপ (যা 3 বাইট ইউটিএফ 8 হয়) সহ পাঠ্য ছিল। স্বীকৃত, মোটামুটিভাবে এটি খুব বেশি নয় এবং আমাদের শেষ হার্ডওয়্যার আপডেটের পরে এটি অপ্রাসঙ্গিক হয়ে উঠেছে, তবে এটি যখন লেখা হয়েছিল তখন এটি কিছুটা তাত্পর্যপূর্ণ হয়েছিল।
প্যাট্রিক Schlüter
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.