বোল অপারেটর ++ এবং -


104

আজ কিছু ভিজ্যুয়াল সি ++ কোড লেখার সময় আমি এমন কিছু বিষয় নিয়ে এসেছি যা আমাকে অবাক করে দিয়েছে। দেখে মনে হচ্ছে সি ++ বুলের জন্য ++ (ইনক্রিমেন্ট) সমর্থন করে তবে - (হ্রাস) নয়। এটি কেবল একটি এলোমেলো সিদ্ধান্ত, বা এর পিছনে কোনও কারণ আছে?

এটি সংকলন:

static HMODULE hMod = NULL;
static bool once = false;
if (!once++)
    hMod = LoadLibrary("xxx");

এটি করে না:

static HMODULE hMod = NULL;
static bool once = true;
if (once--)
    hMod = LoadLibrary("xxx");

2
এইচএম, এক্সকোড এবং জিসিসি সংকলকের জন্য সমান
ভ্লাদিমির

হ্যাঁ, ++onceএবং জিসিসি নিয়ে once++কাজ করুন, তবে হ্রাস নয়।
জাস্টিন আরদিনি

হতে পারে "অপারেটর-কীওয়ার্ড" এর পরিবর্তে "ইতিহাস" পুনরায় চালু করুন, সুতরাং এটি অন্যান্য সমস্ত মজাদার ব্যাখ্যা সহ গ্রুপযুক্ত করা হয়েছে আপনি যদি ইতিহাস বিবেচনা করেন তবে বিভিন্ন পাগল জিনিস কেন যুক্তিসঙ্গত? :)
জন হান্না

সি ++ 17 হিসাবে দ্রষ্টব্য পূর্ব- বর্ধনকারী অপারেটর অবহেলিতbool , স্যু
3-10

যদি আপনি অবনমিত কিছু না চান তবে এটি std::exchange(once,false)(দ্রষ্টব্য: পারমাণবিক নয় ) দিয়ে প্রতিস্থাপন করা যেতে পারে ।
গোলভোক

উত্তর:


90

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

যদি xএটি হয় intতবে আমি এটি বুলিয়ান হিসাবে ব্যবহার করছি ততক্ষণে if(x)...ইনক্রিমেন্টিংয়ের অর্থ হ'ল অপারেশনের আগে এর সত্যের মূল্য যাই হোক না কেন, এর trueপরে এর সত্য-মূল্য থাকবে (উপচে পড়া ব্যতীত)।

তবে, --প্রদত্ত জ্ঞানের কেবলমাত্র সত্য মানের মূল্য সম্পর্কে ভবিষ্যদ্বাণী করা অসম্ভব x, কারণ এটির ফলাফল হতে পারে false(যদি অবিচ্ছেদ্য মান 1 হয়) বা true(যদি অবিচ্ছেদ্য মান অন্য কিছু হয় - বিশেষত এর মধ্যে 0 [ false] এবং 2 বা আরও [ true])।

একটি সংক্ষিপ্ত হাত হিসাবে ++কাজ, এবং --না।

++ এটির সাথে সামঞ্জস্যের জন্য বুলগুলিতে অনুমতি দেওয়া হয় তবে এর ব্যবহারটি স্ট্যান্ডার্ডে অবহেলা করা হয়।


এটি ধরে নিয়েছে যে আমি কেবলx একটি বুলিয়ান হিসাবে ব্যবহার করি , যার অর্থ এটি না হওয়া পর্যন্ত ওভারফ্লো হতে পারে না যতক্ষণ না আমি ++নিজের নিজের উপরের প্রবাহের জন্য প্রায়শই যথেষ্ট কাজ করি । এমনকি চরটি যেমন টাইপ হিসাবে ব্যবহৃত হয় এবং CHAR_BITS5 এর মতো কম কিছু হয়, এর আগে 32 বার এটি আর কাজ করে না (এটি এখনও একটি খারাপ অনুশীলন হওয়ার পক্ষে যথেষ্ট যুক্তিযুক্ত, আমি অনুশীলনকে রক্ষা করছি না, কেবল এটি কেন কাজ করে তা ব্যাখ্যা করে) একটি 32-বিটের intজন্য অবশ্যই অবশ্যই ++এটি একটি সমস্যা হওয়ার আগে 2 ^ 32 বার ব্যবহার করতে হবে । সঙ্গে --যদিও এটি শুধুমাত্র পরিণাম ডেকে আনবে falseযদি আমি মান 1 দিয়ে শুরু true, অথবা 0 দিয়ে শুরু এবং ব্যবহৃত ++অবিকল আগে একবার।

