[রেকর্ডের জন্য, আমি এই উত্তরটি বেশ উল্লেখযোগ্যভাবে সম্পাদনা করেছি কারণ এটি গৃহীত হয়েছে এবং এতে ভোট দেওয়া হয়েছে। এটি এখনও মূলত একই জিনিসগুলি বলে, যদিও।]
এই কোডটি গভীরভাবে, সম্ভবত ইচ্ছাকৃত, বিভ্রান্তিকর। এতে ভয়ঙ্কর অপরিবর্তিত আচরণের একটি সংকীর্ণ-প্রতিপন্ন উদাহরণ রয়েছে । এই প্রশ্নটি নির্মাণকারী ব্যক্তি খুব, খুব চালাক বা খুব, খুব বোকা ছিলেন কিনা তা নির্ধারণ করা মূলত অসম্ভব। এবং "পাঠ" এই কোডটি আপনাকে শেখানোর জন্য বা কুইজ করার জন্য পুরোপুরি ধারণা তৈরি করতে পারে - যথা, আনরি প্লাস অপারেটর খুব বেশি কিছু করে না - এই ধরণের বিপর্যয়মূলক ভুল নির্দেশনার প্রাপ্য হওয়ার পক্ষে অবশ্যই এটি যথেষ্ট গুরুত্বপূর্ণ নয়।
কোডটির দুটি বিভ্রান্তিকর দিক রয়েছে, আজব অবস্থা:
while(+(+k--)!=0)
এবং এটি নিয়ন্ত্রিত বিবৃত বিবৃতি:
k=k++;
আমি প্রথম দ্বিতীয় অংশটি কভার করতে যাচ্ছি।
যদি আপনার মতো ভেরিয়েবল থাকে kতবে আপনি 1 দ্বারা বর্ধন করতে চান, সি আপনাকে একটি নয়, দুটি নয়, তিন নয়, চারটি ভিন্ন উপায় এটি করার জন্য:
k = k + 1
k += 1
++k
k++
এই অনুগ্রহ সত্ত্বেও (বা সম্ভবত এটি কারণে), কিছু প্রোগ্রামার বিভ্রান্ত হয়ে পড়ে এবং পছন্দ মতো কনফারেন্সগুলি কাশি করে
k = k++;
এইটি করার কথাটি যদি আপনি বুঝতে না পারেন তবে চিন্তা করবেন না: কেউ পারে না। এই অভিব্যক্তি পরিবর্তন করতে দুটি ভিন্ন প্রচেষ্টা রয়েছে kএর মান ( k =অংশ, এবং k++অংশ), এবং কারণ সি কোন নিয়ম বলতে এর চেষ্টা পরিবর্তন "জয়", ভালো একটি অভিব্যক্তি আনুষ্ঠানিকভাবে হয় যা অনির্দিষ্ট , শুধু তাই নয়, যার অর্থ এর কোনও নির্ধারিত অর্থ নেই, তবে এটি রয়েছে এমন পুরো প্রোগ্রামটি সন্দেহজনক।
এখন, আপনি যদি খুব মনোযোগ দিয়ে দেখুন, আপনি দেখতে পাবেন যে এই বিশেষ প্রোগ্রামে, লাইনটি k = k++আসলে কার্যকর হয় না, কারণ (আমরা যেমন দেখতে চলেছি) নিয়ন্ত্রণকারী অবস্থা প্রাথমিকভাবে মিথ্যা, সুতরাং লুপটি 0 বার চলে । তাই এই বিশেষ প্রোগ্রাম নাও করতে পারে আসলে অনির্ধারিত হতে - কিন্তু এটি এখনও pathologically বিভ্রান্তিকর হচ্ছে।
এই প্রকারের অনির্ধারিত আচরণ সম্পর্কিত সমস্ত প্রশ্নের উত্তরগুলিও এই দেখুন ।
কিন্তু আপনি k=k++অংশ সম্পর্কে জিজ্ঞাসা করেন নি । আপনি প্রথম বিভ্রান্তিকর অংশ, +(+k--)!=0অবস্থা সম্পর্কে জিজ্ঞাসা করেছিলেন । এই অদ্ভুত দেখায়, কারণ এটি হয় অদ্ভুত। কেউ কখনও কখনও আসল প্রোগ্রামে এ জাতীয় কোড লিখবে না। সুতরাং এটি কীভাবে বুঝতে হয় তা শেখার কোনও কারণ নেই। (হ্যাঁ, এটি সত্য, কোনও সিস্টেমের সীমানা অন্বেষণ করা আপনাকে এর সূক্ষ্ম বিষয়গুলি সম্পর্কে জানতে সাহায্য করতে পারে, তবে আমার বইতে কল্পিত, চিন্তা-চিত্তাকর্ষক অনুসন্ধান বনাম ডেনারহেড, অবমাননাকর অন্বেষণের মধ্যে একটি সুন্দর স্পষ্ট লাইন রয়েছে এবং এই অভিব্যক্তিটি খুব স্পষ্টভাবে এই লাইনের ভুল দিক।)
যাইহোক, আসুন পরীক্ষা করা যাক +(+k--)!=0। (এবং এটি করার পরে, আসুন এটি সম্পর্কে সমস্ত কিছু ভুলে যাওয়া উচিত)) এর মতো কোনও অভিব্যক্তিটি ভিতর থেকে বুঝতে হবে। আমি অনুমান করি আপনি কি জানেন
k--
আছে। এটির kবর্তমান মানটি নেয় এবং বাকী বাক্যটিতে এটি "রিটার্ন" দেয় এবং এটি আরও বা কম সময়ে একসাথে হ্রাস পায় k, এটি পরিমাণটি k-1ফিরিয়ে দেয় k।
কিন্তু তাহলে কি করবে +? এটি অ্যানারি প্লাস, বাইনারি প্লাস নয়। এটি ঠিক একাকার বিয়োগের মতো। আপনি জানেন যে বাইনারি বিয়োগ বিয়োগ করে: প্রকাশ
a - b
a থেকে বি বিয়োগ করে। এবং আপনি জানেন যে অযৌক্ত বিয়োগ জিনিসগুলিকে অবজ্ঞা করে: প্রকাশ expression
-a
আপনি একটি এর নেতিবাচক দেয়। অযৌক্তিকর +কাজটি হ'ল ... মূলত কিছুই নয়। +aদেয় আপনি aএর মান, নেতিবাচক ইতিবাচক ও নেতিবাচক মান ধনাত্মক মান পরিবর্তন করার পর। তাই প্রকাশ
+k--
আপনাকে যা k--দিয়েছে তা দেয় , kএটির পুরানো মান।
কিন্তু আমরা শেষ করিনি, কারণ আমাদের রয়েছে
+(+k--)
এটি +k--আপনাকে যা দিয়েছে তা কেবল গ্রহণ করে এবং +এটিতে আবার অকার্যকর প্রয়োগ করে । সুতরাং এটি আপনাকে যা দেয় তাই দেয় +k--যা k--যা আপনাকে দিয়েছিল যা kপুরানো মূল্য ছিল old
সুতরাং শেষ পর্যন্ত, অবস্থা
while(+(+k--)!=0)
আরও সাধারণ অবস্থা হিসাবে ঠিক একই জিনিস
while(k-- != 0)
করে ফেলতাম. (এটি আরও জটিল-দৃষ্টিকোণ অবস্থা যেমন while(+(+(+(+k--)))!=0)করত তেমনই কাজ করে And এবং এই প্রথম বন্ধনীগুলি সত্যই প্রয়োজনীয় নয়; এটিও একই কাজ করে while(+ + + +k--!=0)done
এমনকি "সাধারণ" অবস্থাটি কী তা নির্ধারণ করা হচ্ছে
while(k-- != 0)
নাটক এক ধরণের। এই লুপটিতে দুটি ধরণের জিনিস চলছে: লুপটি সম্ভাব্য একাধিকবার চলার সাথে সাথে আমরা যাচ্ছি:
- আরও ছোট এবং আরও ছোট
k--করতে, চালিয়ে যানk
- লুপের বডিটি চালিয়ে যান, যা কিছু তা করে।
তবে আমরা k--লুপটি দিয়ে অন্য কোনও ট্রিপ নেব কিনা তা সিদ্ধান্ত নেওয়ার আগে (বা প্রক্রিয়াধীন) এখনই অংশটি ঠিক করি । এবং মনে রাখবেন যে এটি হ্রাস করার আগে k--তার পুরানো মানটিকে "ফিরিয়ে দেয়" k। এই প্রোগ্রামে, প্রাথমিক মান k0 হয় তাই k--পুরানো মান 0 "ফিরে" যাচ্ছে, তারপরে k-1 এ আপডেট করুন। তবে বাকি শর্তটি হল != 0- তবে আমরা যেমনটি দেখেছি, প্রথমবার শর্তটি পরীক্ষা করার সময় আমরা একটি 0 পেয়েছিলাম। সুতরাং আমরা লুপের মাধ্যমে কোনও ট্রিপ করব না, তাই আমরা কার্যকর করার চেষ্টা করব না সমস্যাযুক্ত বিবৃতি k=k++এ সব।
অন্য কথায়, এই বিশেষ লুপে, যদিও আমি বলেছিলাম যে "এখানে দুটি ধরণের জিনিস চলছে", এটি প্রমাণিত হয় যে জিনিসটি 1 একবার ঘটে, তবে জিনিসটি শূন্য বার ঘটে।
যে কোনও হারে, আমি আশা করি এটি এখন পর্যাপ্তরূপে পরিষ্কার হয়ে গেছে যে কোনও প্রোগ্রামের এই দরিদ্র অজুহাতটি প্রিন্টিং -১ এর চূড়ান্ত মান হিসাবে শেষ হয় না k। সাধারণত, আমি এই জাতীয় কুইজের প্রশ্নের উত্তর দিতে পছন্দ করি না - এটি প্রতারণার মতো বলে মনে হয় - তবে এই ক্ষেত্রে, যেহেতু আমি কৌতূহলের সাথে মহড়ার পুরো বিষয়টিটির সাথে একমত নই, তাতে আমার আপত্তি নেই।