"সংক্ষিপ্ত ত্রিশ = 3 * 10" আইনী কার্যভার কেন?


102

যদি গাণিতিক ক্রিয়াকলাপগুলিতে shortস্বয়ংক্রিয়ভাবে পদোন্নতি হয় intতবে তা কেন:

short thirty = 10 * 3;

shortভেরিয়েবলের আইনী অ্যাসাইনমেন্ট thirty?

ঘুরেফিরে, এই:

short ten = 10;
short three = 3;
short thirty = ten * three; // DOES NOT COMPILE AS EXPECTED

ঠিক এটার মতন:

int ten = 10;
int three = 3;
short thirty = ten * three; // DOES NOT COMPILE AS EXPECTED

সংকলন করে না কারণ প্রত্যাশা অনুযায়ী ingালাই ছাড়াই কোনও intমান নির্ধারণের shortঅনুমতি নেই।

সংখ্যাগত আক্ষরিক সম্পর্কে কি বিশেষ কিছু চলছে?


23
short thirty = 10 * 3;সম্ভবত short thirty = 30;সংকলক দ্বারা প্রতিস্থাপিত হয় যা একটি বৈধ বিবৃতি then (যদিও আমাকে প্রাসঙ্গিক জেএলএস বিভাগটি সন্ধান করতে হবে)।
থমাস

সংকলক 10 * 3ফলাফলের সাথে ভেরিয়েবল গণনা করে এবং সূচনা করে। আপনার কর্মহীন উদাহরণে গণনাটি রানটাইমে ঘটে যেখানে জেভিএম সংক্ষিপ্ত কাস্ট করে।
ফেলিক্স

আমি মনে করি এটি স্ট্যাকওভারফ্লো / সেকশন / 30346587 / java- char- to- byte - bycast বা stackoverflow.com/questions/9379983/… এর একটি সদৃশ । তবে: নোট করুন যে final int ten = 10; final int three = 3; short thirty = ten * three;জরিমানা সংকলন।
মার্কো 13

7
If short is automatically promoted to int in arithmetic operations- এটি প্রাসঙ্গিক নয়। আমরাও 10না 3হাফপ্যান্ট করছি লিটারেল হয় না এবং তারা উন্নীত হয়, তারা।
ম্যাথু

@ ম্যাথার রিড: তবে আক্ষরিক হিসাবেও তাদের একটি নির্দিষ্ট ডেটাটাইপ হিসাবে মূল্যায়ন করতে হবে, তাই না? সুতরাং এটি কি সত্য 10এবং সংকলক দ্বারা s 3হিসাবে মূল্যায়ন করা intহয়?
LarsH

উত্তর:


139

কারণ সংকলক 10*330 এর সাথে সংকলন সময়ে প্রতিস্থাপন করে। সুতরাং, কার্যকরভাবে: short thirty = 10 * 3সংকলন সময়ে গণনা করা হয়।

পরিবর্তন করার চেষ্টা করুন tenএবং (তাদেরকে সময় স্থির করে তুলুন) এবং দেখুন কী ঘটে: পিthreefinal short

javap -v উভয় ভেরিয়েন্স ( 10*3এবং final short) ব্যবহার করে বাইট-কোড পরীক্ষা করুন । আপনি দেখতে পারবেন যে সামান্য পার্থক্য আছে।

ঠিক আছে, সুতরাং, এখানে বিভিন্ন ক্ষেত্রে বাইট কোড পার্থক্য রয়েছে।

মামলা 1 :

জাভা কোড: প্রধান () {সংক্ষিপ্ত s = 10 * 3; }

বাইট কোড:

stack=1, locals=2, args_size=1
         0: bipush        30  // directly push 30 into "s"
         2: istore_1      
         3: return   

কেস -২:

public static void main(String arf[])  {
   final short s1= 10;
   final short s2 = 3;
   short s = s1*s2;
}

বাইট কোড:

  stack=1, locals=4, args_size=1
         0: bipush        10
         2: istore_1      
         3: iconst_3      
         4: istore_2      
         5: bipush        30 // AGAIN, push 30 directly into "s"
         7: istore_3      
         8: return   

কেস -৩:

public static void main(String arf[]) throws Exception {
     short s1= 10;
     short s2 = 3;
     int s = s1*s2;
}

বাইট-কোড:

stack=2, locals=4, args_size=1
         0: bipush        10  // push constant 10
         2: istore_1      
         3: iconst_3        // use constant 3 
         4: istore_2      
         5: iload_1       
         6: iload_2       
         7: imul          
         8: istore_3      
         9: return 

উপরের ক্ষেত্রে, 10এবং 3স্থানীয় ভেরিয়েবল s1এবং থেকে নেওয়া হয়s2


17
Try changing ten and three to final shortঅনুশীলন পছন্দ করেছে :)
সের্গেই পাউক

1
@ সের্গেপৌক - সংকলন সময়ের ধ্রুবকগুলি বোঝার জন্য এটি সত্যই গুরুত্বপূর্ণ .. সমস্ত
আদিমদের জন্যও

1
@ দ্য লস্টমাইন্ড আমি আরও ভাল শব্দ you will see that there's no difference (between those two lines in the decompiled code)কারণের পরামর্শ দেব এটি কি আপনার বক্তব্য নয়?
সের্গেই পাউক

4
মজাদারভাবে, এর অর্থ এইও case 10*3:এবং স্যুইচ কনস্ট্রাক্টে এটি বৈধ।
সিলিং গেকো

5
এবং একইভাবে এনাম নির্মাণে। আসলে, বিটফিল্ড এনাম কনস্ট্যান্টগুলির জন্য 1 << 5 এর মতো স্টাফ ব্যবহার করা মূর্খতাপূর্ণ।
বাথশেবা

18

হ্যাঁ আক্ষরিক ক্ষেত্রে বিশেষ কিছু চলছে: সংকলনের সময়ে 10 * 3মূল্যায়ন করা হবে । সুতরাং গুণিত আক্ষরিক জন্য আপনার সুস্পষ্ট রূপান্তর দরকার নেই ।(short)

ten * three সংকলন-সময় মূল্যায়নযোগ্য নয় তাই সুস্পষ্ট রূপান্তর প্রয়োজন।

এটা একটা ভিন্ন ব্যাপার যদি হবে tenএবং threeচিহ্নিত করা হয়েছিল final


1

নিম্নলিখিত উত্তরটি জেএলএস বিভাগ এবং এই আচরণ সম্পর্কে কিছু বিশদ যুক্ত করে।

অনুযায়ী JLS §15.2 - অভিব্যক্তির ফরম

কিছু এক্সপ্রেশন একটি মান আছে যা সংকলন সময়ে নির্ধারণ করা যেতে পারে। এগুলি ধ্রুবক অভিব্যক্তি (.215.28)।

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