একটি পূর্ণসংখ্যার মোড়কের উপরে জাভা স্যুইচ কেন, কোনও 'চর' কেস সংকলন করে না, তবে স্যুইচটি বাইটের বেশি হলে সংকলনটি ঠিক আছে?


18

সংকলন করে না:

void test(Integer x) {
      switch (x) {
          case 'a':
      }
}

সংকলন ঠিক আছে:

void test(Byte x) {
      switch(x) {
          case 'a':
      }
}

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

সে ব্যাখ্যাটি ভুল। প্রকৃতপক্ষে, ২ য় উদাহরণে, 'a'ক্ষেত্রে কোডটি বাইট হয় এমন ক্ষেত্রে কার্যকর করা হবে । (আপনি যদি আমাকে বিশ্বাস না করেন তবে এটি চেষ্টা করুন)) আসল ব্যাখ্যার জন্য, আমার উত্তর দেখুন। x97
স্টিফেন সি

উত্তর:


19

কারণগুলি বরং জটিল, তবে সেগুলি সমস্ত জাভা ভাষার স্পেসিফিকেশনের বিবরণে ( যদি আপনি চান তবে সূক্ষ্ম মুদ্রণ )।

প্রথমত, জেএলএস 14.11switch বিবৃতি সম্পর্কে নিম্নলিখিতটি বলেছেন:

"স্যুইচ স্টেটমেন্টের সাথে যুক্ত প্রতিটি ক্ষেত্রে ধ্রুবক অবশ্যই সুইচ স্টেটমেন্টের এক্সপ্রেশন ( §5.2 ) এর ধরণের সাথে সামঞ্জস্যপূর্ণ অ্যাসাইনমেন্ট হতে হবে ।"

এর অর্থ এই যে 'a'হস্তান্তরযোগ্য হতে প্রয়োজন Integerএবং Byte যথাক্রমে।

তবে এটি ঠিক শোনাচ্ছে না:

  • আপনি ভাববেন যেহেতু 'a' একটি নিয়োগযোগ্য হওয়া উচিতInteger কারণ char-> int নিয়োগটি আইনী। (কোনও charমান একটি মধ্যে মাপসই করা হবে int।)

  • আপনি মনে হবে যে যেহেতু 'a' করা উচিত হবে না একটি থেকে হস্তান্তরযোগ্য Byteকারণ char-> byte নিয়োগ না বৈধ। (বেশিরভাগ charমান একটি বাইটের সাথে খাপ খায় না))

আসলে, এগুলির কোনওটিই সঠিক নয়। কেন তা বোঝার জন্য, আমাদের জেলিএসএস 5.2 অ্যাসাইনমেন্ট প্রসঙ্গে যা অনুমোদিত তা সম্পর্কে আসলে কী পড়তে হবে ।

"অ্যাসাইনমেন্ট প্রসঙ্গে নিম্নলিখিতগুলির মধ্যে একটির ব্যবহারের অনুমতি দেয় :

  • একটি পরিচয় রূপান্তর (.15.1.1)
  • একটি প্রসারিত আদিম রূপান্তর (.15.1.2)
  • একটি প্রসারিত রেফারেন্স রূপান্তর (.15.1.5)
  • একটি বিস্তৃত রেফারেন্স রূপান্তর যার পরে একটি আনবক্সিং রূপান্তর
  • একটি বিস্তৃত রেফারেন্স রূপান্তর এর পরে একটি আনবক্সিং রূপান্তর, তারপরে প্রসারিত আদিম রূপান্তর
  • একটি বক্সিং রূপান্তর (.15.1.7)
  • একটি বক্সিং রূপান্তর এর পরে আরও প্রশস্ত রেফারেন্স রূপান্তর
  • একটি আনবক্সিং রূপান্তর (.15.1.8)
  • একটি আনবক্সিং রূপান্তর এর পরে প্রসারিত আদিম রূপান্তর। "

থেকে যেতে 'a'করার Integer, আমরা করতে হবে 1 বিস্তীর্ণ charএকটি মান intতারপর বাক্সে intএকটি থেকে Integer। তবে আপনি যদি অনুমতিপ্রাপ্ত রূপান্তরগুলির সংমিশ্রণগুলি দেখেন তবে আপনি বক্সিং রূপান্তরের পরে প্রসারিত প্রাথমিক রূপান্তর করতে পারবেন না।

অতএব 'a'করতে Integerঅনুমোদিত নয়। এটি প্রথম ক্ষেত্রে সংকলন ত্রুটিটি ব্যাখ্যা করে।

তুমি ভাবছ যে 'a'করতে Byteঅননুমোদিত কারণ যে একটি আদিম কমিয়ে আনায় রূপান্তর ... যা সব সময়ে তালিকায় না থাকে জড়িত করা হবে। আসলে, আক্ষরিক একটি বিশেষ ক্ষেত্রে। জেএলএস 5.2 নিম্নলিখিতটি বলতে যায়।

"এছাড়াও, যদি অভিব্যক্তিটি বাইট, সংক্ষিপ্ত, চর বা int এর ধরণের ধ্রুবক অভিব্যক্তি ( §15.28 ) হয়:

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

  • যদি পরিবর্তনশীল ধরনের হয় একটি সংকীর্ণ আদিম রূপান্তর একটি বক্সিং রূপান্তর দ্বারা অনুসরণ ব্যবহার করা যেতে পারে Byte, Shortঅথবা Character, এবং ধ্রুব মত প্রকাশের মান টাইপ বাইটে representable, সংক্ষিপ্ত, অথবা যথাক্রমে গৃহস্থালির কাজ। "

এই দ্বিতীয় ক্ষেত্রে প্রযোজ্য 'a'করার Byte, কারণ:

  • একটি অক্ষর আক্ষরিক একটি ধ্রুবক প্রকাশ, এবং
  • এর মান 'a'হয় 97, যার জন্য পরিসীমা মধ্যে হয়, দশমিক byte( -128থেকে +127)।

এটি ব্যাখ্যা করে যে কেন দ্বিতীয় উদাহরণে কোনও সংকলনের ত্রুটি নেই।


1 - আমরা একটিতে বাক্স 'a'করতে পারি না Characterএবং তারপরে আরও প্রশস্ত Characterকরতে পারি Integerকারণ Characterএটি জাভা সাব টাইপ নয় Integer। উত্স টাইপ লক্ষ্য প্রকারের একটি উপ টাইপ হলে আপনি কেবলমাত্র প্রসারিত রেফারেন্স রূপান্তর ব্যবহার করতে পারেন।


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