কমা অপারেটর কীভাবে কাজ করে


175

কমা অপারেটর কীভাবে সি ++ এ কাজ করে?

উদাহরণস্বরূপ, যদি আমি করি:

a = b, c;  

বি বা সি সমান সমাপ্তি ঘটে?

(হ্যাঁ, আমি জানি এটি পরীক্ষা করা সহজ - কারও উত্তর দ্রুত খুঁজে পেতে কেবল এখানে ডকুমেন্ট করা।)

আপডেট: কমা অপারেটর ব্যবহার করার সময় এই প্রশ্নটি একটি উপকারীতা প্রকাশ করেছে। কেবল এটি ডকুমেন্ট করতে:

a = b, c;    // a is set to the value of b!

a = (b, c);  // a is set to the value of c!

এই প্রশ্নটি আসলে টাইপের একটি টাইপ দ্বারা অনুপ্রাণিত হয়েছিল। যা হবার তাগিদ ছিল

a = b;
c = d;

পরিণত

a = b,    //  <-  Note comma typo!
c = d;

এখানে এটি সম্পর্কে আরও পড়ুন। stackoverflow.com/questions/12824378/…
কোডিং ম্যাশ

1
কমা অপারেটর P, C সি-তে কী করে তার সম্ভাব্য নকল ? । এটি আপনাকে একদিনের দ্বারা পরাজিত করেছে। এবং লিলকের উত্তর সম্পর্কে প্রশ্নের উত্তর সরবরাহ করে a = (b, c);
jww

5
কিন্তু এই ক্ষেত্রে a = b, c = d;আসলে উদ্দেশ্য হিসাবে একই সম্পাদন করে a = b; c = d;?
বন্ডলিন

পছন্দ করুন যদি bএবং যদি dকোনও ফাংশন মূল্যায়ন হয় যা একটি সাধারণ রাষ্ট্র ব্যবহার করে (এবং সংশোধন করে), তবে মৃত্যুদণ্ড কার্যকর করার আদেশটি সংজ্ঞায়িত করা হয় না C++17
নিউরোনিয়াম

উত্তর:



129

কমা অপারেটরটি সি ++ এ ওভারলোড হওয়া হতে পারে সেদিকে খেয়াল রাখুন। প্রকৃত আচরণটি প্রত্যাশার চেয়ে অনেক আলাদা হতে পারে।

উদাহরণস্বরূপ, বুস্ট.স্প্রিট প্রতীক টেবিলের জন্য তালিকা প্রারম্ভিক প্রয়োগ করতে কমা অপারেটরটি বেশ চালাকতার সাথে ব্যবহার করে। সুতরাং, এটি নিম্নলিখিত বাক্য গঠনটিকে সম্ভব এবং অর্থবহ করে তোলে:

keywords = "and", "or", "not", "xor";

লক্ষ্য করুন যে অপারেটর অগ্রাধিকারের কারণে কোডটি (ইচ্ছাকৃত!) একইরকম

(((keywords = "and"), "or"), "not"), "xor";

অর্থাৎ, প্রথম অপারেটর বলা হয় keywords.operator =("and")যা একটি প্রক্সি অবজেক্ট ফিরিয়ে দেয় যার উপরের বাকী operator,গুলি চাওয়া হয়:

keywords.operator =("and").operator ,("or").operator ,("not").operator ,("xor");

উম্ম, আপনি যদিও অগ্রাধিকার পরিবর্তন করতে পারবেন না, এর অর্থ সম্ভবত আপনার তালিকার চারপাশে প্রথম বন্ধনী স্থাপন করা উচিত।
জেফ বার্ডেজস

18
বিপরীতে @ জেফ তালিকার চারপাশে একটি প্রথম বন্ধনীর সাহায্যে এটি কাজ করবে না, তখন থেকে সংকলক কেবল দুজনের মধ্যে কমা অপারেটরটিকে দেখবে char[], যা ওভারলোড করা যায় না। কোডটি ইচ্ছাকৃতভাবে প্রথমে কল করে operator=এবং তারপরে পরবর্তীতে operator,প্রতিটি অবশিষ্ট উপাদানটির জন্য।
কনরাড রুডল্ফ

