কেন বুলিয়ান সি ++ সমর্থন ++ এ টাইপ করে -?


29

অপারেটর কেন --বুলের জন্য উপস্থিত থাকে না যদিও এটি অপারেটরের জন্য রয়েছে ++?

আমি সি ++ এ চেষ্টা করেছি এবং আমার প্রশ্নটি অন্য কোনও ভাষাতে প্রযোজ্য কিনা তা আমি জানি না। আমিও জানতে পেরে আনন্দিত হব

আমি জানি , আমি ++একটি বুল দিয়ে অপারেটরটি ব্যবহার করতে পারি । এটি যে কোনও বোলকে সত্যের সমান করে তোলে।

bool b = false;
b++;
// Now b == true.

আমরা কেন --বিপরীতে অপারেটরটি ব্যবহার করতে পারি না ?

bool b = true;
b--;
// Now b == false;

এটি খুব দরকারী নয়, তবে আমি কৌতূহলী।



ইতিহাসের কারণ। লিঙ্ক করার জন্য আপনাকে ধন্যবাদ। আপনি কি একটি উত্তর লিখতে পারেন এবং আমি এটি সমাধান হিসাবে রেখেছি?
অ্যালোসডজি বলেছেন মোনিকা

লিঙ্কগুলি একাই ভাল উত্তর দেয় না, এবং অন্য এসই সাইটে কোনও কিছুর নকল ট্যানস প্রশ্ন চিহ্নিত করার জন্য একটি ভাল প্রক্রিয়া নেই।
ব্লারফ্লার

1
সুতরাং আমাদের মেটা.স্ট্যাকেক্সেঞ্জ ডটকম ডটকম বা অন্য কোনও বিষয় খুলতে হবে। আমি মনে করি ভাল লিঙ্কটির জন্য আপনার কিছু কর্মফল পাওয়া উচিত এবং যদি কেউ আপনাকে উত্সাহ দেয় তবে মূল উত্তর থেকে লেখককে কিছু কর্ম পাওয়া উচিত। আসলে, মূল প্রশ্নটিও কিছু কর্মফল পাওয়া উচিত।
অ্যালোসডজি বলেছেন মোনিকা ২

2
@aloisdg ক্রস সাইট ডুপগুলি এমএসও-তে একটি পুরানো সমস্যা । এর পূর্ণাঙ্গ দৃষ্টিভঙ্গি পেতে লিঙ্কযুক্ত প্রশ্নগুলি অনুসরণ করুন

উত্তর:


53

সি এর পুরানো দিনগুলিতে কোনও বুলিয়ান টাইপ ছিল না। লোকেরা intবুলিয়ান ডেটা সংরক্ষণ করার জন্য ব্যবহার করে এবং এটি বেশিরভাগ ক্ষেত্রেই কাজ করে। জিরো মিথ্যা ছিল এবং সমস্ত কিছু সত্য ছিল।

এর অর্থ যদি আপনি int flag = 0;পরে নেন এবং flag++মানটি সত্য হয়। পতাকার মান কী ছিল তা বিবেচনা করেই এটি কাজ করবে (যদি আপনি এটি অনেক কিছু না করেন তবে এটি গড়িয়ে পড়ে এবং আপনি শূন্যে ফিরে এসেছিলেন তবে এটিকে উপেক্ষা করতে দিন) - পতাকাটির মূল্য 1 হবে যখন 2 প্রদান করবে যা এখনও ছিল সত্য।

কিছু লোক এটি নিঃশর্তভাবে সত্যের জন্য বুলিয়ান মান সেট করার জন্য ব্যবহার করে। আমি নিশ্চিত না যে এটি কখনও মূর্খ হয়ে উঠেছে , তবে এটি কিছু কোডে।

এটি কখনই কার্যকর হয় নি --, কারণ মানটি 1 (যা এটি হতে পারে) ব্যতীত অন্য কিছু হলে মানটি এখনও মিথ্যা হত না। এবং যদি এটি ইতিমধ্যে মিথ্যা ( 0) থাকে এবং আপনি এটিতে একটি হ্রাসকারী অপারেটর করেন তবে এটি মিথ্যা হবে না।

প্রথম দিনগুলিতে কোডটি সি থেকে সি ++ এ সরানোর সময়, এটি খুব গুরুত্বপূর্ণ ছিল যে সি ++ এর অন্তর্ভুক্ত সি কোডটি এখনও কাজ করতে সক্ষম হয়েছিল। এবং তাই সি ++ (বিভাগ 5.2.6 (এটি পৃষ্ঠায় 71)) এর স্পেসিফিকেশনে এটি পড়ে:

