আমি মূল্যায়নের লঙ্ঘনের ক্রম সম্পর্কে পড়ছিলাম এবং তারা একটি উদাহরণ দেয় যা আমাকে ধাঁধা দেয়।
1) যদি স্কেলার অবজেক্টের কোনও পার্শ্ব প্রতিক্রিয়া একই স্কেলার অবজেক্টের অন্য পার্শ্ব প্রতিক্রিয়ার তুলনায় আন-সিকোয়েন্সড হয় তবে আচরণটি অপরিজ্ঞাত।
// snip f(i = -1, i = -1); // undefined behavior
এই প্রসঙ্গে, i
একটি স্কেলার অবজেক্ট , যা আপাতভাবে বোঝায়
পাটিগণিত প্রকার (9.৯.১), গণনার প্রকার, পয়েন্টার প্রকার, পয়েন্টার টু মেম্বার টাইপ (9.৯.২), স্টাড :: নাল্পটার_টি, এবং এই ধরণের সিভি-কোয়ালিটিড ভার্সন (৩.৯.৩) সম্মিলিতভাবে স্কেলার প্রকার বলে।
সেক্ষেত্রে বিবৃতিটি কীভাবে অস্পষ্ট তা আমি দেখতে পাই না। আমার কাছে মনে হয় প্রথম বা দ্বিতীয় যুক্তির মূল্যায়ন যদি প্রথমে i
করা হয় তবে তার সমাপ্তি ঘটে -1
এবং উভয় যুক্তিও একই রকম -1
।
কেউ দয়া করে স্পষ্ট করতে পারেন?
হালনাগাদ
আমি সত্যিই সমস্ত আলোচনার প্রশংসা করি। এখনও অবধি, আমি @ ক্ষতিকারকদের উত্তরটি অনেক পছন্দ করি যেহেতু এটি প্রথম নজরে কতটা সোজা এগিয়ে দেখায় তবুও এই বিবৃতিটি সংজ্ঞায়িত করার সমস্যাগুলি এবং জটিলতাগুলি প্রকাশ করে। @ অচিয়ং ৮87 কিছু উল্লেখ রয়েছে যা রেফারেন্সগুলি ব্যবহার করার সময় উঠে আসে তবে আমি মনে করি যে এটি এই প্রশ্নের অনিশ্চিত পার্শ্ব প্রতিক্রিয়াগুলির দিক থেকে অরথগোনাল।
সারসংক্ষেপ
এই প্রশ্নটি যেহেতু এক টন মনোযোগ পেয়েছে, তাই আমি মূল পয়েন্টগুলি / উত্তরগুলির সংক্ষিপ্তসার করব। প্রথমে, আমাকে একটি ছোট ডিগ্রেশন চিহ্নিত করতে অনুমতি দিন যে "কেন" খুব সূক্ষ্মভাবে পৃথক অর্থের সাথে সম্পর্কিত হতে পারে, যথা "কী কারণে ", "কোন কারণে " এবং "কী উদ্দেশ্যে "। তারা যে কারণে "কেন" বোঝায় সেগুলির মধ্যে কোনটির দ্বারা আমি উত্তরগুলিকে গ্রুপ করব।
কি কারণে
এখানে মূল উত্তরটি পল ড্রাগার থেকে এসেছে , মার্টিন জে যেমন একটি একইরকম অবদান রেখেছিলেন তবে ব্যাপক উত্তর হিসাবে নয়। পল ড্রাগার এর উত্তর ফোটে
এটি অপরিজ্ঞাত আচরণ কারণ এটি আচরণটি কী তা সংজ্ঞায়িত করা হয় না।
উত্তরটি সি ++ স্ট্যান্ডার্ড কী বলে তা বোঝানোর ক্ষেত্রে সামগ্রিকভাবে খুব ভাল। এটি ইউবির সম্পর্কিত কিছু ক্ষেত্রে যেমন f(++i, ++i);
এবং তেমন সমাধান করে f(i=1, i=-1);
। সম্পর্কিত ক্ষেত্রে প্রথমটিতে, এটি প্রথম স্পষ্ট নয় যে প্রথম যুক্তিটি হওয়া উচিত i+1
এবং দ্বিতীয়টি i+2
বা তদ্বিপরীত; দ্বিতীয়টিতে, এটি স্পষ্ট নয় যে i
ফাংশন কলের পরে 1 বা -1 হওয়া উচিত। এই দুটি ক্ষেত্রেই ইউবি হওয়ায় তারা নিম্নলিখিত নিয়মের আওতায় পড়ে:
যদি স্কেলার অবজেক্টের কোনও পার্শ্ব প্রতিক্রিয়া একই স্কেলার অবজেক্টের অন্য পার্শ্ব প্রতিক্রিয়ার সাথে তুলনামূলকভাবে অমীমাংসিত হয় তবে আচরণটি অপরিজ্ঞাত।
সুতরাং, f(i=-1, i=-1)
একই সাথে ইউবিও যেহেতু এটি একই নিয়মের আওতায় আসে, তবুও প্রোগ্রামারের উদ্দেশ্য (আইএমএইচও) সুস্পষ্ট এবং দ্ব্যর্থহীন।
পল ড্রাগারও তার উপসংহারে এটি স্পষ্ট করে তুলেছেন
এটি আচরণ সংজ্ঞায়িত করা যেতে পারে? হ্যাঁ. এটি সংজ্ঞায়িত ছিল? না।
যা আমাদের "এই কারণে কেন / উদ্দেশ্যকে f(i=-1, i=-1)
অপরিজ্ঞাত আচরণ হিসাবে রেখে গেছে?" এমন প্রশ্নে নিয়ে আসে ?
কি কারণে / উদ্দেশ্যে
যদিও সি ++ স্ট্যান্ডার্ডে কিছু তদারকি (সম্ভবত অসাবধান) রয়েছে, তবে অনেকগুলি বাদ দেওয়া যথাযথ যুক্তিযুক্ত এবং একটি নির্দিষ্ট উদ্দেশ্যে পরিবেশন করে। যদিও আমি সচেতন যে উদ্দেশ্যটি প্রায়শই হয় "সংকলক-লেখকের কাজকে সহজ করে তোলে", বা "দ্রুত কোড", তবে ইউবি হিসাবে কোনও ভাল কারণ ছাড়ার কারণ আছে কিনা তা জানতে আমি আগ্রহী ছিলাম f(i=-1, i=-1)
।
harmic এবং supercat প্রধান উত্তর করে একটি প্রদান প্রদান কারণ UB জন্য। হার্মিক উল্লেখ করে যে একটি অপ্টিমাইজ করা সংকলক যা সম্ভবত একাধিক মেশিনের নির্দেশাবলীতে পরমাণু নির্ধারিত ক্রিয়াকলাপ ভেঙে ফেলতে পারে এবং এটি সর্বোত্তম গতির জন্য সেই নির্দেশাবলীটি আরও ফাঁকা রাখতে পারে। এটি কিছু চমকপ্রদ ফলাফলের দিকে নিয়ে যেতে পারে: i
তার দৃশ্যে -2 হিসাবে শেষ হয়! সুতরাং, ক্ষতিকারক প্রদর্শন করে যে চলকটিতে একই মানটিকে একবারের চেয়ে আরও একবারে নির্ধারণ করা যদি অপারেশনগুলি অনিরাপদ করা হয় তবে কীভাবে খারাপ প্রভাব ফেলতে পারে।
সুপারক্যাট f(i=-1, i=-1)
যা করা উচিত তা দেখে মনে হচ্ছে যা করার চেষ্টা করার ক্ষতির একটি সম্পর্কিত চিত্র প্রদর্শন করে । তিনি উল্লেখ করেছেন যে কিছু স্থাপত্যে একই মেমরি ঠিকানায় একসাথে একাধিক লেখার বিরুদ্ধে কঠোর বিধিনিষেধ রয়েছে। যদি আমরা এর চেয়ে কম তুচ্ছ কিছু নিয়ে কাজ করি তবে একটি সংকলককে এটি ধরতে বেশ কঠিন সময় থাকতে পারে f(i=-1, i=-1)
।
davidf খুব harmic এর অনুরূপ interleaving নির্দেশাবলীর একটি উদাহরণ প্রদান করে।
যদিও প্রত্যেকটি ক্ষতিকারক, সুপারক্যাট এবং ডেভিডফের উদাহরণগুলি কিছুটা সংশ্লেষিত, একত্রিত হয়ে তারা এখনও একটি f(i=-1, i=-1)
সংজ্ঞায়িত কারণ প্রদানের জন্য পরিবেশন করে যে কেন অপরিজ্ঞাত আচরণ করা উচিত।
আমি হারিকের জবাব গ্রহণ করেছি কারণ কেন পল ড্রেপারের উত্তর "কী কারণে" অংশটিকে আরও ভালভাবে সম্বোধন করেছিল, তার সমস্ত অর্থকে সম্বোধন করার সেরা কাজটি করেছিল।
অন্যান্য উত্তর
জনবি উল্লেখ করেছে যে আমরা যদি ওভারলোডেড অ্যাসাইনমেন্ট অপারেটরগুলি (কেবল প্লেইন স্কেলারের পরিবর্তে) বিবেচনা করি তবে আমরাও সমস্যার মধ্যে পড়তে পারি।
f(i-1, i = -1)
বা অনুরূপ কিছু।
std::nullptr_t
এবং সিভি- কোয়ালিটিড সংস্করণ (৩.৯.৩) সম্মিলিতভাবে স্কেলার প্রকার বলে । "