125

কমা অপারেটরের সমস্ত সি / সি ++ অপারেটরগুলির মধ্যে সর্বনিম্ন প্রাধান্য রয়েছে। সুতরাং এটি সর্বদাই সর্বশেষ যা একটি অভিব্যক্তি আবদ্ধ, যার অর্থ:

a = b, c;

সমান:

(a = b), c;

আর একটি মজার তথ্য হ'ল কমা অপারেটর একটি সিকোয়েন্স পয়েন্ট উপস্থাপন করে । এর অর্থ হ'ল অভিব্যক্তি:

a+b, c(), d

এর তিনটি subexpressions ( a + b , c () এবং d ) ক্রমানুসারে মূল্যায়ন করার গ্যারান্টিযুক্ত পার্শ্ব প্রতিক্রিয়া থাকলে এটি তাৎপর্যপূর্ণ। সাধারণত সংকলকরা যথাযথ যেভাবে ক্রমে subexpresstions মূল্যায়ন করার অনুমতি দেওয়া হয়; উদাহরণস্বরূপ, একটি ফাংশন কলে:

someFunc(arg1, arg2, arg3)

যুক্তিগুলি একটি স্বেচ্ছাসেবী ক্রমে মূল্যায়ন করা যেতে পারে। মনে রাখবেন যে ফাংশন কলের কমাগুলি অপারেটর নয় ; তারা বিচ্ছেদকারী হয়।


15
,এরকম কম প্রাধান্য রয়েছে বলে উল্লেখযোগ্যভাবে, এটি নিজের থেকেও পিছিয়ে যায় ;) ... এটি হ'ল: কমা-আস- অপারেটরের কমা-আস- বিভাজকের চেয়ে কম প্রাধান্য রয়েছে । সুতরাং, যদি আপনি একটি একক ফাংশন আর্গুমেন্ট, ভেরিয়েবল অ্যাসাইনমেন্ট, বা অন্যান্য কমা- বিচ্ছিন্ন তালিকার মধ্যে কমা- অ - অপারেটর ব্যবহার করতে চান - তবে আপনাকে প্রথম বন্ধনী ব্যবহার করা দরকার, যেমন:int a = 1, b = 2, weirdVariable = (++a, b), d = 4;
আন্ডারস্কোর_ডি

68

কমা অপারেটর:

  • সবচেয়ে কম নজরে আছে
  • বাম-সহযোগী হয়

কমা অপারেটরের একটি ডিফল্ট সংস্করণ সমস্ত ধরণের (অন্তর্নির্মিত এবং কাস্টম) জন্য সংজ্ঞায়িত করা হয়, এবং এটি নিম্নলিখিত হিসাবে কাজ করে - প্রদত্ত exprA , exprB:

  • exprA মূল্যায়ন করা হয়
  • ফলাফল exprAউপেক্ষা করা হয়
  • exprB মূল্যায়ন করা হয়
  • ফলে exprBপুরো মত প্রকাশের ফলে ফিরিয়ে দেওয়া হয়

বেশিরভাগ অপারেটরগুলির সাথে, সংকলকটিকে মৃত্যুদন্ডের ক্রমটি বেছে নেওয়ার অনুমতি দেওয়া হয় এবং এটি যদি চূড়ান্ত ফলাফলকে প্রভাবিত না করে তবে এক্সিকিউশনটি এড়িয়ে যাওয়া এমনকি প্রয়োজন (উদাহরণস্বরূপ false && foo()কলটি এড়িয়ে যাবে foo)। এটি কমা অপারেটরের ক্ষেত্রে নয় তবে উপরের পদক্ষেপগুলি সর্বদা ঘটবে *