পোস্টফিক্স ++ প্রয়োগ করে প্রাপ্ত মান হ'ল অপারেটর প্রয়োগের আগে অপারেন্ডের মান। [দ্রষ্টব্য: প্রাপ্ত মানটি মূল মূল্যের একটি অনুলিপি] অপারেন্ডটি একটি পরিবর্তনযোগ্য মূল্যবান হতে হবে। অপারেন্ডের ধরণটি একটি গাণিতিক টাইপ বা সম্পূর্ণ অবজেক্ট টাইপের পয়েন্টার হতে হবে। পরে ফলাফলের উল্লেখ করা হয়েছে, বস্তুর মান এটি 1 যোগ, যদি না অবজেক্টের তালিকায় দ্বারা রুপান্তরিত করা হয়েছে bool, যে ক্ষেত্রে এটা সত্য সেট করা হয়। [দ্রষ্টব্য: এই ব্যবহারটি অবচিত করা হয়েছে, দেখুন এনেক্সে ডি]

পোস্টসাফিক্স এর প্রতীক - ছাড়া প্রতীক ধরনের হইবে না পোস্টসাফিক্স ++, অপারেটরের অনুরূপভাবে decremented হয়, bool

এটি আবার বিভাগ 5.3.2 এ উল্লিখিত হয়েছে (প্রিফিক্স অপারেটরের জন্য - 5.2.6 পোস্টফিক্সে ছিল)

আপনি দেখতে পাচ্ছেন যে, এটি অবমূল্যায়ন করা হয়েছে (দস্তাবেজের আনেক্সেক্স ডি, পৃষ্ঠা 709) এবং এটি ব্যবহার করা উচিত নয়।

তবে কেন হয়। এবং কখনও কখনও আপনি কোড দেখতে পারেন। তবে এটা করবেন না।


5
"কিছু লোক এটি শর্তে একটি বুলিয়ান মান নির্ধারণের জন্য ব্যবহার করেছিল।" আসুন তাদেরকে নিন্দিত বোকা বলি, মানুষ নয়।
Deduplicator

@ ডিডুকিপ্লেটার: সম্ভবত এটি পারফরম্যান্সের বিষয় ছিল: একটি ভেরিয়েবেলে একটি মান লোড করা ভেরিয়েবলকে বাড়ানোর চেয়ে আরও বেশি প্রসেসরের চক্র গ্রহণ করতে পারে। অবশ্যই, এটি সম্ভবত আধুনিক কম্পিউটারগুলিতে কোনও বিষয় নয়।
জর্জিও

1
@ জর্জিও যে সম্ভবত সম্ভাবনা আছে। মনে রেখ যে সি পিডিপি -7 নির্দেশিকা সেটটি নিকটবর্তীভাবে মেলানোর জন্য লেখা হয়েছিল এবং পিডিপি -11 এর অন্যান্য টুইট ছিল। থেকে এই - "মানুষ প্রায়ই অনুমান যে, তারা স্বয়ং-বৃদ্ধি এবং স্বত-হ্রাস ঠিকানা ডিসেম্বর পিডিপি -11 যার উপর সি এবং ইউনিক্স প্রথম জনপ্রিয় হয়ে ওঠে দ্বারা উপলব্ধ মোড ব্যবহার করতে তৈরি করা হয়েছে এই ঐতিহাসিকভাবে অসম্ভব যেহেতু কোন PDP- ছিল। 11 যখন বি বিকাশ হয়েছিল। PDP-7 তে কয়েকটি 'অটো-ইনক্রিমেন্ট' মেমরি সেল ছিল, সেই সম্পত্তি সহ যা তাদের মাধ্যমে একটি অপ্রত্যক্ষ মেমরি রেফারেন্সটি সেলকে বাড়িয়ে তোলে ""

@ ডিডুকিপেটর: বুলিয়ানগুলির জন্য পূর্ণসংখ্যার কোড ব্যবহার করে এমন একটি চলক যা প্রতিটিের জন্য বাড়ানো হয় ... যাই হোক না কেন ... কাউন্টার হিসাবে (এটি কত বার বাড়ানো হয়েছিল) এবং বুলিয়ান হিসাবে উভয়ই কাজ করতে পারে (এটি আদৌ বৃদ্ধি পেয়েছে বা না).
কিথ থম্পসন

2

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


1
আমার প্রশ্ন এখান থেকে সদৃশ stackoverflow.com/questions/3450420/... । যাইহোক, আপনার উত্তরের জন্য আপনাকে ধন্যবাদ।
অ্যালিসডজি বলছেন

1

এই প্রশ্নের historicalতিহাসিক তাত্পর্য বোঝার জন্য আপনাকে থেরাক -২-এর ক্ষেত্রে বিবেচনা করতে হবে। Therac-25 হ'ল একটি মেডিকেল ডিভাইস যা ক্যান্সার রোগীদের রেডিয়েশন সরবরাহ করেছিল। এটি খারাপ প্রোগ্রামিং অনুশীলনে জর্জরিত ছিল যা এর দুর্বল সুরক্ষা ট্র্যাক রেকর্ডে অবদান রেখেছিল (একাধিক মৃত্যুর সাথে এটি দায়ী)।

