রিটার্ন সহ সি ++ তে কমা অপারেটরের বিভিন্ন আচরণ?


83

এটি ( কমা অপারেটর নোট করুন ):

#include <iostream>
int main() {
    int x;
    x = 2, 3;
    std::cout << x << "\n";
    return 0;
}

ফলাফল 2

তবে আপনি যদি returnকমা অপারেটরের সাথে ব্যবহার করেন তবে এটি:

#include <iostream>
int f() { return 2, 3; }
int main() {
    int x;
    x = f();
    std::cout << x << "\n";
    return 0;
}

ফলাফল 3

কমা অপারেটর কেন অন্যরকম আচরণ করছে return?


উত্তর:


140

অপারেটর অগ্রাধিকার অনুসারে , কমা অপারেটরের চেয়ে কম অগ্রাধিকার রয়েছে operator=, তাই x = 2,3;সমান (x = 2),3;। (অপারেটর নজিরটি নির্ধারণ করে যে অপারেটর কীভাবে তার পূর্ববর্তী অনুসারে অন্যান্য অপারেটরের তুলনায় তার যুক্তি, শক্ত বা লুজার সাথে আবদ্ধ থাকবে))

নোট কমা প্রকাশ (x = 2),3এখানে আছে, না 2,3x = 2প্রথমে মূল্যায়ন করা হয় (এবং এর পার্শ্ব প্রতিক্রিয়াগুলি সম্পূর্ণ হয়ে যায়), তারপরে ফলাফলটি বাতিল করা হয়, তারপরে 3মূল্যায়ন করা হয় (এটি বাস্তবে কিছুই করে না)। কেন এর মান এটা xহয় 2। নোটটি 3সম্পূর্ণ কমা অভিব্যক্তির ফলাফল (যেমন x = 2,3), এটি বরাদ্দ করতে ব্যবহৃত হবে না x। (এটিকে পরিবর্তন করে x = (2,3);, xনিয়োগ দেওয়া হবে 3))

জন্য return 2,3;, কমা অভিব্যক্তি 2,3, 2তারপর মূল্যায়ন করা হয় তার ফলাফলের বাতিল করা হয়, এবং তারপর 3মূল্যায়ন এবং সমগ্র কমা অভিব্যক্তি, যার দ্বারা ফিরিয়ে দেওয়া হয় এর ফলে ফিরিয়ে দেওয়া হয় ফিরতি বিবৃতি পরে।


এক্সপ্রেশন এবং বিবৃতি সম্পর্কে অতিরিক্ত তথ্য

একটি এক্সপ্রেশন অপারেটর এবং তাদের অপারেশনগুলির ক্রম, যা একটি গণনা নির্দিষ্ট করে।

x = 2,3;হ'ল অভিব্যক্তি , x = 2,3এখানে প্রকাশ the

সেমিকোলনের পরে প্রকাশিত একটি বিবৃতি একটি বিবৃতি।

বাক্য গঠন: attr(optional) expression(optional) ; (1)

return 2,3;হ'ল জাম্প স্টেটমেন্ট ( রিটার্ন স্টেটমেন্ট ), 2,3এটি এখানে প্রকাশ।

বাক্য গঠন: attr(optional) return expression(optional) ; (1)


4
ভাল ব্যাখ্যা। কিন্তু কিছু ব্যবহারিক প্রয়োগ আছে? বা শুধু ত্রুটি করা হবে?
জিন-ফ্রান্সোইস ফ্যাব্রে

7
@ জিন-ফ্রেঞ্চোইস ফ্যাবের আইএমও এটি কেবল বিভ্রান্তিকর, মোটেই কার্যকর নয়।
গীতয়ানুয়াও

11
আমি এটি একবারে বা দু'বার forলুপগুলিতে ব্যবহার করে দেখেছি যখন উদ্ভট, এটি সংখ্যার গণনায় কোড পরিষ্কার করতে পারে।
বাথশেবা

