তুলনামূলক তুলনায় বিটওয়াইজ অপারেটরদের কেন কম অগ্রাধিকার রয়েছে?


63

কেউ কি যুক্তিটি ব্যাখ্যা করতে পারেন, কেন সর্বাধিক জনপ্রিয় ভাষাগুলিতে (নীচের নোটটি দেখুন) তুলনা অপারেটরগুলি (==,! =, <,>, <=,> =) বিটওয়াইজ অপারেটরগুলির (এবং, |, ^) এর চেয়ে বেশি অগ্রাধিকার পাচ্ছেন , ~)?

আমি মনে করি না যে আমি কখনও এমন ব্যবহারের মুখোমুখি হয়েছি যেখানে এই নজিরটি প্রাকৃতিক হবে। এটি সর্বদা মত স্টাফ:

  if( (x & MASK) == CORRECT ) ...   // Chosen bits are in correct setting, rest unimportant

  if( (x ^ x_prev) == SET )      // only, and exactly SET bit changed

  if( (x & REQUIRED) < REQUIRED )   // Not all conditions satisfied

যে ক্ষেত্রে আমি ব্যবহার করেছি:

  flags = ( x == 6 | 2 );     // set bit 0 when x is 6, bit 1 always.

অস্তিত্বের কাছাকাছি

অপারেটরদের এরকম নজির সম্পর্কে সিদ্ধান্ত নিতে ভাষা ডিজাইনারদের অনুপ্রেরণা কী ছিল?


উদাহরণস্বরূপ, শীর্ষ 12 টি ভাষাতে এসকিউএল ব্যতীত সমস্ত ল্যাঙ্গপপ ডটকমের প্রোগ্রামিং ভাষা জনপ্রিয়তার তালিকার মতো: সি, জাভা, সি ++, পিএইচপি, জাভাস্ক্রিপ্ট, পাইথন, সি #, পার্ল, এসকিউএল, রুবি, শেল, ভিজ্যুয়াল বেসিক।


16
মূল নকশায় ফিরে সি
র্যাচেট ফ্রিক

7
@ জাগান, সেই অভিযোগের কী অর্থ? ওপি "সমস্ত" বলেনি, কেবল "সর্বাধিক জনপ্রিয় ভাষার একগুচ্ছ"। এবং বিশাল সংখ্যাগরিষ্ঠরা এই আদেশটি অনুসরণ করে। এই সারণীতে শীর্ষ 12 টির

3
@ ড্যান 1111 পয়েন্টটি স্বাভাবিকভাবেই উত্তরদাতাদের জিজ্ঞাসিত প্রশ্নটি আরও ভালভাবে বুঝতে এবং আরও ভাল উত্তর সরবরাহ করতে সহায়তা করে। আপনি দেখুন, এটি অনুমান গেমের জন্য কোনও জায়গা নয় - বা যেমন সফর পৃষ্ঠায় বলা হয়েছে, "এটি কোনও আলোচনার ফোরাম নয় no কোনও চিট-আড্ডা নেই।"
gnat

7
@ জাগ্রত, আমি গেম অনুমান করার বিষয়ে আপনার উদ্বেগের সাথে একমত, তবে প্রায় প্রতিটি জনপ্রিয় ভাষা বর্ণিত আচরণকে প্রদর্শিত করলে আমি এটি যোগ্যতা অর্জন করি বলে মনে করি না।

5
@Dunk: সাধারণ "দলা দ্বারা" পন্থা [arithmetics] [logic operator] [arithmetics]। বেশিরভাগ প্রোগ্রামাররা প্রথম বন্ধনীর মতো জঞ্জাল তৈরি করে না if(((x+getLowX()) < getMinX) || ((x-getHighX())>getMaxX())))- বেশিরভাগ যুক্তিবিদ্যার চেয়ে পাটিগণিতের অগ্রাধিকার গ্রহণ করবে এবং উপরের if( ( x + getLowX() < getMinX ) || ( x - getHighX() > getMaxX() )) অগ্রাধিকারটি ধরে নিয়ে লিখবে । এখন স্বজ্ঞাতভাবে একই আচরণ করা উচিত, এক্সওআরআর গণিত অপারেটর। এটি যেভাবে ব্যাখ্যা করা হয়েছে তা সম্পূর্ণরূপে স্বজ্ঞাত। +<if( x ^ getMask() != PATTERN )if( x ^ ( getMask() != PATTERN ) )
এসএফ

