সি-স্টাইলের ভাষাগুলিতে লজিক্যাল নট অপারেটর কেন “!” এবং “~~” নয়?


39

বাইনারি অপারেটরগুলির জন্য আমাদের কাছে বিটওয়াইজ এবং লজিকাল অপারেটর উভয়ই রয়েছে:

& bitwise AND
| bitwise OR

&& logical AND
|| logical OR

না (একটি অ্যানারি অপারেটর) যদিও অন্যভাবে আচরণ করে। বিটওয়াইজের জন্য ~ আছে এবং! যৌক্তিক জন্য।

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

আমি মিস করার কোন কারণ আছে?


7
কারন যদি !! যৌক্তিক নয়, আমি কীভাবে ৪২-এ পরিণত করব? :)
candied_orange

9
চান ~~তারপর না লজিক্যাল জন্য আরো সামঞ্জস্যপূর্ণ হয়েছে, যদি আপনি প্যাটার্ন যে যৌক্তিক অপারেটর bitwise অপারেটর একটি দ্বিগুনের হয় অনুসরণ করে?
বার্ট ভ্যান ইনজেন শেেনা

9
প্রথমত, যদি এটি ধারাবাহিকতার জন্য হয় তবে এটি ~ এবং ~~ দ্বিগুণ হয়ে গিয়েছিল এবং শর্ট সার্কিটের সাথে সম্পর্কিত; এবং লজিকাল একটি শর্ট সার্কিট নেই।
ক্রিস্টোফ

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