6
@ জিন-ফ্রেঞ্চোইসফ্যাব্রে: বাথশেবা যেমন বলেছেন, এটি এমন যাতে আপনি i += 1, j += 2লুপের জন্য কিছু লিখতে পারেন । কেউ সিদ্ধান্ত নিয়েছে যে সি ++ ব্যাকরণ (বা বরং সি ব্যাকরণ, যেহেতু এই অংশটি সেখান থেকে অনুলিপি করা হয়েছিল) ইতিমধ্যে এটি জটিল হিসাবে জটিল হয়েছে যে আপনি যখন লেখেন তখন কমাটির নজির অ্যাসাইনমেন্টের চেয়ে বেশি x = 2, 3তবে আপনি যখন লেখেন তখন কম হয় x = 2, y = 3!
স্টিভ জেসোপ

4
@ হোলজার: সেমিকোলন একটি বিবৃতি শেষ করে, এটি কোনও অপারেটর নয়। এটি আরও পরিষ্কার করার জন্য উত্তরটি টুইট করা যেতে পারে এমনটি। "x = 2, 3" 2 টি অপারেটরের সাথে একটি অভিব্যক্তি, এবং (;;) এর পক্ষে সমর্থন করার কারণে, = এর উচ্চতর প্রাধান্য রয়েছে। (যেমনটি সবাই বলেছে।) তবে "2, 3; "2, 3" এক্সপ্রেশন ধারণ করে এমন একটি বিবৃতি। সেখানে নেই টেকনিক্যালি KEYWORD "আয়" করার জন্য একটি প্রাধান্য। (যদিও কার্যকরভাবে , বিবৃতি যে অভিব্যক্তি গ্রহণ তা অংশ সাল থেকে গত পার্স করা হয় - "প্রাধান্য" নীচু কোনো অপারেটর চেয়ে মধ্যে অভিব্যক্তি।)
Micha বার্জার

32

কমা ( এক্সপ্রেশন বিভাজন হিসাবেও পরিচিত ) অপারেটরটি বাম থেকে ডানে মূল্যায়ন করা হয়। সুতরাং return 2,3;সমতূল্য return 3;

অপারেটর অগ্রাধিকার কারণে এর মূল্যায়ন x = 2,3;হয় । মূল্যায়ন এখনও বাম থেকে ডানে এবং পুরো এক্সপ্রেশনটির মান 3 এর মান ধরে নিয়ে যাওয়ার পার্শ্ব-প্রতিক্রিয়া সহ 3 টির মান রয়েছে।(x = 2), 3;x


4
আপনি দয়া করে এক্সপ্রেশন বিভাজন অপারেটর সম্পর্কে আরও সম্পাদনা করতে এবং বিস্তৃত করতে পারেন ? আমি @ গ্যুয়ানুয়াওয়ের উত্তরের একটি মন্তব্যে উল্লেখ করেছি, আমি বুঝতে পারি কেন return 2,3এবং কেন return (2,3)একই। আমি বিশ্বাস করি প্রাক্তন হওয়া উচিত (return 2),3
xyz

@ বিয়াজিও ফেস্টা সেই অংশটি ভালভাবে ব্যাখ্যা করেছেন।
বাথশেবা

4
@ প্রখারসিংহ 95 return 2একটি বিবৃতি (যেমন তৈরি করেছেন যেমন for,while,if), কোনও অভিব্যক্তি নয়। আপনি যেমন লিখতে পারবেন না f(return 2)বা 2+return 2। সুতরাং, (return 2),3সিনথেটিকভাবে অবৈধ।
চি

হ্যাঁ, আপনি ঠিক বলেছেন আমি বোঝাচ্ছিলাম আমি যেমন ব্যাখ্যাreturn 2, 3 করা হবে বলে আশা করছিলাম । (return 2), 3
xyz

4
@ প্রখারসিংহ 95 টি সি ++ এর ব্যাকরণ অনুসারে returnকেবল নিম্নলিখিত ক্ষেত্রে ঘটতে পারে: (ক) return এক্সপ্রেশন_ওপ্ট ; , এবং (খ) return ব্রেসড-থ্রি-তালিকা ;
এমএম

