হ্যাঁ, এটি আদেশ দেয় (মূল্যায়ন আদেশ এবং শর্ট সার্কিট উভয়)। আপনার উদাহরণে যদি সমস্ত ফাংশন সত্য হয়, কলগুলির ক্রমটি ফাংশনএ এর পরে ফাংশনবি এবং তারপরে ফাংশনসি থেকে হয়। এই মত ব্যবহার করা হয়
if(ptr && ptr->value) {
...
}
কমা অপারেটরের জন্য একই:
// calls a, then b and evaluates to the value returned by b
// which is used to initialize c
int c = (a(), b());
এক বাম এবং ডান প্রতীক মধ্যে বলছেন &&
, ||
, ,
এবং প্রথম ও দ্বিতীয় / তৃতীয় প্রতীক মধ্যে ?:
(শর্তসাপেক্ষ অপারেটর) একটি "ক্রম বিন্দু" হয়। যে কোনও পার্শ্ব প্রতিক্রিয়াগুলি সেই বিন্দুর আগে সম্পূর্ণ মূল্যায়ন করা হয়। সুতরাং, এটি নিরাপদ:
int a = 0;
int b = (a++, a); // b initialized with 1, and a is 1
নোট করুন যে কমা অপারেটর জিনিস আলাদা করতে ব্যবহৃত সিনট্যাক্টিকাল কমা দিয়ে বিভ্রান্ত হবেন না:
// order of calls to a and b is unspecified!
function(a(), b());
সি ++ স্ট্যান্ডার্ড এতে বলে 5.14/1
:
&& অপারেটরগুলি বাম থেকে ডান গোষ্ঠীগুলি। অপারেশনগুলি উভয়ই স্পষ্টতই টাইপ বুলে রূপান্তরিত হয় (ধারা 4)। ফলস সত্য যদি উভয় অপারেশন সত্য এবং অন্যথায় মিথ্যা হয়। & এর বিপরীতে, && বাম থেকে ডান মূল্যায়নের গ্যারান্টি দেয়: প্রথম অপারেন্ডটি মিথ্যা হলে দ্বিতীয় অপারেন্ডকে মূল্যায়ন করা হয় না।
এবং ভিতরে 5.15/1
:
দি || অপারেটর গ্রুপগুলি বাম থেকে ডানদিকে। অপারেশনগুলি উভয়কেই স্পষ্টভাবে বিলে রূপান্তরিত করা হয়েছে (ধারা 4)। এটির সত্যিকারের অপারেশনগুলির মধ্যে দুটি যদি সত্য হয় এবং অন্যথায় মিথ্যা হয়। অপছন্দ |, || বাম থেকে ডান মূল্যায়নের গ্যারান্টি দেয়; তদ্ব্যতীত, প্রথম অপারেন্ডটি যদি সত্য হিসাবে মূল্যায়ন করে তবে দ্বিতীয় অপারেন্ডকে মূল্যায়ন করা হয় না।
এটি তাদের পাশের উভয়ের জন্যই বলে:
ফলাফল একটি বুল হয়। টেম্পোরারি ধ্বংস (12.2) ব্যতীত প্রথম প্রকাশের সমস্ত পার্শ্ব প্রতিক্রিয়াগুলি দ্বিতীয় প্রকাশটি মূল্যায়ন করার আগে ঘটে।
এটি ছাড়াও, 1.9/18
বলেছেন
প্রতিটি এক্সপ্রেশন মূল্যায়নে
a && b
a || b
a ? b : C
a , b
এই অভিব্যক্তিগুলিতে অপারেটরগুলির অন্তর্নির্মিত অর্থ ব্যবহার করে (5.14, 5.15, 5.16, 5.18), প্রথম প্রকাশের মূল্যায়নের পরে একটি ক্রম বিন্দু রয়েছে।