7
কিছু মন্তব্য ইতিমধ্যে (এবং যারা অনুসরণ করতে না চান জন্য উল্লিখিত আছে হিসাবে এই লিঙ্কে , !!foo? একটি না বিরল (না সাধারণ নয়) বাগ্ধারা, বরং এটি একটি শূন্য-অর-অশূন্য যুক্তি normalizes। 0বা 1
কিথ থম্পসন

উত্তর:


108

আশ্চর্যের বিষয় হল, সি-স্টাইল প্রোগ্রামিং ভাষার ইতিহাস সি দিয়ে শুরু হয় না with

ডেনিস রিচি এই নিবন্ধে সি এর জন্মের চ্যালেঞ্জগুলি ভালভাবে ব্যাখ্যা করেছেন ।

এটি পড়ার সময়, এটি স্পষ্ট হয়ে যায় যে সি এর ভাষা নকশার একটি অংশ পূর্বসূর বিসিপিএল এবং বিশেষত অপারেটরদের কাছ থেকে উত্তরাধিকার সূত্রে পেয়েছিল । অধ্যায় "নিওন্যাটাল সি" উপরোক্ত প্রবন্ধের ব্যাখ্যা BCPL এর &এবং |দুটি নতুন অপারেটার সমৃদ্ধ হয়েছে &&এবং ||। কারণগুলি ছিল:

  • এর সাথে একত্রে ব্যবহারের কারণে বিভিন্ন অগ্রাধিকারের প্রয়োজন হয়েছিল ==
  • বিভিন্ন পরীক্ষা নিরীক্ষার যুক্তিবিজ্ঞান: বাম-থেকে-ডান মূল্যায়ন সঙ্গে শর্ট সার্কিট (অর্থাত যখন aহয় falseমধ্যে a&&b, bমূল্যায়ন হয় না)।

মজার বিষয় হল, এই দ্বিগুণ হওয়া পাঠকের পক্ষে কোনও দ্বিধা তৈরি করে না: a && bযেমনটি ভুল ব্যাখ্যা করা হবে না a(&(&b))। পার্সিং দৃষ্টিকোণ থেকে, কোনও দ্ব্যর্থহীনতা নেই: &bএটি যদি bএকটি মূল্যবান হয় তবে এটি বোঝাতে পারে তবে এটি একটি পয়েন্টার হবে যেখানে বিটওয়াইসের &জন্য একটি পূর্ণসংখ্যার অপারেন্ডের প্রয়োজন হবে, সুতরাং যুক্তিযুক্ত এবং কেবলমাত্র একমাত্র যুক্তিসঙ্গত পছন্দ হবে।

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


10
বিশ্লেষক দুটি পরিস্থিতি বিশ্লেষণ করতে অক্ষম, সুতরাং ভাষা ডিজাইনারদের অবশ্যই এটি করা উচিত।
ববডালগাইশ

16
@ স্টিভ: প্রকৃতপক্ষে, সি এবং সি-জাতীয় ভাষায় ইতিমধ্যে অনেকগুলি একই সমস্যা রয়েছে। যখন পার্সার দেখেন (t)+1যে এটি সংযোজন (t)এবং 1এটি +1টাইপ করার জন্য একটি কাস্ট বা হয় t? সি ++ ডিজাইনে >>সঠিকভাবে টেমপ্লেটগুলি কীভাবে লেক্স করা যায় তা সমাধান করতে হয়েছিল। ইত্যাদি।
এরিক লিপার্ট

6
@ ব্যবহারকারী 2357112 আমি মনে করি যে বক্তব্যটি হ'ল টোকেনাইজারটি অন্ধভাবে &&একক &&টোকেন হিসাবে নেওয়া এবং দুটি &টোকেন হিসাবে নেওয়া ঠিক নয় , কারণ a & (&b)ব্যাখ্যাটি লেখার পক্ষে যুক্তিসঙ্গত জিনিস নয়, তাই কোনও মানুষ কখনও এর অর্থ বোঝাতে পারেননি এবং অবাক হয়েছিলেন সংকলক হিসাবে এটি চিকিত্সা a && b। যদিও উভয়ই !(!a)এবং !!aমানুষের পক্ষে বোঝার সম্ভাব্য জিনিস, সুতরাং সংকলকটির পক্ষে একটি নির্বিচার টোকেনাইজেশন-স্তরের নিয়ম দিয়ে অস্পষ্টতাটি সমাধান করা খারাপ ধারণা।
বেন 5

17
!!লেখার পক্ষে কেবল সম্ভব / যুক্তিসঙ্গতই নয়, তবে প্রচলিত প্রজ্ঞাটি "বুলিয়ান রূপান্তর করুন" id
আর ..

4
আমি মনে করি dan04 এর অস্পষ্টতা উল্লেখ করা হয় --aবনাম -(-a), এই দুই ধরনের বৈধ চিহ্নগুলি সিন্টেক্সের ক্ষেত্রে কিন্তু বিভিন্ন শব্দার্থবিদ্যা আছে।
রুসলান

49

ডিজাইনাররা যে নীতিটি বিটওয়াইজ এবং ডাবলটি এখানে যৌক্তিক তা নীতি থেকে বিচ্যুত হওয়ার কারণ সম্পর্কে আমি ভাবতে পারি না,

এটি প্রথমে নীতি নয়; একবার আপনি বুঝতে পারলে, এটি আরও বোধগম্য হয়।

&বনাম &&সম্পর্কে চিন্তা করার আরও ভাল উপায় বাইনারি এবং বুলিয়ান নয় । আরও ভাল উপায় হ'ল তাদের আগ্রহী এবং অলস হিসাবে ভাবা । &অপারেটর বাম এবং ডান পাশ executes এবং তারপর ফলাফলের নির্ণয় করে। &&অপারেটর বাম পাশে executes, এবং তারপর ডান দিকে executes শুধুমাত্র প্রয়োজনীয় যদি ফলাফলের গনা।

তদুপরি, "বাইনারি" এবং "বুলিয়ান" সম্পর্কে চিন্তা করার পরিবর্তে আসলে কী ঘটছে তা ভেবে দেখুন। "বাইনারি" সংস্করণটি কেবল বুলিয়ানদের একটি অ্যারেতে বুলিয়ান অপারেশন করছে যা একটি শব্দের মধ্যে ভরপুর রয়েছে

সুতরাং এটি একসাথে রাখা যাক। বুলিয়ানগুলির একটি অ্যারেতে অলস অপারেশন করা কি কোনও অর্থবোধ করে ? না, কারণ প্রথমে চেক করার জন্য কোনও "বাম দিক" নেই। প্রথমে চেক করতে 32 টি "বাম দিক" রয়েছে। সুতরাং আমরা অলস অপারেশনগুলিকে একক বুলিয়ানের মধ্যেই সীমাবদ্ধ রেখেছি এবং সেখানেই আপনার অন্তর্নিহিততা এসেছে যে এর মধ্যে একটি "বাইনারি" এবং একটি "বুলিয়ান" এসেছে তবে এটি ডিজাইনের ফলাফল , নকশা নিজেই নয়!

এবং আপনি যখন এটি সেভাবে ভাবেন তখন কেন স্পষ্ট হবে এবং কেন !!নেই ^^। অপারেটরগুলির কোনওটিরই সম্পত্তি নেই যা আপনি অপারেটরগুলির মধ্যে একটি বিশ্লেষণ এড়িয়ে যেতে পারেন; কোন "অলস" notবা xor

অন্যান্য ভাষাগুলি এটিকে আরও স্পষ্ট করে তোলে; কিছু ভাষা and"আগ্রহী" এবং and alsoউদাহরণস্বরূপ "অলস এবং" এর অর্থ ব্যবহার করে। এবং অন্যান্য ভাষাও এটিকে আরও স্পষ্ট করে তোলে &এবং &&"বাইনারি" এবং "বুলিয়ান" নয়; উদাহরণস্বরূপ সি # তে, উভয় সংস্করণই বুলিয়ানদের অপারেশন হিসাবে নিতে পারে।


2
ধন্যবাদ. এটি আমার জন্য আসল চোখের ওপেনার। খুব খারাপ আমি দুটি উত্তর গ্রহণ করতে পারি না।
মার্টিন মাট

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

14
উদাহরণস্বরূপ, সি এবং সি ++ এ 1 & 2সম্পূর্ণ ভিন্ন ফলাফল রয়েছে 1 && 2
ব্যবহারকারী 2357112

7
@ জিজিআরচার: আমি উপরের মন্তব্যে যেমন উল্লেখ করেছি যে boolসি তে একটি প্রকার বাদ দেওয়ার সিদ্ধান্তের প্রভাব পড়েছে। আমাদের উভয়ের প্রয়োজন !এবং ~একটির অর্থ "একক বুলিয়ান হিসাবে একটি আন্ত ব্যবহার করা" এবং এর অর্থ "বুলিয়ানদের প্যাকেড অ্যারে হিসাবে কোনও ইনটকে ট্রিট করুন"। আপনার যদি আলাদা আলাদা বুল এবং ইনট টাইপ থাকে তবে আপনার কেবলমাত্র একজন অপারেটর থাকতে পারে, আমার মতে এটি আরও ভাল ডিজাইন হতে পারে তবে আমরা সেইটির থেকে প্রায় 50 বছর দেরী করেছি। সি # পরিচিতির জন্য এই নকশাটি সংরক্ষণ করে।
এরিক লিপার্ট

3
@ স্টিভ: যদি উত্তরটি অযৌক্তিক মনে হয় তবে আমি কোথাও একটি দুর্বল প্রকাশিত যুক্তি দিয়েছি এবং আমাদের কর্তৃপক্ষের পক্ষ থেকে কোনও যুক্তির উপর নির্ভর করা উচিত নয়। এটি সম্পর্কে কী আবদ্ধ বলে আপনি আরও বলতে পারেন?
এরিক লিপার্ট

21

টি এল; ডিআর

সি উত্তরাধিকারসূত্রে !এবং ~অন্য ভাষা থেকে অপারেটর। উভয়ই &&এবং ||বছর পরে একটি পৃথক ব্যক্তি যোগ করা হয়েছিল।

দীর্ঘ উত্তর

Orতিহাসিকভাবে, সি প্রাথমিক ভাষাগুলির মধ্যে বি বিকশিত হয়েছিল, যা বিসিপিএলের উপর ভিত্তি করে ছিল, যা সিপিএল ভিত্তিক ছিল, যা আলগোলের উপর ভিত্তি করে ছিল।

অ্যালগল , সি ++, জাভা এবং সি # এর মহান-পিতামহ, প্রোগ্রামারদের কাছে স্বজ্ঞাত বোধ করার জন্য সত্য ও মিথ্যা সংজ্ঞায়িত করেছেন: "সত্যিকার মান যা বাইনারি সংখ্যা হিসাবে গণ্য হয় (1 এর সাথে সত্য এবং 0 এর সাথে মিথ্যা), অভ্যন্তরীণ অবিচ্ছেদ্য মান হিসাবে একই "। তবে এর একটি অসুবিধা হ'ল লজিকাল এবং বিটওয়াইজ একই ক্রিয়াকলাপ হতে পারে না: যে কোনও আধুনিক কম্পিউটারে, ~01 এর চেয়ে 1- ~1সমান এবং 0-এর সমান -2 (এমনকি ষাট বছরের পুরানো মেইনফ্রেমে যেখানে ~0প্রতিনিধিত্ব করা হয় - 0 বা INT_MIN, ~0 != 1কখনও তৈরি প্রতিটি সিপিইউতে, এবং সি ভাষার স্ট্যান্ডার্ডটি বহু বছরের জন্য এটির প্রয়োজনীয়তা রয়েছে, যদিও এর বেশিরভাগ কন্যা ভাষা এমনকি সাইন-ও-গৌনত্ব বা কোনওটির পরিপূরককে সমর্থন করার পক্ষেও জোর দেয় না))

আলগল বিভিন্ন রূপ নিয়ে এবং অপারেটরদের বুলিয়ান এবং ইন্টিগ্রাল মোডে আলাদাভাবে ব্যাখ্যা করে এটিকে ঘিরে কাজ করে। এটি হ'ল, বিটওয়াইজ অপারেশনটি পূর্ণসংখ্যার ধরণগুলির মধ্যে একটি ছিল এবং বুলিয়ান ধরণের ক্ষেত্রে একটি যৌক্তিক অপারেশন ছিল।

বিসিপিএল-এর বিটওয়াইজ এবং লজিক্যাল নয় উভয়ের জন্য একটি পৃথক বুলিয়ান প্রকার ছিল, তবে একটি একক notঅপারেটর ছিল । সি এর প্রথম দিকের অগ্রদূত যেভাবে কাজটি করেছিলেন তা ছিল:

সত্যের মূল্যমানটি কিছুটা প্যাটার্ন যা সম্পূর্ণরূপে গঠিত; অসত্যের মূল্য শূন্য।

মনে রাখবেন যে true = ~ false

(আপনি পর্যবেক্ষণ করবেন যে মূল্যবোধের শব্দটি সি-পারিবারিক ভাষায় সম্পূর্ণ আলাদা অর্থ বোঝাতে বিকশিত হয়েছে We আমরা আজ সিটিকে "বস্তুর উপস্থাপনা" বলব)

এই সংজ্ঞাটি যৌক্তিক এবং বিটওয়াইজকে একই মেশিন-ভাষা নির্দেশ ব্যবহার না করার অনুমতি দেয়। সি যদি সেই পথে চলে যায় তবে শিরোনামটি বিশ্ব জুড়ে বলত #define TRUE -1

তবে বি প্রোগ্রামিংয়ের ভাষাটি দুর্বল টাইপযুক্ত ছিল এবং এতে কোনও বুলিয়ান বা এমনকি ভাসমান-বিন্দুর প্রকার ছিল না। intএর উত্তরসূরির সবকিছুতেই সমান ছিল সি। যখন কোনও প্রোগ্রামটি সত্য বা মিথ্যা ছাড়া অন্য কোনও মানকে যৌক্তিক মান হিসাবে ব্যবহার করে তখন কী ঘটেছিল তা সংজ্ঞায়িত করার পক্ষে ভাষার পক্ষে এটি একটি ভাল ধারণা তৈরি হয়েছিল। এটি প্রথমে একটি সত্যবাদী অভিব্যক্তিটিকে "শূন্যের সমান নয়" হিসাবে সংজ্ঞায়িত করেছিল। এটি যে মিনিটকম্পিউটারে চলেছিল তাতে দক্ষ ছিল, যার সিপিইউ শূন্য পতাকা ছিল।

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

তবে বি TRUEহিসাবে 1এবং FALSEহিসাবে সংজ্ঞায়িত করার 0অর্থ হ'ল পরিচয়টি true = ~ falseআর রাখা হয়নি এবং এটি শক্তিশালী টাইপিং ফেলেছিল যা আলগোলকে বিটওয়াইজ এবং লজিক্যাল এক্সপ্রেশনগুলির মধ্যে বিভক্ত করতে দেয়। এটির জন্য একটি নতুন লজিকাল-নন অপারেটর প্রয়োজন, এবং ডিজাইনাররা বেছে নিয়েছিলেন !, সম্ভবত কারণ সমান-সমান ইতিমধ্যে ছিল না !=, যা দেখতে সমান চিহ্নের মাধ্যমে উল্লম্ব বারের মতো সাজানো। তারা একই সম্মেলনটি অনুসরণ করেনি &&বা ||কারওরই অস্তিত্ব নেই বলে তারা অনুসরণ করে ।

তাত্ক্ষণিকভাবে, তাদের উচিত: &বিতে অপারেটরটি নকশা অনুযায়ী ভাঙা। বি এবং সি-তে, 1 & 2 == FALSEযদিও 1এবং 2উভয় সত্যবাদী মূল্যবোধ, এবং বি-তে যৌক্তিক ক্রিয়াকলাপটি প্রকাশ করার কোনও স্বজ্ঞাত উপায় নেই That এটি ছিল একটি ভুল সি যুক্তি দ্বারা আংশিকভাবে সংশোধন করার চেষ্টা করেছিল &&এবং ||, কিন্তু সেই সময়টির প্রধান উদ্বেগ ছিল অবশেষে কাজ করার জন্য সংক্ষিপ্ত সার্কিট করুন এবং প্রোগ্রামগুলি আরও দ্রুত চালিত করুন। এর প্রমাণটি হ'ল এটি নেই ^^: 1 ^ 2এটি উভয় ক্রিয়াকলাপ সত্যবাদী হলেও সত্যবাদী মূল্য, তবে এটি সংক্ষিপ্ত-প্রদাহ দ্বারা উপকৃত হতে পারে না।


4
+1 টি। আমি মনে করি এটি এই অপারেটরগুলির বিবর্তনের চারপাশে এটি বেশ ভাল গাইড গাইড tour
স্টিভ

বিটিডাব্লু, সাইন / প্রশস্ততা এবং এর পরিপূরক মেশিনগুলির জন্য পৃথক বিটওয়াইস বনাম লজিক্যাল নেগেশন প্রয়োজন, এমনকি ইনপুটটি ইতিমধ্যে বুলিয়ানাইজড থাকলেও। ~0(সমস্ত বিট সেট) হ'ল একটির পরিপূরক negativeণাত্মক শূন্য (বা একটি ফাঁদ উপস্থাপনা)। সাইন / প্রশস্ততা ~0সর্বাধিক মাত্রা সহ একটি negativeণাত্মক সংখ্যা।
পিটার কর্ডস

@ পিটারকর্ডস আপনি একদম ঠিক বলেছেন আমি কেবল দুটি এর পরিপূরক মেশিনগুলিতে ফোকাস করছি কারণ তারা অনেক বেশি গুরুত্বপূর্ণ। হয়তো এটি একটি পাদটীকা মূল্য।
ডেভিস্লোর

আমি মনে করি আমার মন্তব্যটি যথেষ্ট, তবে হ্যাঁ, সম্ভবত কোনও প্রথমসূত্র (যে কোনও 1 এর পরিপূরক বা সাইন / মাত্রার জন্য কাজ করে না) একটি ভাল সম্পাদনা হবে।
পিটার কর্ডস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.