20

এই বিবৃতি:

  x = 2,3;

দুটি অভিব্যক্তি দ্বারা রচিত :

> x = 2
> 3

অপারেটর প্রাধান্য যেহেতু , =কমা অপেক্ষা তার চেয়ে বেশি অগ্রাধিকার রয়েছে ,, তাই x = 2মূল্যায়ন করা হয় এবং পরে 3 । তারপরে xসমান হবে 2


ইন returnপরিবর্তে:

int f(){ return 2,3; }

ভাষার বাক্য গঠনটি হ'ল:

return <expression>

নোট return প্রকাশের অংশ নয়।

সুতরাং সেই ক্ষেত্রে দুটি অভিব্যক্তি মূল্যায়ন করা হবে:

> 2
> 3

তবে কেবল দ্বিতীয় ( 3) প্রদান করা হবে।


4
UV'd। খুব পিক, তবে আপনি যদি <expression>স্পষ্টভাবে optionচ্ছিক হিসাবে চিহ্নিত হন (ব্যাকরণের দৃষ্টিকোণ থেকে) ভাল লাগবে be
বাথশেবা

4
এর পার্স গাছে 5 টি এক্সপ্রেশন রয়েছে x=2,3। উভয় আক্ষরিক 2এবং 3পার্স গাছের নীচে, শনাক্তকারী হিসাবে x। এগুলি সমস্ত স্বতন্ত্রভাবে বৈধ এক্সপ্রেশন। অপারেটর অগ্রাধিকার অর্থ পার্স গাছে কম হয় এবং দুটি এক্সপ্রেশন এবং চতুর্থ অভিব্যক্তির মধ্যে সংমিশ্রণ =ঘটে । অবশেষে, পঞ্চম অভিব্যক্তি কমা অপারেটর তার দুই পক্ষের যোগদান করে গঠিত হয় এবং । তবে, আপনি ভুলভাবে বলেছেন যে অপারেটর অগ্রাধিকার মূল্যায়নের ক্রম নির্ধারণ করে । এটা হয় না। ক্রমবিধি বিধি দ্বারা মূল্যায়ন ক্রম নির্ধারিত হয়। x2x=2x=23
এমসাল্টারস

4
আমি এই উল্লেখ করে ভোট দিয়েছি যে রিটার্ন কোনও অভিব্যক্তির অংশ নয়
ড্যানিয়েল জোর

@MSalters আমি আপনার সাথে একমত, কিন্তু আমি শুধু ভুল শব্দ "ব্যবহৃত কারণ " এর পরিবর্তে, " যেহেতু "। আমার ইংরাজির কিছু এত নিখুঁত নয়! ; - =
বিয়াজিও ফেস্তা

4
"ম্যাক্রো-এক্সপ্রেশন" কি এখানে প্রযুক্তিগত শব্দ? প্রিপ্রোসেসর উপাদান হিসাবে "ম্যাক্রো এক্সপ্রেশন" উপস্থিত থাকলে এটি কিছুটা বিভ্রান্ত বলে মনে হয়।
সেনসিন

2

সহজলভ্য পদ্ধতির প্রয়োগ করার চেষ্টা করুন কেবল প্রথম বন্ধনীর সাথে অগ্রাধিকার তুলে ধরে:

( x = 2 ), 3;

return ( 2, 3 );

এখন আমরা বাইনারি অপারেটরটি "," বাম থেকে ডানে উভয় ক্ষেত্রে একইভাবে কাজ করতে দেখি।


4
কৌতুকপূর্ণ অংশটি বুঝতে পেরেছিল যে এটি x = 2, 3নিজেই একটি অভিব্যক্তি, যদিও returnএটির জন্য return <expression>। সুতরাং আপনি তাদের হিসাবে (x = 2, 3)এবং পড়া (2, 3)
xyz
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.