এটি ভিন্ন হয় যদি আমরা 0 এর নীচে কয়েকটি মাত্রার সাথে শুরু করি তবে প্রকৃতপক্ষে, আমরা ++এর পরে falseমান হিসাবে ফলাফল পেতে চাই:

int x = -5;
while(++x)
  doSomething(x);

যাইহোক, এই উদাহরণটি শর্তযুক্ত ব্যতীত অন্য যে xকোনও intজায়গায় হিসাবে বিবেচনা করে, তাই এটি এর সমতুল্য:

int x = -5;
while(++x != 0)
  doSomething(x);

যা কেবলমাত্র xবুলিয়ান হিসাবে ব্যবহারের চেয়ে আলাদা ।


1
ধন্যবাদ. আমি এখনও সিটির একটি লাইন লিখেছি যেহেতু এটির দীর্ঘ সময় দেওয়া হলেও আমি এখনও এর মতো লোকদের উত্তর দিতে পারি তা জানতে পেরে খুব ভাল লাগছে
জন হান্না

8
তবে x -1 (VB এর মতো কিছু প্ল্যাটফর্মে সত্য) হলে, ++ x মিথ্যা হবে।
জেমস কারান

4
@ জেমস, সি এবং সি ++ এ এমনটি ঘটবে যা আমি যখন বলছিলাম ("ওভারফ্লো বাদ দিয়ে") of প্রকৃতপক্ষে ভিবিতে কোনও শূন্যের সত্যের মান সত্য (যেমন সি এর মতো) থাকে তবে সত্য বুলিয়ান অপারেশনের ফলস্বরূপ তাদের (1) এর পরিবর্তে 1-এর পরিবর্তে নন (সত্য) মিথ্যা, নয় (মিথ্যা) সত্য, x বা TRU হ'ল সত্য, x বা FALSE x, x এবং FALSE FALSE এবং x এবং TRU হ'ল x, ইত্যাদি বুলিয়ান এবং বিট-ওয়াইজ অপারেশনের জন্য একই অপারেটর ব্যবহার করে (যেহেতু VB দ্বিগুণ-পরিপূরক ধরে নেয় তাই -1 সমস্ত 1 বিট হয়)। তবে কোডার যদি 2 (সত্য) এবং 4 (সত্য) এর ফলাফল 0 (মিথ্যা) না দেয় তবে এটি ভিবিতে কিছু অদ্ভুত ত্রুটি সৃষ্টি করতে পারে।
জন হানা

2
@ জোহনহানা: এএনএসআই সি 89 প্রথম সি স্ট্যান্ডার্ড ছিল। এএনএসআই সি কমিটি <limits.h>শিরোনাম এবং CHAR_BITম্যাক্রো আবিষ্কার করেছিল । তার আগে, আমি মনে করি সেখানে তাত্ত্বিকভাবে বাস্তবায়ন হতে পারত যেখানে char8 বিটের চেয়ে সংকীর্ণ, তবে যতদূর আমি জানি কোনওটিই ছিল না। বিশেষত, কে ও আর 1 (1978 সালে প্রকাশিত) 4 টি নমুনা বাস্তবায়ন তালিকাভুক্ত করে, যার মধ্যে 8-বিট বা 9-বিট রয়েছে char
কিথ থম্পসন

1
@ জোহনহানা: একটি রূপান্তরকারী সি বাস্তবায়নের অবশ্যই থাকতে হবে CHAR_BIT >= 8। মান যেখানে কঠিন সেখানে লক্ষ্যমাত্রার জন্য ভাতা দেয় না। (আপনার অবশ্যই একটি অনুকরণীয় বাস্তবায়ন থাকতে পারে))
কিথ থম্পসন

