"মিথ্যা <সত্য" অপারেশনটি কি ভাল সংজ্ঞায়িত হয়েছে?


153

সি ++ নির্দিষ্টকরণের সংজ্ঞা দেয়:

  1. বুলিয়ান প্যারামিটারগুলির জন্য 'কম' অপারেটরের অস্তিত্ব এবং যদি তাই হয়,
  2. 4 টি প্যারামিটার ক্রমানুসারে ফলাফল?

অন্য কথায়, নিম্নলিখিত ক্রিয়াকলাপগুলির ফলাফলগুলি স্পেসিফিকেশন দ্বারা সংজ্ঞায়িত করা হয়?

false < false
false < true
true < false
true < true

আমার সেটআপে (Centos 7, gcc 4.8.2), নীচের কোডটি আমি কী প্রত্যাশা করব তা ছড়িয়ে দিয়েছে (সি এর ইতিহাসকে 0 হিসাবে মিথ্যা এবং 1 হিসাবে সত্য হিসাবে উপস্থাপনের ইতিহাস দেওয়া হয়েছে):

false < false = false
false < true = true
true < false = false
true < true = false

যদিও আমি নিশ্চিত যে বেশিরভাগ (সমস্ত?) সংকলকরা একই আউটপুট দেবে, এটি কি সি ++ স্পেসিফিকেশন দ্বারা আইনী? বা একটি বিভ্রান্তিকর, তবে স্পেসিফিকেশন-কমপ্লায়েন্ট কম্পাইলারকে সত্যের মিথ্যা অপেক্ষা কম কি তা সিদ্ধান্ত নিতে অনুমোদিত?

#include <iostream>

const char * s(bool a)
{
  return (a ? "true" : "false");
}

void test(bool a, bool b)
{
  std::cout << s(a) << " < " << s(b) << " = " << s(a < b) << std::endl;
}

int main(int argc, char* argv[])
{
  test(false, false);
  test(false, true);
  test(true, false);
  test(true, true);
  return 0;
}

6
@ আলটারিওর এর বৈধ ব্যবহার রয়েছে। এই ধরনের ব্যবহার std::minউপর std::vector<bool>যেমন &&
অ্যাঞ্জিউ আর

19
@ অলটারিয়র যদি আপনি একটি ভাল প্রশ্ন বের করতে পারেন যা স্ট্যাকওভারফ্লো এর এত বছর পরে এখনও জিজ্ঞাসা করা হয়নি, আপনি কিছু পয়েন্ট প্রাপ্য । এটি ট্রলিং হয় না।
মার্ক র্যানসম

35
@ অলটারিওর জিজ্ঞাসার অনুপ্রেরণাটি আসল: আমি সি ++ (সি থেকে আগত) থেকে মোটামুটি নতুন এবং কিছু বিষয় একটি স্ট্যান্ড :: সেট <> এ সঞ্চয় করতে চাই। আমার অবজেক্টের <অপারেটরটির বাস্তবায়ন মূলত অবজেক্টের বুলিয়ান সম্পত্তি উপর ভিত্তি করে অন্যান্য গৌণ সনাক্তকারী বৈশিষ্ট্য অনুসরণ করে। সেটটি পুনরাবৃত্তি করার সময়, আমি নিশ্চিত হতে চাই যে 'মিথ্যা' অবজেক্টগুলি প্রথমে এসেছে। এটি এখানে এবং এখন আমার পক্ষে কাজ করার সময়, আমি আমার অবজেক্টের <(a? 1: 0) বা অনুরূপ ব্যবহারে অকারণে অবলম্বন না করে প্ল্যাটফর্মের (এম্বেডযুক্তগুলি সহ) কাজ করার গ্যারান্টিযুক্ত আশ্বাস খুঁজছি < অপারেটর.
ডানকান

26
একটি বিরক্তিকর পরিণতি হ'ল এর p <= qঅর্থ হ'ল p implies qকখন pএবং qটাইপের বুল!
থিওডোর নরভেল

4
@ টেকনোফাইল সম্ভবত বিঘ্নজনক যেটি <=অসাবধানতা বামপন্থী হিসাবে পড়া হতে পারে, এবং যে "কেবলমাত্র" যদি (যেমন, "[বস্তুগতভাবে]" বোঝায়) ডানদিকেটি কখনও কখনও টাইপসেট বা অনানুষ্ঠানিকভাবে একইভাবে লিখিত হয় =>(যেমন, দ্বিগুণ শ্যাফ্টের অনুরূপ =) । বামনামা এমনকি কখনও কখনও "যদি" হিসাবে পড়া হয় তবে আমি বিশ্বাস করি যে এটি "কেবলমাত্র যদি" ​​এর জন্য রাইটারো ব্যবহারের চেয়ে অনেক কম সাধারণ।
এলিয়াহ কাগন 19

