'?:' এর রিটার্ন টাইপ (টেরিনারি শর্তসাপেক্ষ অপারেটর)


208

প্রথমটি কেন রেফারেন্স দেয়?

int x = 1;
int y = 2;
(x > y ? x : y) = 100;

যখন দ্বিতীয়টি না?

int x = 1;
long y = 2;
(x > y ? x : y) = 100;

প্রকৃতপক্ষে, দ্বিতীয়টি মোটেও সঙ্কলন করে না - "কার্যপালনের বামদিকে হালকা নয়"।


1
হুম, রুটি
বেক


এক্সপ্রেশনতে কোনও প্রকার নির্ধারণের ফলে কমপক্ষে একটি টার্মের castালাই বোঝানো হবে, এই পদটি আর কোনও এল-মান হবে না।
ইয়ভেস দাউস্ট

উত্তর:


173

এক্সপ্রেশনগুলির রিটার্নের ধরণ নেই, তাদের একটি প্রকার রয়েছে এবং এটি সর্বশেষ সি ++ স্ট্যান্ডার্ডে পরিচিত - একটি মান বিভাগ।

একটি শর্তাধীন অভিব্যক্তি একটি হতে পারে lvalue অথবা একটি rvalue । এটি এর মান বিভাগ। (এটি কিছুটা C++11সরলকরণের মতো, যেখানে আমাদের মধ্যে ল্যাভ্যালু, অল্প মূল্য এবং মূল্য রয়েছে pr)

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

একটি অ্যাসাইনমেন্ট এক্সপ্রেশন একটি অবজেক্টকে একটি মান নির্ধারণ করে তাই যে জিনিসটি বরাদ্দ করা হচ্ছে তা অবশ্যই লভাল্য

শর্তসাপেক্ষ অভিব্যক্তির জন্য ( ?:) একটি লভ্যালু হওয়ার জন্য (আবার, বিস্তৃত এবং সাধারণ ভাষায়), দ্বিতীয় এবং তৃতীয় অপারেশনগুলি একই ধরণের লভ্যালু হতে হবে । এটি কারণ শর্তসাপেক্ষ প্রকাশের ধরণ এবং মান বিভাগটি সংকলনের সময় নির্ধারিত হয় এবং শর্তটি সত্য কিনা তা অবশ্যই উপযুক্ত। অপরগুলির মধ্যে একটির সাথে অন্যটির সাথে মিল রাখতে যদি অন্যরকম রূপান্তর করতে হয় তবে শর্তসাপেক্ষ এক্সপ্রেশনটি একটি লভ্যালু হতে পারে না কারণ এই রূপান্তরটির ফলসটি কোনও লভালু হবে না ।

আইএসও / আইইসি 14882: 2011 উল্লেখ:

৩.১০ [বেসিক.লভাল] মূল্য এবং মূল্য (মান বিভাগ সম্পর্কে)

5.15 [expr.cond] শর্তসাপেক্ষ অপারেটর (শর্তসাপেক্ষ প্রকাশের জন্য কী ধরণের এবং মান বিভাগের জন্য নিয়ম)

৫.১7 [এক্সপ্রেস পাস] অ্যাসাইনমেন্ট এবং যৌগিক কার্যনির্বাহক অপারেটরগুলি (কোনও অ্যাসাইনমেন্টের এলএইচএস অবশ্যই একটি পরিবর্তনযোগ্য লভ্য হওয়া আবশ্যক)


3
এবং xvalue এবং মূল্য সম্পর্কে পড়ার সময় (যেহেতু আমি আপনার জবাব দেওয়ার আগে এগুলি সম্পর্কে শুনিনি) আমি এই কার্যকর এসও পোস্টটি পেরিয়ে এসেছি: stackoverflow.com/questions/3601602/…
fluffy

an rvalue is just a value that may not necessarily be *attached* to an object in memory.আপনি আরও সহজ শব্দে এটি ব্যাখ্যা করতে পারেন? । এছাড়াও আপনি কি বলতে চাইছেন type and value *category*? ধন্যবাদ
মিঃ আনুবিস