অনুশীলনে, ডিফল্ট কমা অপারেটর প্রায় একইভাবে সেমিকোলনের মতো কাজ করে। পার্থক্যটি হ'ল সেমিকোলন দ্বারা বিভক্ত দুটি এক্সপ্রেশন দুটি পৃথক বিবৃতি গঠন করে, অন্যদিকে কমা-বিচ্ছেদ সমস্তকে একক প্রকাশ হিসাবে রাখে। এই কারণেই কমা অপারেটরটি মাঝে মাঝে নিম্নলিখিত পরিস্থিতিতে ব্যবহৃত হয়:

  • সি সিনট্যাক্সের জন্য একটি বিবৃতি নয়, একটি একক অভিব্যক্তি প্রয়োজন । যেমনif( HERE )
  • সি সিনট্যাক্সের জন্য একটি একক বিবৃতি প্রয়োজন, আরও নয়, যেমন forলুপের সূচনাতেfor ( HERE ; ; )
  • আপনি যখন কোঁকড়া ধনুর্বন্ধনী এড়িয়ে একটি একক বিবৃতি রাখতে চান: if (foo) HERE ;(দয়া করে এটি করবেন না, এটি সত্যিই কুৎসিত!)

যখন কোনও বিবৃতি কোনও অভিব্যক্তি নয়, সেমিকোলনটি কমা দ্বারা প্রতিস্থাপন করা যায় না। উদাহরণস্বরূপ এগুলি অনুমোদিত নয়:

  • (foo, if (foo) bar)( ifএকটি অভিব্যক্তি নয়)
  • ইন্ট এক্স, ইনট y (ভেরিয়েবল ডিক্লেয়ারেশন এক্সপ্রেশন নয়)

আপনার ক্ষেত্রে আমাদের আছে:

  • a=b, c;, সমতুল্য a=b; c; , ধরে নিচ্ছি যে aএটি এমন ধরণের যা কমা অপারেটরকে ওভারলোড করে না।
  • a = b, c = d;সমান a=b; c=d;, ধরে নিচ্ছি যেa এটি এমন ধরণের যা কমা অপারেটরকে ওভারলোড করে না।

মনে রাখবেন যে প্রতিটি কমা আসলে কমা অপারেটর নয়। কিছু কমা যার সম্পূর্ণ ভিন্ন অর্থ রয়েছে:

  • int a, b; --- পরিবর্তনশীল ঘোষণার তালিকাটি কমা দ্বারা পৃথক, তবে এগুলি কমা অপারেটর নয়
  • int a=5, b=3; --- এটি একটি কমা দ্বারা পৃথক করা চলক ঘোষণা তালিকা
  • foo(x,y)--- কমা দ্বারা পৃথক আর্গুমেন্ট তালিকা। আসলে, xএবং কোনও ক্রমে yমূল্যায়ন করা যেতে পারে !
  • FOO(x,y) --- কমা-বিচ্ছিন্ন ম্যাক্রো যুক্তি তালিকা
  • foo<a,b> --- কমা দ্বারা পৃথক টেম্পলেট যুক্তি তালিকা
  • int foo(int a, int b) --- কমা দ্বারা পৃথক প্যারামিটার তালিকা
  • Foo::Foo() : a(5), b(3) {} --- একটি শ্রেণি নির্মাত্রে কমা দ্বারা পৃথক প্রারম্ভিক তালিকা

* আপনি যদি অপটিমাইজেশন প্রয়োগ করেন তবে এটি সম্পূর্ণ সত্য নয়। সংকলকটি যদি স্বীকৃতি দেয় যে কিছু নির্দিষ্ট কোডের বাকী অংশে একেবারে কোনও প্রভাব নেই, এটি অপ্রয়োজনীয় বিবৃতিগুলি সরিয়ে ফেলবে।

আরও পঠন: http://en.wikedia.org/wiki/Comma_operator


