আমাদের যদি তিনটি ফাংশন থাকে (ফু, বার এবং বাজ) যা এর মতো রচিত ...
foo(bar(), baz())
সি ++ স্ট্যান্ডার্ডের এমন কোনও গ্যারান্টি আছে যে বাজের আগে বারটি মূল্যায়ন করবে?
আমাদের যদি তিনটি ফাংশন থাকে (ফু, বার এবং বাজ) যা এর মতো রচিত ...
foo(bar(), baz())
সি ++ স্ট্যান্ডার্ডের এমন কোনও গ্যারান্টি আছে যে বাজের আগে বারটি মূল্যায়ন করবে?
উত্তর:
না, এরকম কোনও গ্যারান্টি নেই। এটি সি ++ স্ট্যান্ডার্ড অনুযায়ী অনির্ধারিত।
বজর্ন স্ট্রস্ট্রপও কিছু যুক্তি সহ এটি "দ্য সি ++ প্রোগ্রামিং ল্যাঙ্গুয়েজ" তৃতীয় সংস্করণ বিভাগে স্পষ্টভাবে বলেছেন:
এক্সপ্রেশন মূল্যায়ন আদেশের উপর বিধিনিষেধের অভাবে আরও ভাল কোড তৈরি করা যেতে পারে
যদিও প্রযুক্তিগতভাবে এটি একই বিভাগের পূর্ববর্তী অংশকে বোঝায় যা বলে যে একটি অভিব্যক্তির অংশগুলির মূল্যায়নের ক্রমটিও অনির্ধারিত, অর্থাৎ
int x = f(2) + g(3); // unspecified whether f() or g() is called first
[5.2.2] ফাংশন কল থেকে,
যুক্তিগুলির মূল্যায়নের ক্রমটি অনির্ধারিত। ফাংশন প্রবেশের আগে যুক্তি প্রকাশের মূল্যায়নের সমস্ত পার্শ্ব প্রতিক্রিয়া কার্যকর হয়।
অতএব, কোনও গ্যারান্টি নেই যা bar()
আগে চলবে baz()
, কেবল এটিই bar()
এবং এর baz()
আগে ডাকা হবে foo
।
[5] থেকে প্রকাশিত অভিব্যক্তিগুলি থেকে নোট করুন:
যেখানে উল্লেখ করা হয়েছে [উদাহরণস্বরূপ এর জন্য বিশেষ বিধি
&&
এবং||
], পৃথক অপারেটরগুলির অপারেশনগুলির মূল্যায়নের ক্রম এবং স্বতন্ত্র এক্সপ্রেশনগুলির সুব এক্সপ্রেসন এবং পার্শ্ব প্রতিক্রিয়াগুলির ক্রমটি অনির্দিষ্ট the
তাই এমনকি যদি আপনি কিনা জিজ্ঞাসা করা হয় bar()
আগে চালানো হবে baz()
মধ্যে foo(bar() + baz())
, অর্ডার এখনও অনির্দিষ্ট হয়।
&
, &&
বাম থেকে ডানদিকের মূল্যায়নের গ্যারান্টি রয়েছে: দ্বিতীয় অপারেন্ডটি প্রথম অপারেন্ড হলে মূল্যায়ন হয় না false
।"
বার () এবং বাজ () এর জন্য কোনও নির্দিষ্ট আদেশ নেই - স্ট্যান্ডার্ড যা বলেছে কেবল তা হ'ল foo () বলার আগে উভয়কেই মূল্যায়ন করা হবে। সি ++ স্ট্যান্ডার্ড থেকে বিভাগ 5.2.2 / 8:
যুক্তিগুলির মূল্যায়নের ক্রমটি অনির্ধারিত।
bar
, তারপরে লাইন 1 baz
, তারপরে লাইন 2 bar
ইত্যাদি), যা খুব সুন্দর। :-)
সি ++ 17 অপারেটরদের জন্য মূল্যায়ন ক্রম নির্দিষ্ট করে যা সি ++ 17 পর্যন্ত অনির্দিষ্ট ছিল। প্রশ্নটি দেখুন সি ++ 17 দ্বারা প্রবর্তিত মূল্যায়ন আদেশের গ্যারান্টিগুলি কী কী? তবে আপনার অভিব্যক্তি নোট করুন
foo(bar(), baz())
এখনও নির্ধারিত মূল্যায়ন আদেশ আছে।
সি ++ 11 এ, প্রাসঙ্গিক পাঠ্য 8.3.6 ডিফল্ট আর্গুমেন্ট / 9 এ পাওয়া যাবে (জোর দিয়ে খনি)
ডিফল্ট আর্গুমেন্টগুলি প্রতিটি বার ফাংশনটি বলা হওয়ার পরে মূল্যায়ন করা হয়। ফাংশন আর্গুমেন্টগুলির মূল্যায়নের ক্রমটি অনির্দিষ্ট । ফলস্বরূপ, কোনও ক্রিয়াকলাপের প্যারামিটারগুলি মূল্যায়ন না হলেও ডিফল্ট যুক্তিতে ব্যবহার করা হবে না।
একই ভার্চিয়াটি সি ++ 14 স্ট্যান্ডার্ডও ব্যবহার করে এবং একই বিভাগে এটি পাওয়া যায় ।
যেমন অন্যরা ইতিমধ্যে উল্লেখ করেছে, মান এই নির্দিষ্ট দৃশ্যের জন্য মূল্যায়নের আদেশের বিষয়ে কোনও দিকনির্দেশনা দেয় না। এর পরে মূল্যায়নের এই ক্রমটি সংকলককে ছেড়ে দেওয়া হয়েছে, এবং সংকলকের একটি গ্যারান্টি থাকতে পারে।
এটা মনে রাখা জরুরী যে সি ++ স্ট্যান্ডার্ডটি আসলে এসেম্বলি / মেশিন কোড তৈরির ক্ষেত্রে একটি সংকলককে নির্দেশ দেওয়ার জন্য একটি ভাষা। মানটি সমীকরণের একমাত্র অংশ। যেখানে স্ট্যান্ডার্ডটি দ্ব্যর্থক বা নির্দিষ্টভাবে প্রয়োগের সংজ্ঞা দেওয়া হয়েছে আপনাকে সংকলকটির দিকে ফেরা উচিত এবং বুঝতে হবে যে এটি সি ++ নির্দেশিকাগুলিকে সত্য মেশিনের ভাষায় কীভাবে অনুবাদ করে।
সুতরাং, যদি মূল্যায়নের ক্রমটি একটি প্রয়োজনীয়তা বা কমপক্ষে গুরুত্বপূর্ণ এবং ক্রস সংকলক সামঞ্জস্যপূর্ণ হওয়া কোনও প্রয়োজন না হয় তবে অনুসন্ধান করুন যে আপনার সংকলক শেষ পর্যন্ত কীভাবে এটি একসাথে টুকরো টুকরো করবে, আপনার উত্তরটি চূড়ান্তভাবে মিথ্যা বলতে পারে। নোট করুন যে সংকলক ভবিষ্যতে এটির পদ্ধতি পরিবর্তন করতে পারে