@ সোলরাইপার: prvalue, xvalue, glvalueমান বিভাগ।
Xoo

@ শিও আমি সাহায্যের প্রশংসা করি তবে আপনি কি বলতে পারবেন যে কোনও মূল্যবোধ দ্বারা তার অর্থ কী তা কেবল একটি মূল্য যা মেমরির কোনও জিনিসের সাথে অগত্যা সংযুক্ত নাও হতে পারে। ? উদাহরণ দিয়ে?
মিঃ আনুবিস

@SoulReaper: আমার মনে হয় তিনি কিছু কথা বলা হচ্ছে পছন্দ true, this, enumমান। এই জিনিসগুলি মূল্যবান ("খাঁটি" মূল্যায়ন), তবে স্মৃতিতে বাস করে না।
Xoo

57

ত্রৈমাসিক ?:প্রকাশের ধরণটি এর দ্বিতীয় এবং তৃতীয় আর্গুমেন্টের সাধারণ ধরণ। উভয় প্রকার একই থাকলে, আপনি একটি রেফারেন্স ফিরে পাবেন। যদি তারা একে অপরের কাছে রূপান্তরিত হয় তবে একজন চয়ন হয়ে যায় এবং অন্যটি রূপান্তরিত হয় (এক্ষেত্রে প্রচারিত হয়)। যেহেতু আপনি কোনও অস্থায়ী (রূপান্তরিত / প্রচারিত ভেরিয়েবল) এর কাছে মূল্যমানের রেফারেন্সটি ফিরিয়ে দিতে পারবেন না, তাই এর প্রকারটি মান ধরণের।


তবে x এর চেয়ে বড় y, সুতরাং এই বিশেষ ক্ষেত্রে প্রচারের দরকার নেই, এটি y এর প্রসঙ্গে ফিরে আসতে পারে। হুম ... তবে আমি একমত, এটি আশ্চর্য হবে।
ইওলা

1
@ মিস্টার ট্যামার: আমি বরং স্ট্যান্ডার্ডটি খনন করব। : <
শিও

3
@ ইওলা: যেহেতু প্রকারগুলি সি ++ তে একটি সংকলন সময় ধারণা, তাই ভাবের আসল রিটার্ন মানটি বিবেচনা করে না।
Xoo

1
আপনি কোনও রেফারেন্স ফিরে পাবেন না, আপনি মূল্য পাবেন।
সুমা

1
@ শিও: যদিও সি ++ টার্মিনোলজিতে নেই;)
সেবাস্তিয়ান মাচ

19

এটি কোনও মূল্য ফেরত দিতে পারে না কারণ এটির প্রকারের xসাথে মেলে ধরার প্রকারটি স্পষ্টভাবে প্রচার করতে হবে y(যেহেতু উভয় পক্ষই :একই ধরণের নয়) এবং এটির সাথে এটি একটি অস্থায়ী তৈরি করতে হবে।


মান কী বলে? ( n1905 )

এক্সপ্রেশন 5.17 অ্যাসাইনমেন্ট এবং যৌগিক নিয়োগ অপারেটরগুলি

5.17 / 3

যদি দ্বিতীয় এবং তৃতীয় অপারেন্ডের বিভিন্ন ধরণের থাকে এবং হয় (সম্ভবত সিভি-কোয়ালিটিড) শ্রেণীর ধরণ থাকে, তবে সেই অপারেন্ডগুলির প্রত্যেককে অপরের ধরণের রূপান্তর করার চেষ্টা করা হয়। টাইপ টি 1 এর অপারেন্ড এক্সপ্রেশন E1 অপারেন্ড এক্সপ্রেশন মেলে রূপান্তর করতে পারে কিনা তা নির্ধারণের প্রক্রিয়াটি টাইপ টি 2 এর E2 নিম্নরূপে সংজ্ঞায়িত হয়েছে:

- E2 যদি লভ্যালু হয়: E1 কে E2- র সাথে রূপান্তর করা যায় যদি E1 স্পষ্টভাবে "T2 এর রেফারেন্স" টাইপে রূপান্তর করা যায় (রূপান্তর 4), সীমাবদ্ধতার অধীনে যে রূপান্তরটিতে রেফারেন্সটি সরাসরি বাঁধতে হবে (8.5.3) ) থেকে E1।

- E2 যদি কোনও মূল্যায়ন হয়, বা যদি উপরের রূপান্তরটি করা যায় না:

- E1 এবং E2 এর বর্গের ধরণ থাকলে এবং অন্তর্নিহিত শ্রেণীর প্রকারগুলি একই বা একটি অন্যের বেস শ্রেণি: টি 2 এর শ্রেণি একই ধরণের, বা একটি বেস শ্রেণীর হলে E1 এর সাথে ম্যাচ রূপান্তর করা যেতে পারে , টি 1 এর শ্রেণি, এবং টি 2 এর সিভি-যোগ্যতা একই সিভি-যোগ্যতা, বা টি-এর সিভি-যোগ্যতার চেয়ে বৃহত্তর সিভি-যোগ্যতা। যদি রূপান্তরটি প্রয়োগ করা হয়, E1 টি টি 2 টাইপের মূল্যের সাথে পরিবর্তিত হয়েছে যা এখনও মূল উত্স শ্রেণীর অবজেক্ট (বা এর উপযুক্ত সাবোবজেক্ট) বোঝায়। [ দ্রষ্টব্য: অর্থাত, কোনও অনুলিপি তৈরি করা হয়নি। - শেষ নোট ] E1 থেকে টি 2 টাইপের অস্থায়ী অনুলিপি করে এবং সেই অস্থায়ী রূপান্তরিত অপারেন্ড হিসাবে ব্যবহার করে।

অন্যথায় (যেমন, যদি E1বা E2 এর একটি নন-ক্লাস টাইপ থাকে, বা তাদের উভয় শ্রেণীর ধরণের থাকে তবে অন্তর্নিহিত শ্রেণিগুলি হয় না হয় অন্যের একটির সাথে একটি বেস শ্রেণি থাকে): E1 E2 এর সাথে মেলে রূপান্তর করা যায় যদি E1 হতে পারে স্পষ্টভাবে এই ধরণের রূপটি রূপান্তরিত হয় যে E2 এর যদি E2 কে কোনও মূল্যকে রূপান্তরিত করা হয় (বা এটির ধরণটি যদি E2 একটি মূল্যকে হয়)।

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


5.17 / 4

দ্বিতীয় এবং তৃতীয় অপারেন্ডগুলি যদি সমান এবং একই ধরণের থাকে তবে ফলাফলটি সেই ধরণের হয় এবং এটি একটি লভালু হয় এবং এটি যদি দ্বিতীয় বা তৃতীয় অপারেন্ডটি একটি বিট-ফিল্ড হয়, বা যদি উভয় বিট হয় ক্ষেত্র।


5.17 / 5

অন্যথায়, ফলাফল একটি মূল্য। যদি দ্বিতীয় এবং তৃতীয় অপারেন্ডগুলির মধ্যে একই ধরণের না থাকে এবং উভয়টি (সম্ভবত সিভি-কোয়ালিটিড) শ্রেণীর ধরণ থাকে তবে ওভারলোড রেজোলিউশনগুলি অপারেন্ডগুলিতে প্রয়োগ করার জন্য রূপান্তরগুলি নির্ধারণ করতে (যদি থাকে তবে) ব্যবহৃত হয় (13.3.1.2, 13.6) । যদি ওভারলোড রেজোলিউশন ব্যর্থ হয় তবে প্রোগ্রামটি দুর্গঠিত। অন্যথায়, এইভাবে নির্ধারিত রূপান্তরগুলি প্রয়োগ করা হয়, এবং রূপান্তরিত অপারেন্ডগুলি এই বিভাগের বাকী অংশের জন্য মূল অপারেশনগুলির জায়গায় ব্যবহৃত হয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.