29

এএনএসআই আইএসইও 14882 2003 (সি ++ 03):

5.2.6-2

পোস্টফিক্সের অপারেন্ড - পোস্টফিক্স ++ অপারেটরের সাথে অ্যানালগভাবে হ্রাস করা হয়, অপারেন্ডটি টাইপ বুলের হয় না। [দ্রষ্টব্য: উপসর্গ বৃদ্ধি এবং হ্রাসের জন্য দেখুন 5.3.2। ]

এবং আশ্চর্যজনকভাবে ...

5.3.2-2

উপসর্গের অপারেন্ড - ১ টি বিয়োগ করে সংশোধন করা হয়েছে The অপারেন্ডটি বুলের মতো হবে না। উপসর্গের অপারেন্ডে প্রয়োজনীয়তা - এবং এর ফলাফলের বৈশিষ্ট্যগুলি অন্যথায় উপসর্গের মতো ++। [দ্রষ্টব্য: পোস্টফিক্স বৃদ্ধি এবং হ্রাসের জন্য, দেখুন 5.2.6। ]

এছাড়াও 5.6.2-1 এবং 5.3.2-1 উল্লেখ করেছে যে বলগুলির জন্য ++ সত্য হবে এবং আনেক্সেক্স ডি -1 বলছে যে অবৈধভাবে বুলিতে ++ হবে।


3
@ ব্লুরাজা: জন হানার উত্তর দেখুন।
জাস্টিন আরদিনি

9

Historicalতিহাসিক কারণে এটি সমর্থিত ছিল। তবে নোট করুন ... ++ অপারেটরের সাথে টাইপের বুলের অপারেন্ডের ব্যবহার হ্রাস করা হয়েছে সি ++ স্ট্যান্ডার্ডের (এন 3092) বিভাগে 5.3.2 দেখুন

5.3.2 বৃদ্ধি এবং হ্রাস [expr.pre.incr]

  • উপসর্গ ++ এর ক্রিয়াকলাপটি 1 যুক্ত করে সংশোধন করা হয়েছে, বা এটি শান্ত হলে সত্য হিসাবে সেট করা হয় (এই ব্যবহারটি অবচিত হয়)। অপারেন্ডটি একটি পরিবর্তনযোগ্য লভ্যালু হবে। অপারেন্ডের ধরণটি গাণিতিক টাইপ বা সম্পূর্ণ সংজ্ঞায়িত অবজেক্ট টাইপের পয়েন্টার হতে হবে। ফলাফল আপডেট অপারেন্ড; এটি একটি মূল্যবান এবং অপারেন্ডটি যদি একটি বিট-ফিল্ড হয় তবে এটি একটি বিট-ফিল্ড। যদি এক্স টাইপ বুলের না হয় তবে এক্সপ্রেশনটি ++ x এক্স + = 1 এর সমান [দ্রষ্টব্য: রূপান্তর সম্পর্কিত তথ্যের জন্য সংযোজন (5.7) এবং অ্যাসাইনমেন্ট অপারেটরগুলি (5.17) এর আলোচনা দেখুন। অন্তর্ভুক্ত নোট]
  • উপসর্গের অপারেন্ড - ১ টি বিয়োগ করে সংশোধন করা হয়েছে The অপারেন্ডটি বুলের মতো হবে না। উপসর্গের অপারেন্ডে প্রয়োজনীয়তা - এবং এর ফলাফলের বৈশিষ্ট্যগুলি অন্যথায় উপসর্গের মতো ++।

3
  • পুরানো মান (সি ++ 98) দিয়ে এটি ত্রুটি নয়।
  • নতুন মান বাড়ানোর সাথে সাথে একটি বুলিয়ান হ্রাস করা হয়। (সি ++ 11)
  • আপনি C ++ 17 অবধি কোনও বুলিয়ানতে বর্ধিতকরণ ব্যবহার করতে পারেন।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.