http://courses.cs.vt.edu/professionalism/Therac_25/Therac_1.html

(পৃষ্ঠা 3 এর নীচে যান)

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

...

মেশিন সেটআপ চলাকালীন সেট-আপ পরীক্ষাটি কয়েকশবার কার্যকর করা হবে কারণ এটি নিজেই পুনরায় নির্ধারণ করে অন্যান্য ইভেন্টগুলি হওয়ার অপেক্ষা করে। কোডে, ক্লাস 3 ভেরিয়েবল সেট-আপ টেস্টের মাধ্যমে প্রতিটি পাসের জন্য একটি দ্বারা বাড়ানো হয়। যেহেতু ক্লাস 3 ভেরিয়েবল 1 বাইট হয় তাই এটিতে সর্বাধিক 255 দশমিকের মান থাকতে পারে। সুতরাং, সেট-আপ টেস্ট কোডের 256 তম পাসে ভেরিয়েবল ওভারফ্লো হয় এবং এর শূন্য মান হয়। এর অর্থ হ'ল সেট আপ পরীক্ষার মাধ্যমে প্রতি 256 তম পাসে, উপরের কলিমাটরের পরীক্ষা করা হবে না এবং একটি উচ্চতর কলিমাটরের ত্রুটি সনাক্ত করা যাবে না। ক্লাস 3 শূন্যের দিকে ঘুরানো সুনির্দিষ্ট মুহুর্তে অপারেটর "সেট" বোতামটি চাপলে ওভার এক্সপোজারটি ঘটেছিল। সুতরাং চককোলকে মৃত্যুদন্ড কার্যকর করা হয়নি এবং উপরের কলিমাটরটি এখনও ফিল্ড-লাইট অবস্থানে রয়েছে তা নির্দেশ করার জন্য F Flm সেট করা হয়নি। সফ্টওয়্যারটি স্থানে লক্ষ্যমাত্রা ছাড়াই এবং স্ক্যান না করে পুরো 25 মেগাবাইট চালু করে। একটি উচ্চ ঘন ইলেকট্রন মরীচি ফলস্বরূপ, যা স্টেইনলেস স্টিলের আয়না দ্বারা ছড়িয়ে ছিটিয়ে এবং অপসারণ করা হয়েছিল path

Therac-25 ব্যবহৃত কিছু সমতুল্য মত operator++একটি উপর bool। তবে, তারা যে প্রোগ্রামিংয়ের ভাষা ব্যবহার করেছিল তা সি ++ ছিল না এবং তাদের ডেটা টাইপও ছিল না bool। সি ++ এর গ্যারান্টি থেকে পৃথক, তবে নিয়মিত পূর্ণসংখ্যার ধরণটি কেবল বাড়তে থাকে। তাদের ডেটা ধরণের সমতুল্য ছিল uint8_t

সি ++ operator++এই জাতীয় প্রোগ্রামিংয়ে অভ্যস্ত লোকদের আশেপাশে রাখার সিদ্ধান্ত নিয়েছে , তবে মান বাড়ানোর পরিবর্তে এটি এ জাতীয় trueজিনিসগুলি প্রতিরোধ করার জন্য এটি সেট করে ।

নোট যে operator++(bool)হ্রাস করা হয়েছে।

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3797.pdf

সি ++ 14 এর সংযুক্তি ডি:

ডি অপারেটর সহ বর্ধিত অপারেটর
++ অপারেটরের সাথে টাইপের বুলের অপারেন্ডের ব্যবহার হ্রাস করা হয়েছে (দেখুন 5.3.2 এবং 5.2.6)।


যদিও এটি ব্যাখ্যা করবে যে কেন এটি অবহ্রাসিত হয়েছে, এটি কেন এটি প্রথম স্থানে রয়েছে তা ব্যাখ্যা করে না।

এটি বিদ্যমান কারণ সেখানে কিছু লোক যারা যখন সি সি ++ প্রোগ্রামিং, সি থেকে রূপান্তরটি আরাম পরিকল্পনা করা হয়েছিল যাতে তারা সঙ্গে এটি সমর্থিত এটা বৃদ্ধিশীল দ্বারা একটি বুলিয়ান মান সেট ছিল boolপ্রকার। আমি যখন লোকেরা আসলে এইভাবে প্রোগ্রাম করেছিলাম তার একটি historicalতিহাসিক উদাহরণ দেওয়ার চেষ্টা করছিলাম।
ডেভিড স্টোন 21
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.