java - বিল্ডিং এর কলাম
কেন জাভা এর না==,-=,*=,/= যৌগ অ্যাসাইনমেন্ট অপারেটর ঢালাই প্রয়োজন? (7)
, 'হ্যাঁ
মূলত আমরা লিখতে যখন
i += l;
কম্পাইলার এই রূপান্তর
i = (int)(i + l);
আমি শুধু .class
ফাইল কোড চেক।
সত্যিই একটি ভাল জিনিস জানতে
আজ পর্যন্ত, আমি মনে করি যে উদাহরণস্বরূপ:
i += j;
শুধু জন্য একটি শর্টকাট ছিল:
i = i + j;
কিন্তু আমরা যদি চেষ্টা করি:
int i = 5;
long j = 8;
তারপর i = i + j;
কম্পাইল হবে না কিন্তু i += j;
জরিমানা কম্পাইল হবে।
এর মানে কি আসলে i += j;
এই i = (type of i) (i + j)
মত কিছু জন্য একটি শর্টকাট i = (type of i) (i + j)
?
আপনি i = i + l
ক্ষেত্রে explicitly
long
থেকে int
থেকে কাস্ট করার প্রয়োজন হলে এটি কম্পাইল এবং সঠিক আউটপুট দেবে। মত
i = i + (int)l;
অথবা
i = (int)((long)i + l); // this is what happens in case of += , dont need (long) casting since upper casting is done implicitly.
কিন্তু +=
এর ক্ষেত্রে এটি ঠিক কাজ করে কারণ অপারেটরটি সঠিক ভেরিয়েবলের টাইপ কাস্টিংয়ের বাম ভেরিয়েবল টাইপ করে তাই স্পষ্টভাবে কাস্ট করার প্রয়োজন হয় না।
এখানে সমস্যা টাইপ ঢালাই জড়িত।
আপনি int এবং দীর্ঘ যোগ করার সময়,
- Int বস্তুর দীর্ঘায়িত করা হয় এবং উভয় জোড়া হয় এবং আপনি দীর্ঘ বস্তু পাবেন।
- কিন্তু দীর্ঘ বস্তু implicitly int int cast করা যাবে না। সুতরাং, আপনি স্পষ্টভাবে যে করতে হবে।
কিন্তু +=
কোডিং টাইপ করে এমন ভাবে কোডেড। i=(int)(i+m)
এখানে সূক্ষ্ম পয়েন্ট ...
i+j
জন্য একটি অন্তর্নিহিত টাইপস্টাস্ট আছে যখন j
একটি দ্বিগুণ এবং i
একটি int। জাভা ALWAYS তাদের মধ্যে একটি অপারেশন আছে যখন একটি পূর্ণসংখ্যা একটি ডবল মধ্যে রূপান্তর।
i+=j
স্পষ্ট করার জন্য i+=j
যেখানে i
একটি পূর্ণসংখ্যা এবং j
একটি ডবল হিসাবে বর্ণনা করা যেতে পারে
i = <int>(<double>i + j)
দেখুন: নিখুঁত ঢালাই এই বিবরণ
আপনি স্বচ্ছতার জন্য এই ক্ষেত্রে টাইপcast j
(int)
করতে চাইতে পারেন।
খুব ভাল প্রশ্ন। জাভা ভাষা স্পেসিফিকেশন আপনার পরামর্শ নিশ্চিত করে।
উদাহরণস্বরূপ, নিম্নলিখিত কোডটি সঠিক:
short x = 3; x += 4.6;
এবং x এর মান 7 এর মধ্যে রয়েছে কারণ এটি সমতুল্য:
short x = 3; x = (short)(x + 4.6);
জাভা টাইপের রূপান্তরগুলি স্বয়ংক্রিয়ভাবে সঞ্চালিত হয় যখন অ্যাসাইনমেন্ট ক্রিয়াকলাপের ডান দিকে অভিব্যক্তিটির ধরনটি নিরাপদভাবে অ্যাসাইনমেন্টের বাম দিকের ভেরিয়েবলের প্রকারে প্রচার করা যেতে পারে। সুতরাং আমরা নিরাপদে বরাদ্দ করতে পারি:
byte -> short -> int -> long -> float -> double.
একই রাউন্ড অন্য উপায় কাজ করবে না। উদাহরণস্বরূপ আমরা স্বয়ংক্রিয়ভাবে একটি int তে দীর্ঘ রূপান্তর করতে পারি না কারণ প্রথমে দ্বিতীয়টির চেয়ে বেশি সঞ্চয়স্থান প্রয়োজন এবং ফলস্বরূপ তথ্য হারিয়ে যেতে পারে। যেমন একটি রূপান্তর জোর করার জন্য আমরা একটি সুস্পষ্ট রূপান্তর করা আবশ্যক।
টাইপ - রূপান্তর
সর্বদা এই প্রশ্নগুলির সাথে, জেএলএস উত্তরটি ধরে রাখে। এই ক্ষেত্রে §15.26.2 কম্পাউন্ড অ্যাসাইনমেন্ট অপারেটর । একটি নির্যাস:
ফর্ম
E1 op= E2
এর একটি যৌগিক অ্যাসাইনমেন্ট এক্সপ্রেশনE1 = (T)((E1) op (E2))
সমতুল্যE1 = (T)((E1) op (E2))
, যেখানেT
E1
এর ধরন, কেবলমাত্রE1
একবার একবার মূল্যায়ন করা হয়।
§15.26.2 থেকে উদ্ধৃত একটি উদাহরণ
[...] নিম্নলিখিত কোডটি সঠিক:
short x = 3; x += 4.6;
এবং x এর মান 7 এর মধ্যে রয়েছে কারণ এটি সমতুল্য:
short x = 3; x = (short)(x + 4.6);
অন্য কথায়, আপনার ধারণার সঠিক।