উত্তর:


207

টি এল; ডিআর:

ক্রিয়াকলাপগুলি সি ++ স্ট্যান্ডার্ডের খসড়া অনুসারে ভালভাবে সংজ্ঞায়িত করা হয়েছে।

বিস্তারিত

আমরা দেখতে পাচ্ছি যে খসড়া সি ++ স্ট্যান্ডার্ড বিভাগে 5.9 রিলেশনাল অপারেটর যা বলে ( জোর খন এগিয়ে যাচ্ছি ):

Operands গাণিতিক থাকিবে , শুমার, অথবা পয়েন্টার টাইপ , বা টাইপ এসটিডি :: nullptr_t। অপারেটররা <(এর চেয়ে কম),> (এর চেয়ে বড়), <= (এর চেয়ে কম বা সমান) এবং> = (এর চেয়ে বড় বা সমান) সমস্ত ফলন মিথ্যা বা সত্য। ফলাফলের ধরণটি বুল হয়

এবং বুলগুলি মৌলিক প্রকারের 3.9.1 থেকে বুননীয় ধরণের

প্রকারভেদ bool , গৃহস্থালির কাজ, char16_t, char32_t, wchar_t এবং স্বাক্ষরিত ও স্বাক্ষরবিহীন পূর্ণসংখ্যা ধরনের সম্মিলিতভাবে হয় অবিচ্ছেদ্য ধরনের বলা হয়।

এবং

ইন্টিগ্রাল এবং ভাসমান প্রকারগুলি সম্মিলিতভাবে গাণিতিক প্রকারগুলি বলা হয়।

এবং trueএবং falseবুলিয়ান আক্ষরিক থেকে 2.14.6বুলিয়ান আক্ষরিক:

boolean-literal:
    false
    true

বিভাগে ফিরে যাচ্ছি 5.9রিলেশনাল অপারেটরগুলির যান্ত্রিকতাগুলি আরও দেখতে , এতে বলা হয়েছে:

সাধারণ গাণিতিক রূপান্তরগুলি গাণিতিক বা গণনার প্রকারের অপারেন্ডগুলিতে সম্পাদিত হয়।

স্বাভাবিক গাণিতিক ধর্মান্তর বিভাগে আচ্ছাদিত করা হয়5 যেখানে বলা আছে:

অন্যথায়, অবিচ্ছেদ্য প্রচারগুলি (4.5) উভয় অপারেন্ডে সম্পাদিত হবে

এবং বিভাগ 4.5 বলে:

মিথ্যা শূন্য হয়ে ও সত্য হয়ে ওঠার সাথে টাইপ বুলের একটি মূল্য টাইপ ইন্টের একটি প্রলুতে রূপান্তরিত হতে পারে।

এবং তাই এক্সপ্রেশন:

false < false
false < true
true < false
true < true

এই বিধি ব্যবহার করে:

0 < 0
0 < 1
1 < 0
1 < 1

6
খুব সুন্দর, এটি যে কোনও উত্তর সম্ভবত হিসাবে সহজেই পড়া সহজ, এমনকি হিসাবে স্পষ্ট হিসাবে প্রায়। একটি নিট: আমি মনে করি আপনি ভুল "টাইপ" গাed় করেছেন : " অপারেন্ডগুলিতে পাটিগণিত , গণনা, বা পয়েন্টার টাইপ থাকতে হবে বা std :: nullptr_t টাইপ করা উচিত।" স্পষ্টতার জন্য প্রথম বন্ধনী যুক্ত করা ((পাটিগণিত, গণনা, বা পয়েন্টার) প্রকার) বা (টাইপ স্টাডি :: নাল্পটার_ টি) দেয়।

এটি আপনার উত্তর পরিবর্তন করে না, তবে এন 3485 [ওভার বিল্ট] / 12: প্রচারিত পাটিগণিত প্রকারের প্রতিটি জোড়ের জন্য এল এবং আর, ফর্মের প্রার্থী অপারেটর ফাংশন উপস্থিত রয়েছে ... বুল অপারেটর <(এল, আর); - আপনি যে বিধিগুলি প্রয়োগ করেছেন তা প্রয়োগ করার আগে কি যুক্তিগুলি প্রচার করা হয় না?
ক্রিস

@ ক্রিস আমি এই বিভাগটির সাথে খুব বেশি পরিচিত নই তাই আমাকে এটি সম্পর্কে ভাবতে হবে তবে আমি যা দেখতে পাচ্ছি তার উত্তর পরিবর্তিত হবে বলে আমি মনে করি না।
শফিক ইয়াঘমোর

