প্রথমে হেন্ক এবং অলিভিয়ের উত্তরগুলি সঠিক; আমি এটিকে কিছুটা আলাদাভাবে ব্যাখ্যা করতে চাই। বিশেষত, আমি আপনার তৈরি এই পয়েন্টটি সম্বোধন করতে চাই। আপনার কাছে বিবৃতিগুলির এই সেট রয়েছে:
int k = 10;
int c = 30;
k += c += k += c;
এবং তারপরে আপনি ভুলভাবে সিদ্ধান্তে পৌঁছে গেছেন যে এটি এই বিবৃতিগুলির সেট হিসাবে একই ফলাফল দেয়:
int k = 10;
int c = 30;
k += c;
c += k;
k += c;
আপনি কীভাবে ভুলটি পেয়েছিলেন এবং কীভাবে এটি সঠিকভাবে করবেন তা দেখার জন্য তথ্যবহুল। এটি ভেঙে ফেলার সঠিক উপায় এটি।
প্রথমে, বহিরাগতকে আবার লিখুন + =
k = k + (c += k += c);
দ্বিতীয়ত, বাহ্যতমতমটি আবার লিখুন + আমি আশা করি আপনি সম্মত হন যে x = y + z সর্বদা "সাময়িকভাবে y এর মূল্যায়ন করুন, অস্থায়ীতে z এর মূল্যায়ন করুন, অস্থায়ী সংস্থাগুলি যোগ করুন, যোগফলটি x কে নির্ধারণ করুন" এর সমান হতে হবে । সুতরাং আসুন এটি খুব স্পষ্ট করা যাক:
int t1 = k;
int t2 = (c += k += c);
k = t1 + t2;
এটি পরিষ্কার হয়ে গেছে তা নিশ্চিত করুন, কারণ আপনি যে ভুলটি পেয়েছেন এটি এই পদক্ষেপ । জটিল অপারেশনগুলিকে সহজ অপারেশনে ভাঙ্গার সময় আপনাকে অবশ্যই নিশ্চিত করতে হবে যে আপনি ধীরে ধীরে এবং সাবধানতার সাথে করছেন এবং পদক্ষেপগুলি এড়িয়ে যাবেন না । পদক্ষেপগুলি এড়ানো হয় যেখানে আমরা ভুল করি।
ঠিক আছে, এখন ধীরে ধীরে এবং সাবধানে আবার, টি 2-এর অ্যাসাইনমেন্টটি ভেঙে দিন।
int t1 = k;
int t2 = (c = c + (k += c));
k = t1 + t2;
অ্যাসাইনমেন্টটি সি হিসাবে নির্ধারিত হিসাবে টি 2 তে একই মান নির্ধারণ করবে, সুতরাং আসুন আমরা তা বলি:
int t1 = k;
int t2 = c + (k += c);
c = t2;
k = t1 + t2;
দুর্দান্ত এখন দ্বিতীয় লাইনটি ভাঙ্গুন:
int t1 = k;
int t3 = c;
int t4 = (k += c);
int t2 = t3 + t4;
c = t2;
k = t1 + t2;
দুর্দান্ত, আমরা অগ্রগতি করছি। অ্যাসাইনমেন্টটি টি -4 এ ভেঙে দিন:
int t1 = k;
int t3 = c;
int t4 = (k = k + c);
int t2 = t3 + t4;
c = t2;
k = t1 + t2;
এখন তৃতীয় লাইনটি ভাঙ্গুন:
int t1 = k;
int t3 = c;
int t4 = k + c;
k = t4;
int t2 = t3 + t4;
c = t2;
k = t1 + t2;
এবং এখন আমরা পুরো জিনিসটি দেখতে পারি:
int k = 10;
int c = 30;
int t1 = k;
int t3 = c;
int t4 = k + c;
k = t4;
int t2 = t3 + t4;
c = t2;
k = t1 + t2;
সুতরাং যখন আমরা সম্পন্ন করব, কে 80 এবং সি 70 হয়।
এখন আসুন দেখে নেওয়া যাক এটি কীভাবে আইএলে প্রয়োগ করা হয়:
int t1 = k;
int t3 = c;
is implemented as
ldloc.0
ldloc.1
এখন এটি কিছুটা জটিল:
int t4 = k + c;
k = t4;
is implemented as
ldloc.0
ldloc.1
add
dup
stloc.0
আমরা উপরের হিসাবে বাস্তবায়ন করতে পারে
ldloc.0
ldloc.1
add
stloc.0
ldloc.0
তবে আমরা "ডুপ" কৌশলটি ব্যবহার করি কারণ এটি কোডটি ছোট করে তোলে এবং জিটারটিতে এটি আরও সহজ করে তোলে এবং আমরা একই ফল পাই। সাধারণভাবে, সি # কোড জেনারেটর স্ট্যাকের উপর সাময়িকভাবে "সাময়িক" রাখার চেষ্টা করে। আপনি যদি কম ইফেমেরালগুলি সহ আইএল অনুসরণ করা সহজ মনে করেন, অনুকূলিতকরণ বন্ধ করুন , এবং কোড জেনারেটর কম আক্রমণাত্মক হবে।
সি পেতে আমাদের এখন একই কৌশল করতে হবে:
int t2 = t3 + t4;
c = t2;
is implemented as:
add
dup
stloc.1
এবং পরিশেষে:
k = t1 + t2;
is implemented as
add
stloc.0
যেহেতু আমাদের অন্য কোনও কিছুর জন্য যোগফলের প্রয়োজন নেই, তাই আমরা এটিকে ফাঁকি দেই না। স্ট্যাক এখন খালি, এবং আমরা বিবৃতিটির শেষে এসেছি।
গল্পটির নৈতিকতা হ'ল: আপনি যখন কোনও জটিল প্রোগ্রামটি বোঝার চেষ্টা করছেন তখন সর্বদা একবারে ক্রিয়াকলাপ বন্ধ করুন । সংক্ষিপ্ত কাটা গ্রহণ করবেন না; তারা আপনাকে পথভ্রষ্ট করবে।