উত্তর:


72

ভাষাগুলি সি থেকে অনুলিপি করেছে, এবং সি এর জন্য ডেনিস রিচি ব্যাখ্যা করেছেন যে প্রাথমিকভাবে, খ (এবং সম্ভবত সি এর প্রথমদিকে), একটি মাত্র রূপ ছিল &যা প্রসঙ্গে কিছুটা দিকনির্দেশনা বা যৌক্তিকভাবে তৈরি হয়েছিল। পরে, প্রতিটি ফাংশন তার অপারেটর পেয়েছিল: &বিটওয়াইস একের &&জন্য এবং যৌক্তিক জন্য one তারপরে তিনি চালিয়ে যান

তাদের কঠোর ভূমিকা সি এর অগ্রাধিকার নিয়মের একটি উপকারের ব্যাখ্যা করে। বি তে একজন লিখেছেন

if (a == b & c) ...

aসমান bএবং cশূন্য নয় কিনা তা পরীক্ষা করতে ; এ জাতীয় শর্তসাপেক্ষ অভিব্যক্তিতে এটির চেয়ে ভাল যে এর &চেয়ে কম প্রাধান্য পাবে ==। 'বি' থেকে সি রূপান্তর ইন, এক প্রতিস্থাপন করতে চায় &দ্বারা &&যেমন এক বিবৃতিতে; রূপান্তরটি কম বেদনাদায়ক করে তুলতে, আমরা &অপারেটরের প্রাধান্যকে একইরকম রাখার সিদ্ধান্ত নিয়েছি ==এবং কেবল &&থেকে সামান্যতম প্রাধান্যকে বিভক্ত করেছি &। আজ, মনে হচ্ছে যে এটা আপেক্ষিক precedences সরাতে বাঞ্ছনীয় হতো &এবং ==, এবং যার ফলে একটি সাধারণ সি বাগ্ধারা প্রক্রিয়া সহজ: অন্য মান বিরুদ্ধে মুখোশধারী মান পরীক্ষা করার জন্য, এক লিখতে হবে

if ((a & mask) == b) ...

যেখানে অভ্যন্তরীণ প্রথম বন্ধনীর প্রয়োজন হয় তবে সহজেই ভুলে যায়।


1
c=2বা যদি এর a==bফলাফল হয় ~0এবং না হয় তবে তা ব্যর্থ হবে না 1?
এসএফ


উত্তরে রেফারেন্সটি দেখুন এবং পূর্ববর্তী পাঠটি পড়ুন।
SShaheen

1
@ ম্যাসনভিয়েল: বিশেষত এম্বেড হওয়া সিস্টেমে কখনও কখনও ফাংশন-জাতীয় ম্যাক্রোগুলি ব্যবহার করা প্রয়োজন [কিছু ক্ষেত্রে তারা লাইন-ইন ফাংশনগুলির চেয়ে অর্ডার-অফ-মাত্রার উন্নততর কার্য সম্পাদন করতে পারে এবং কিছু এমবেডেড সিস্টেমে যা সমালোচনামূলক হতে পারে]। এই জাতীয় ম্যাক্রোর মধ্যে পরিবর্তনীয় ঘোষণা সম্ভব নয়; একটি ম্যাক্রোর মধ্যে একটি বৈশ্বিক পরিবর্তনশীল ব্যবহার করা কার্যকর হতে পারে, তবে সত্যিই অদ্ভুত বলে মনে হচ্ছে।
সুপারক্যাট

6
@ ম্যাসনভিয়েল: আপনি কি পরিমাণে 1000 ডলারে একটি রাস্পবেরি পাই বা আরডুইনো খুঁজে পেতে পারেন?
ক্যাট

7

বিটওয়াইজ অপারেটরগুলি লজিকাল অপারেটরগুলির সাথে উভয় ধারণা এবং উপস্থিতিতে সম্পর্কিত, সম্ভবত এটি ব্যাখ্যা করে যে কেন তারা অগ্রাধিকার সারণীতে একে অপরের কাছে রয়েছে। সম্ভবত কেউ তর্ক করতে পারে যে এটির &চেয়ে বেশি হওয়া বিভ্রান্তিকর হবে তবে ততক্ষণে নীচে ==থাকবে ।&&==

একবার কোনও নজির নজির (!) সেট হয়ে গেলে, অন্যান্য ভাষার পক্ষে এটি ধারাবাহিকতার জন্য অনুসরণ করা ভাল।

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

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