এটা কি লক্ষ্য করার মতো যে যদি operator ,ওভারলোড করা হয় তবে আপনি সাহসীতার কোনও গ্যারান্টি হারাবেন (ঠিক যেমন আপনি শর্ট সার্কিটের বৈশিষ্ট্যগুলি হারাবেন operator&&এবং operator||সেগুলি যদি ওভারলোড করা হয়)?
ইয়ংজহান

কমা-অপারেটরটি ওভারলোড হয়েছে কিনা তা নির্বিশেষে বাম-সহযোগী is একটি অভিব্যক্তি a, b, cসর্বদা অর্থ (a, b), cএবং না a, (b, c)। পরবর্তী ব্যাখ্যাগুলি এমনকি উপাদানগুলি বিভিন্ন ধরণের হলে সংকলন ত্রুটির দিকে পরিচালিত করতে পারে the তর্কগুলি মূল্যায়নের ক্রমের পরে আপনি কী হতে পারেন? আমি সে সম্পর্কে নিশ্চিত নই, তবে সম্ভবত আপনি ঠিক বলেছেন: কমা বাম-সহযোগী হলেও cএমনটি ঘটতে পারে যা আগে মূল্যায়ন করা হয়েছিল(a, b)
CygnusX1

1
কোনও শ্রেণি নির্মাতার মধ্যে কমা-বিভাজিত সূচনা তালিকা সম্পর্কে কেবলমাত্র একটি সামান্য মন্তব্য, ক্রমের তালিকার অবস্থান অনুসারে নির্ধারিত হয় না । আদেশ শ্রেণীর ঘোষণার অবস্থান দ্বারা নির্ধারিত হয়। যেমন পূর্বে struct Foo { Foo() : a(5), b(3) {} int b; int a; }ইওললেটস । আপনার তালিকাটি যদি এর মতো হয় তবে এটি গুরুত্বপূর্ণ । বি 5 তে সেট করা হবে না, বরং এটির অবিচ্ছিন্ন মান, যা আপনার সংকলকটি সতর্ক করতে পারে বা না পারে। b(3)a(5)Foo() : a(5), b(a) {}
জোনাথন গাওরিচ

আমি সম্প্রতি দুটি ভাসমান সহ একটি কমা অপারেটর জুড়ে এসেছি, একটি সংখ্যা মূল্যায়ণ এবং বিলোপ করার বিষয়টি কী?
অ্যারন ফ্রাঙ্ক

আমি মনে করি না যে কেউ এর উত্তর দিতে পারে। আপনাকে এটি একটি প্রসঙ্গে দেখাতে হবে। সম্ভবত আলাদা প্রশ্ন?
CygnusX1

38

মানটি aহবে bতবে অভিব্যক্তির মান হবে c। অর্থাৎ, ইন

d = (a = b, c);

a এর সমান bএবং dসমান হবে c


19
প্রায় সঠিক। বিবৃতিগুলির মান নেই, এক্সপ্রেশন থাকে। এই অভিব্যক্তির মান গ।
লিওন টিমারম্যানস

কেন এটি পরিবর্তে ব্যবহার করা হয় a = b; d = c;?
অ্যারন ফ্রাঁক

লোকেরা কী কী পার্শ্ব প্রতিক্রিয়া নিয়ে কথা বলছিল তা এটি আমাকে বুঝতে বাধ্য করে।
জুতো


2

কমা অপারেটরের অ্যাসাইনমেন্ট অপারেটরের চেয়ে কম অগ্রাধিকার হওয়ায় একটি এর মান খ এর সমান হবে।


2

হ্যাঁ কমা অপারেটরের অ্যাসাইনমেন্ট অপারেটরের চেয়ে কম অগ্রাধিকার রয়েছে

#include<stdio.h>
int main()
{
          int i;
          i = (1,2,3);
          printf("i:%d\n",i);
          return 0;
}

আউটপুট: i = 3
কারণ কমা অপারেটর সর্বদা সর্বাধিক মান ফেরত দেয়।
এসাইনমেন্ট অপারেটরের সাথে কমা অপারেটরের ক্ষেত্রে:

 int main()
{
      int i;
      i = 1,2,3;
      printf("i:%d\n",i);
      return 0;
}

