সমস্ত উত্তর এবং আরও কিছু গবেষণা পড়ার পরে আমি কয়েকটি জিনিস পাই।
Case statements are only 'labels'
সি তে, স্পেসিফিকেশন অনুযায়ী,
.86.8.1 লেবেলযুক্ত বিবৃতি:
labeled-statement:
identifier : statement
case constant-expression : statement
default : statement
সি তে এমন কোনও ধারা নেই যা "লেবেলযুক্ত ঘোষণার" জন্য অনুমতি দেয়। এটি কেবল ভাষার অংশ নয়।
সুতরাং
case 1: int x=10;
printf(" x is %d",x);
break;
এটি সংকলন করবে না , দেখুন http://codepad.org/YiyLQTYw । জিসিসি একটি ত্রুটি দিচ্ছে:
label can only be a part of statement and declaration is not a statement
এমন কি
case 1: int x;
x=10;
printf(" x is %d",x);
break;
এই হয় এছাড়াও সংকলন না দেখতে http://codepad.org/BXnRD3bu । এখানেও আমি একই ত্রুটি পাচ্ছি।
সি ++ এ, স্পেসিফিকেশন অনুযায়ী,
লেবেল-ঘোষণার অনুমতি থাকলেও লেবেলযুক্ত-অস্বীকৃতি অনুমোদিত নয়।
Http://codepad.org/ZmQ0IyDG দেখুন ।
এ জাতীয় অবস্থার সমাধান দুটি
হয় scope using ব্যবহার করে নতুন স্কোপ ব্যবহার করুন
case 1:
{
int x=10;
printf(" x is %d", x);
}
break;
অথবা লেবেলযুক্ত ডামি স্টেটমেন্ট ব্যবহার করুন
case 1: ;
int x=10;
printf(" x is %d",x);
break;
স্যুইচ () এর আগে ভেরিয়েবলটি ঘোষণা করুন এবং যদি এটি আপনার প্রয়োজনীয়তা পূরণ করে তবে কেস স্টেটমেন্টে এটি বিভিন্ন মান দিয়ে শুরু করুন
main()
{
int x; // Declare before
switch(a)
{
case 1: x=10;
break;
case 2: x=20;
break;
}
}
সুইচ স্টেটমেন্ট সহ আরও কিছু জিনিস
স্যুইচে কোনও বিবৃতি কখনও লিখবেন না যা কোনও লেবেলের অংশ নয়, কারণ সেগুলি কখনও কার্যকর করা হবে না:
switch(a)
{
printf("This will never print"); // This will never executed
case 1:
printf(" 1");
break;
default:
break;
}
Http://codepad.org/PA1quYX3 দেখুন ।