হ্যাঁ, প্রচার যেকোন উপায়ে হ'ল প্রথম জিনিস।
ক্রিস

63

falseহিসাবে বর্ণিত 0এবং হিসাবে সংজ্ঞায়িত বুলিয়ান মানগুলি স্বাভাবিক পূর্ণসংখ্যার প্রচারের সাপেক্ষে । এটি সমস্ত তুলনা ভাল সংজ্ঞায়িত করে তোলে।true1


2
... এবং রিলেশনাল অপারেটরগণিতগণিতগণিত বা গণনার প্রকারের অপারেশনগুলিতে সাধারণ গাণিতিক রূপান্তরগুলি (যার মধ্যে পূর্ণসংখ্যার প্রচারগুলি অন্তর্ভুক্ত) সম্পাদনের জন্য নির্দিষ্ট করা হয়।
টিসি

5
আমি যে এই উত্তর শফিক এর চেয়ে খাটো, কিন্তু আমি কী পয়েন্ট যে মনে falseহিসাবে সংজ্ঞায়িত করা হয় 0এবং trueহিসাবে সংজ্ঞায়িত করা হয় 1 মান মধ্যে (বরং সাধারণ চর্চা তুলনায়) প্রমাণ এটা ব্যাক আপ করা প্রয়োজন।
কেআরিয়ান

@ কেআরয়ান কি, আপনি এর জন্য আমার কথাটি নেবেন না? :) কোনও boolধরণের আগে, এমনকি সি ++ উপস্থিত হওয়ার আগে, বুলিয়ান অপারেশনের ফলাফলটিকে 0মিথ্যা এবং 1সত্য হিসাবে সংজ্ঞায়িত করা হয়েছিল । আপনি যদি এটি কে + আর-তে খুঁজে পান তবে আমি অবাক হব না।
মার্ক

1
@ কেআরয়ান আমি কে + আর পর্যন্ত আর ফিরে যেতে পারছি না, তবে আমি 1990 এএনএসআই সি স্ট্যান্ডার্ডের আমার অনুলিপিটি বের করেছিলাম। Section.৩.৮ অনুচ্ছেদে বলা হয়েছে "প্রতিটি অপারেটর <(এর চেয়ে কম), >(বৃহত্তর), <=(এর চেয়ে কম বা সমান), এবং >=(এর চেয়ে বড় বা সমান) যদি নির্দিষ্ট সম্পর্কটি সত্য হয় তবে 1 প্রদান করবে এবং যদি এটি হয় তবে 0 মিথ্যা। ফলাফলের ধরণ আছে int"
মার্ক র্যানসম

1
আইআইআরসি সবচেয়ে বড় সমস্যাটি ছিল কে ওআর-তে enum bool { false = 0, true = 1}আইনী ছিল তবে এটির সংজ্ঞা দেওয়া হয়নি operator<
এমসাল্টারস

22

সি ++ স্ট্যান্ডার্ড অনুযায়ী (5.9 সম্পর্কিত অপারেটর)

2 সাধারণ গাণিতিক রূপান্তরগুলি গাণিতিক বা গণনার প্রকারের অপারেন্ডগুলিতে সম্পাদিত হয়।

এবং

1 ... ফলাফলের ধরণটি বুল হয়।

এবং (3.9.1 মৌলিক ধরণের)

6 ধরণের বুলের মানগুলি হয় সত্য বা মিথ্যা .4 অন্তর্ভুক্ত নোট] টাইপ বুলের মানগুলি অবিচ্ছেদ্য প্রচারে অংশ নেয় (4.5)।

এবং (৪.৫ ইন্টিগ্রাল প্রচার)

Type টাইপের বুলের একটি মূল্য টাইপ ইন্টের একটি প্রলুতে রূপান্তরিত হতে পারে, মিথ্যা শূন্য হয়ে যায় এবং সত্য হয়ে যায়

সুতরাং আপনার সমস্ত উদাহরণে সত্যকে int 1 তে রূপান্তর করা হয় এবং মিথ্যাটি int 0 তে রূপান্তরিত হয়

এই মত প্রকাশ

false < false
false < true
true < false
true < true

সম্পূর্ণ সমতুল্য

0 < 0
0 < 1
1 < 0
1 < 1

8

বুলিয়ান falseসমান int 0এবং বুলিয়ান trueসমান int 1। সুতরাং এটি ব্যাখ্যা করে যে false < true=> এক্সপ্রেশনটিই 0 < 1কেবল একমাত্র যা ফিরে আসে true

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