আউটপুট: i = 1
আমরা জানি যে কমা অপারেটরের অ্যাসাইনমেন্টের চেয়ে কম প্রাধান্য আছে .....


সুতরাং দ্বিতীয় উদাহরণটি কেবল i = 1;সেই লাইনে থাকা থেকে আলাদা কীভাবে ?
অ্যারন ফ্রাঁক

-3

প্রথম জিনিসগুলি: কমা আসলে কোনও অপারেটর নয়, সংকলকের জন্য এটি কেবল একটি টোকেন যা অন্যান্য টোকেনের সাথে প্রসঙ্গে একটি অর্থ পায় ।

এর অর্থ কী এবং কেন বিরক্ত হয়?

উদাহরণ 1:

ভিন্ন প্রসঙ্গে একই টোকেনের অর্থের মধ্যে পার্থক্য বুঝতে আমরা এই উদাহরণটি একবার দেখি:

class Example {
   Foo<int, char*> ContentA;
}

সাধারণত সি ++ শিক্ষানবিস যে এই অভিব্যক্তি / জিনিষ তুলনা হতো মনে হবে কিন্তু এটি absolutly ভুল, অর্থ <, >এবং, ব্যবহারের প্রসঙ্গের উপর depent টি টোকেন।

উপরের উদাহরণটির সঠিক ব্যাখ্যাটি অবশ্যই এটি কোনও টেম্পলেটটির ইনস্টিটিশন।

উদাহরণ 2:

যখন আমরা সাধারণত একাধিক ইনিশিয়েশন ভেরিয়েবল এবং / অথবা একাধিক এক্সপ্রেশন দিয়ে লুপের জন্য লিখি যা লুপের প্রতিটি পুনরাবৃত্তির পরেও করা উচিত যা আমরা কমাও ব্যবহার করি:

for(a=5,b=0;a<42;a++,b--)
   ...

কমাটির অর্থ ব্যবহারের প্রসঙ্গে নির্ভর করে, এখানে এটি প্রাসঙ্গিক for নির্মাণের ।

প্রসঙ্গে কমা বলতে আসলে কী বোঝায়?

এটিকে আরও জটিল করতে (বরাবরের মতো সি ++ তে) কমা অপারেটরটি নিজেই ওভারলোড করা যায় ( কনারাদ রুডল্ফকে ধন্যবাদ এটি নির্দেশ )।

প্রশ্নে ফিরে আসতে কোডটি

a = b, c;

সংকলক এর মত কিছু

(a = b), c;

কারণ অগ্রাধিকার এর =টোকেন / অপারেটর অগ্রাধিকার বেশী, টোকেন।

এবং এটি মত প্রসঙ্গে ব্যাখ্যা করা হয়

a = b;
c;

(নোট করুন যে ব্যাখ্যাটি প্রসঙ্গে নির্ভর করে, এখানে এটি কোনও ফাংশন / পদ্ধতি কল বা কোনও টেম্পলেট ইনস্টিটিশন নয়))


1
নিশ্চিত এটি, সম্ভবত আমি ভুল পরিভাষা ব্যবহার করেছি (লেক্সারের জন্য এটি একটি টোকেন, নিশ্চিত)
Quonux

2
যেহেতু একজন অপারেটরের সাথে কাজ করে , (sic), কমা আসলে একটি অপারেটর।
ড্রাগনলর্ড

2
প্রদত্ত কমা টোকেন কমা অপারেটর হিসাবে স্বীকৃত কিনা তা স্বীকৃতি দেওয়ার ক্ষেত্রে (উদাহরণস্বরূপ, যুক্তিগুলির বিভাজক) তার নিজের পক্ষে একটি চ্যালেঞ্জ হতে পারে, এই প্রশ্নটি বিশেষত কমা অপারেটর সম্পর্কে ।
CygnusX1
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.