কেন '&&' এবং '&' নয়?


135

কেন তার চেয়ে বেশি &&পছন্দনীয় &এবং ||তার চেয়ে বেশি পছন্দ |?

আমি এমন কাউকে জিজ্ঞাসা করেছি যিনি বছরের পর বছর প্রোগ্রাম করে চলেছেন এবং তার ব্যাখ্যাটি ছিল:

উদাহরণস্বরূপ, মধ্যে if (bool1 && bool2 && bool3) { /*DoSomething*/ }, bool1পরীক্ষা করার জন্য এটি জন্য সত্য হতে হয়েছে bool2যা সরে যাওয়ার আগে সত্য হতে হয়েছে bool3, ইত্যাদি যদি আমি একটি একক ব্যবহৃত চাই &পরিবর্তে সেখানে পরীক্ষা এমনকি যদি তাদের সব সত্য হতে পারে আছে কোন অর্ডার পরবর্তী লাইনে অগ্রগতি, সুতরাং কেন এটি যাই হোক না কেন ব্যাপার?

দ্রষ্টব্য: আমি এটি উল্লেখ করতে চাই যে আমি একটি টডলারের সমতুল্য প্রোগ্রামিং এবং এটি কোনও গুরুতর বা জরুরি প্রশ্ন নয়। এটি অন্য বিষয়গুলির বিপরীতে কেন নির্দিষ্ট উপায়ে করা উচিত তা বোঝার বিষয়।


55
& এবং && | এবং || সম্পূর্ণ ভিন্ন অপারেটর
ফেলিস পোলানো

3
পশ্চাদপসরণ করা হয়েছে, কারণ এটি কেবল সি #-র ক্ষেত্রে প্রযোজ্য নয়
জনাথন ডিকিনসন

12
প্রত্যাবর্তন করা হয়েছে, কারণ উত্তরগুলি ইতিমধ্যে সি # এর সাথে নির্দিষ্ট এবং অভ্যন্তরীণ কাজগুলি অন্যান্য ভাষায় যা সাধারণত একই ধারণা রয়েছে সে ক্ষেত্রে কিছুটা পৃথক হতে পারে।
ড্যানিয়েল হিলগারথ

8
@ ফিলিস: এগুলি আলাদা তবে খুব কমই সম্পূর্ণ আলাদা। এগুলি আসলে খুব অনুরূপ: x & yএবং x && yx এবং y বুলিয়ান ধরণের অভিব্যক্তি হলে সর্বদা একই ফলাফলের জন্য মূল্যায়ন করবে। আসলে এই ক্ষেত্রে একমাত্র পার্থক্য মনে হয় যে x & y, সর্বদা y এর মূল্যায়ন করা হয়।
জোরেেন

1
@ স্লেওকিন: আমি উত্তরগুলি পড়তে পরামর্শ দেব। কিছু কর্মক্ষমতা পার্থক্য সম্পর্কে ব্যাপকভাবে লিখুন। উত্তরটি আপনাকে অবাক করে দিতে পারে।
আবেল

উত্তর:


183

বেশিরভাগ ক্ষেত্রে, &&এবং ||তার চেয়ে বেশি পছন্দ করা হয় &এবং |কারণ পূর্ববর্তীটি স্বল্প সংক্রমণযুক্ত, অর্থাত ফলাফল স্পষ্ট হওয়ার সাথে সাথে মূল্যায়ন বাতিল হয়ে যায়।

উদাহরণ:

if(CanExecute() && CanSave())
{
}

যদি CanExecuteরিটার্ন হয় falseতবে এর সম্পূর্ণ falseরিটার্ন মানটি নির্বিশেষে সম্পূর্ণ এক্সপ্রেশন হবে CanSave। এই কারণে, CanSaveকার্যকর করা হয় না।

নিম্নলিখিত পরিস্থিতিতে এটি খুব সুবিধাজনক:

string value;
if(dict.TryGetValue(key, out value) && value.Contains("test"))
{
    // Do Something
}

TryGetValuefalseঅভিধানে সরবরাহিত কীটি পাওয়া না গেলে ফিরিয়ে দেয়। সংক্ষিপ্ত-সার্কিট প্রকৃতির কারণে &&, value.Contains("test")শুধুমাত্র কার্যকর করা হয়, যখন TryGetValueপ্রত্যাবর্তন হয় trueএবং এভাবে valueহয় না null। আপনি যদি এর পরিবর্তে বিটওয়াইড এবং অপারেটর &ব্যবহার NullReferenceExceptionকরেন তবে অভিধানে কীটি না পাওয়া গেলে আপনি পেয়ে যাবেন , কারণ অভিব্যক্তির দ্বিতীয় অংশটি যে কোনও ক্ষেত্রে কার্যকর করা হয়েছে।

এর অনুরূপ তবে সরল উদাহরণ নিম্নোক্ত কোড (টিজেহিউভেল উল্লেখ করেছেন):

if(op != null && op.CanExecute())
{
    // Do Something
}

CanExecuteযদি opনা হয় তবেই মৃত্যুদন্ড কার্যকর করা হয় null। যদি opহয় nullতবে এক্সপ্রেশনটির প্রথম অংশটি ( op != null) মূল্যায়ন করে falseএবং বাকী ( op.CanExecute()) এর মূল্যায়ন এড়িয়ে যায়।

এছাড়াও এই, টেকনিক্যালি, তারা ভিন্ন, অত্যধিক:
&&এবং ||শুধুমাত্র ব্যবহার করা যেতে পারে boolযেহেতু &এবং |কোন অবিচ্ছেদ্য প্রকার (ব্যবহার করা যেতে পারে bool, int, long, sbyte,, ...) কারণ তারা bitwise অপারেটরদের হয়। &হয় , bitwise ও অপারেটর এবং |হয় bitwise বা অপারেটর।

খুব নির্ভুলভাবে বলতে গেলে, সি # তে এই অপারেটরদের ( &, |[এবং ^]) "লজিকাল অপারেটর" বলা হয় ( সি # স্পেস , অধ্যায় 7.11 দেখুন)। এই অপারেটরগুলির বেশ কয়েকটি বাস্তবায়ন রয়েছে:

  1. পূর্ণসংখ্যার জন্য ( int, uint, longএবং ulong, অধ্যায় 7.11.1):
    তারা operands এবং অপারেটর, bitwise ফলাফলের গনা প্রয়োগ করা হয়, অর্থাত্ &, bitwise যৌক্তিক গনা বাস্তবায়ন হয় ANDইত্যাদি
  2. গণনার জন্য (chapter.১১.২ অধ্যায়):
    তারা গণনার অন্তর্নিহিত ধরণের লজিকাল অপারেশন সম্পাদনের জন্য প্রয়োগ করা হয়।
  3. বুলস এবং নালযোগ্য বালগুলির জন্য (অধ্যায় 7.11.3 এবং 7.11.4):
    বিটওয়াইজ গণনা ব্যবহার করে ফলাফল গণনা করা হয় না। ফলাফলটি মূলত দুটি অপারেন্ডের মানগুলির উপর ভিত্তি করে দেখা হয়, কারণ সম্ভাবনার সংখ্যা এত কম।
    যেহেতু উভয় মানই অনুসন্ধানের জন্য ব্যবহৃত হয়, এই প্রয়োগটি সংক্ষিপ্ত-সার্কিট নয়।

31
কিছু শূন্য হয় কিনা তা যাচাই করার জন্য এটি কার্যকরও হতে পারে। উদাহরণস্বরূপ: if(op != null && op.CanExecute())। কারণ দ্বিতীয় কারণটির মূল্যায়ন যখন প্রথম সত্য হয় না, এটি বৈধ this
টিজেহিউভেল

2
@ টিজেহিউভেল: এটি আমার ব্যবহারের সাথে বর্ণনা করে মূলত একই ব্যবহার TryGetValue। তবে হ্যাঁ, এটি এর আরও একটি ভাল উদাহরণ।
ড্যানিয়েল হিলগারথ

4
ভাল উত্তর. হয়তো আপনার কাছে একটি উদাহরণ যোগ করা উচিত কিভাবে &বা |(অর্থাত কি অপারেটার না) নতুন সকল ব্যক্তির সুবিধার জন্য অ bool, আর্গুমেন্ট সহ ব্যবহার করা হয়।
জাবাবা

81

এর অর্থ কী তা খুব স্পষ্টভাবে ব্যাখ্যা করার জন্য (যদিও অন্যান্য উত্তরগুলি এতে ইঙ্গিত দেয় - তবে সম্ভবত আপনি বুঝতে পারেন না এমন পরিভাষা ব্যবহার করুন)।

নিম্নলিখিত কোড:

if (a && b)
{
   Foo();
}

সত্যিই এটি সংকলিত হয়:

if (a)
{
    if (b)
    {
        Foo();
    }
}

যেখানে নীচের কোডটি ঠিক যেমনটি প্রতিনিধিত্ব করা হয়েছে তেমন সংকলিত হয়েছে:

if (a & b)
{
   Foo();
}

একে শর্ট সার্কিট বলে। সাধারণভাবে আপনার সর্বদা &&এবং ||আপনার অবস্থাতে ব্যবহার করা উচিত ।

বোনাস মার্কস: একটি দৃশ্য আছে যখন আপনার করা উচিত নয়। আপনি যদি এমন পরিস্থিতিতে থাকেন যেখানে কর্মক্ষমতা অত্যন্ত গুরুত্বপূর্ণ (এবং এটি ন্যানো সেকেন্ডের ক্রুশীয় ) কেবলমাত্র যখন আপনার অবশ্যই প্রয়োজন (যেমন nullপরীক্ষা করা) শর্ট সার্কিট ব্যবহার করুন - যেমন একটি শর্ট সার্কিট একটি শাখা / লাফ; যা আপনার সিপিইউতে একটি শাখা-ভুল ধারণা তৈরি করতে পারে; একটি &তুলনায় অনেক সস্তা &&। এমন একটি দৃশ্যও রয়েছে যেখানে শর্ট সার্কিট করা আসলে যুক্তি ভাঙ্গতে পারে - আমার এই উত্তরটি একবার দেখুন ।

ডায়িটারিবে / একাশি : শাখাটির ভুল-পূর্বাভাস সম্পর্কে যা সর্বাধিক সুখীভাবে উপেক্ষা করে। অ্যান্ডি ফ্রিথ (যিনি ১৩ বছর ধরে গেমসে কাজ করছেন) এর উদ্ধৃতি দিয়েছিলেন : "এটি নিম্ন স্তরের হতে পারে যা লোকেদের তাদের যেতে হবে বলে মনে করেন ... তবে তারা ভুল হতে পারে you're একটি বিশাল ডিগ্রিতে পারফরম্যান্সকে প্রভাবিত করে ... বেশিরভাগ প্রোগ্রামাররা তার প্রশংসা করতে পারে তার চেয়ে অনেক বেশি: হাজার কাটা দ্বারা মৃত্যু ""

  • গেম ডেভেলপাররা (এবং অন্যান্যরা চরম রিয়েল-টাইম অবস্থায় কাজ করে) ভবিষ্যদ্বাণীকে আরও ভালভাবে সাজানোর জন্য তাদের যুক্তি পুনর্গঠন করে। ডিসকম্পিল্ড এমস্কোরলিব কোডে এর প্রমাণও রয়েছে।
  • কেবল কারণ। নেট এই ধরণের জিনিস থেকে আপনাকে রক্ষা করে তার অর্থ এটি গুরুত্বপূর্ণ নয়। একটি শাখার ভুল পূর্বাভাস 60 হার্জেডে মারাত্মক ব্যয়বহুল; অথবা 10,000 অনুরোধ / সেকেন্ডে।
  • ভুল পূর্বাভাসের অবস্থান সনাক্ত করার জন্য ইন্টেলের কোনও সরঞ্জাম থাকবে না, উইন্ডোজের পক্ষে এটির জন্য পারফরম্যান্স কাউন্টার থাকবে না, বা সমস্যা না থাকলে এটি বর্ণনা করার জন্য কোনও শব্দও থাকবে না।
  • নিম্ন স্তর এবং আর্কিটেকচার সম্পর্কে অজ্ঞতা তাদের সম্পর্কে সচেতন এমন কাউকে ভুল করে না।
  • আপনি যে হার্ডওয়্যারটিতে কাজ করছেন তার সীমাবদ্ধতাটি সর্বদা বুঝতে চেষ্টা করুন।

অবিশ্বাসীদের জন্য এখানে একটি মাপদণ্ড রয়েছে। রিয়েলটাইম / হাইতে প্রক্রিয়াটি চালিয়ে যাওয়া শিডিয়ুলারের প্রভাবটি হ্রাস করার জন্য পরিচালনা করা ভাল: https://gist.github.com/1200737


7
"বোনাস চিহ্নগুলি" সম্পর্কে: আমরা সকলেই ভাল যা অকাল অপটিমাইজেশন থেকে আসে তা জানি। :)
একটি সিভিএন

6
@ মিশেল - এই কারণেই 'ন্যানো-সেকেন্ডের ক্রুশিয়াল' সাহসী :)। এএএ গেম ডেভেলপাররা সাধারণত এ জাতীয় স্টাফ নিয়ে উদ্বেগ প্রকাশ করে - এবং উত্তরগুলি কে পড়বে তা আপনি কখনই জানেন না; সুতরাং সীমান্তরেখা / চরম কেসগুলি নথিভুক্ত করা সর্বদা সেরা।
জোনাথন ডিকিনসন

1
সেই বোনাস চিহ্নটি কি সি # এর জন্য বৈধ? আমি ভাবিনি, এমএসআইএল যেমন ব্যাখ্যা করা হয়, যতক্ষণ না এক্সপ্রেশনটি ঠিক মেশিন কোড পর্যন্ত সংকলিত হয়।
জেরেমি ম্যাকগি

7
@ জেরেমি এমএসআইএল ব্যাখ্যা করা হয় না।
জোনাথন ডিকিনসন

2
@DD পুনরুদ্ধার উত্তর - আপনি কেন এই বিষয়ে উদ্বিগ্ন হবেন সে সম্পর্কে আমি একটি একাকীকরণ যুক্ত করেছি। এবং, অবগতির জন্য, (x && y)অনুবাদ LOAD x; BRANCH_FALSE; LOAD y; BRANCH_FALSE;যেখানে (x & y)আপনি অনুবাদ করে LOAD x; LOAD y; AND; BRANCH_FALSE;। একটি শাখা বনাম দুটি।
জোনাথন ডিকিনসন

68

লজিকাল অপারেটর ( ||এবং &&) বনাম বিটওয়াইড অপারেটর ( |এবং &)।

লজিকাল অপারেটর এবং বিটওয়াইস অপারেটরের মধ্যে সবচেয়ে গুরুত্বপূর্ণ পার্থক্যটি হ'ল লজিকাল অপারেটর দুটি বুলিয়ান গ্রহণ করে এবং একটি বুলিয়ান উত্পাদন করে যখন বিটওয়াইজ অপারেটর দুটি পূর্ণসংখ্যক গ্রহণ করে এবং একটি পূর্ণসংখ্যার উত্পাদন করে (দ্রষ্টব্য: পূর্ণসংখ্যার অর্থ কোনও ইনট্রিগাল ডেটা টাইপ, কেবল ইনট নয়)।

পেডেন্টিক হওয়ার জন্য, বিটওয়াস অপারেটর একটি বিট-প্যাটার্ন নেয় (উদাহরণস্বরূপ 01101011) এবং প্রতিটি বিটগুলিতে কিছুটা বুদ্ধিমান ও / অথবা করে। সুতরাং, উদাহরণস্বরূপ আপনার যদি দুটি 8-বিট পূর্ণসংখ্যা থাকে:

a     = 00110010 (in decimal:    32+16+2   = 50)
b     = 01010011 (in decimal: 64+   16+2+1 = 83)
----------------
a & b = 00010010 (in decimal:       16+2   = 18)
a | b = 01110011 (in decimal: 64+32+16+2+1 = 115)

যখন একটি লজিকাল অপারেটর কেবল এতে কাজ করে bool:

a      = true
b      = false
--------------
a && b = false
a || b = true

দ্বিতীয়ত, বুলের উপরে বিটওয়াস অপারেটর ব্যবহার করা প্রায়শই সম্ভব যেহেতু সত্য এবং মিথ্যা যথাক্রমে 1 এবং 0 এর সমান হয়, এবং এমনটি ঘটে যে আপনি যদি 1 এর সাথে সত্য এবং ভুলটিকে 0 তে অনুবাদ করেন তবে বিটওয়াইজ অপারেশন করুন, তারপরে অ-শূন্য রূপান্তর করুন if সত্য থেকে মিথ্যা এবং শূন্য থেকে মিথ্যা; এটি ঘটে যে আপনি যদি কেবলমাত্র লজিকাল অপারেটর ব্যবহার করেন (ব্যায়ামের জন্য এটি পরীক্ষা করে দেখুন) ফলাফলটি একই হবে।

আরেকটি গুরুত্বপূর্ণ পার্থক্যটি হ'ল লজিকাল অপারেটরটি স্বল্প-প্রচারিত হয় । সুতরাং, কিছু চেনাশোনাতে [1], আপনি প্রায়শই লোককে এই জাতীয় কিছু করতে দেখেন:

if (person && person.punch()) {
    person.doVictoryDance()
}

যা অনুবাদ করে: "যদি ব্যক্তি উপস্থিত থাকে (যেমন নাল নয়) তবে তাকে ঘুষি দেওয়ার চেষ্টা করুন, এবং যদি পাঞ্চ সফল হয় (যেমন সত্য ফিরে আসে), তবে বিজয় নৃত্য করুন"

আপনি যদি এর পরিবর্তে খানিকটা অপারেটর ব্যবহার করেন তবে এটি:

if (person & person.punch()) {
    person.doVictoryDance()
}

অনুবাদ করবে: "যদি ব্যক্তি উপস্থিত থাকে (যেমন নাল নয়) এবং পাঞ্চ সফল হয় (যেমন সত্য ফিরে আসে), তবে বিজয় নৃত্য করুন"

দ্রষ্টব্য যে সংক্ষিপ্ত-প্রচারিত লজিকাল অপারেটরে, person.punch()কোডটি নালার পরে চালানো যাবে না person। প্রকৃতপক্ষে, এই বিশেষ ক্ষেত্রে, দ্বিতীয় কোডটি যদি personনাল হয় তবে একটি নাল রেফারেন্স ত্রুটি তৈরি করে , যেহেতু এটি person.punch()ব্যক্তি নাল হোক না কেন তা কল করার চেষ্টা করে না। ডান অপারেণ্ডকে মূল্যায়ন না করার এই আচরণকে শর্ট সার্কিট বলে

[1] কিছু প্রোগ্রামার একটি ফাংশন কল রাখার জন্য বাউলক করবে যা একটি ifঅভিব্যক্তির অভ্যন্তরে পার্শ্ব প্রতিক্রিয়া রাখে , অন্যদের জন্য এটি একটি সাধারণ এবং খুব দরকারী বুদ্ধিমান।

যেহেতু বিটওয়াইজ অপারেটর একসাথে 32-বিটগুলিতে কাজ করে (যদি আপনি 32-বিট মেশিনে থাকেন), তবে আপনাকে যদি বিপুল সংখ্যক শর্তের তুলনা করার প্রয়োজন হয় তবে এটি আরও মার্জিত এবং দ্রুত কোডের দিকে নিয়ে যেতে পারে eg

int CAN_PUNCH = 1 << 0, CAN_KICK = 1 << 1, CAN_DRINK = 1 << 2, CAN_SIT = 1 << 3,
    CAN_SHOOT_GUNS = 1 << 4, CAN_TALK = 1 << 5, CAN_SHOOT_CANNONS = 1 << 6;

Person person;
person.abilities = CAN_PUNCH | CAN_KICK | CAN_DRINK | CAN_SIT | CAN_SHOOT_GUNS;

Place bar;
bar.rules = CAN_DRINK | CAN_SIT | CAN_TALK;

Place military;
military.rules = CAN_SHOOT_CANNONS | CAN_PUNCH | CAN_KICK | CAN_SHOOT_GUNS | CAN_SIT;

CurrentLocation cloc1, cloc2;
cloc1.usable_abilities = person_abilities & bar_rules;
cloc2.usable_abilities = person_abilities & military_rules;

// cloc1.usable_abilities will contain the bit pattern that matches `CAN_DRINK | CAN_SIT`
// while cloc2.usable_abilities will contain the bit pattern that matches `CAN_PUNCH | CAN_KICK | CAN_SHOOT_GUNS | CAN_SIT`

লজিকাল অপারেটরগুলির সাথে এটি করার জন্য একটি বিশ্রী পরিমাণের তুলনা প্রয়োজন:

Person person;
person.can_punch = person.can_kick = person.can_drink = person.can_sit = person.can_shoot_guns = true;
person.can_shoot_cannons = false;

Place bar;
bar.rules.can_drink = bar.rules.can_sit = bar.rules.can_talk = true;
bar.rules.can_punch = bar.rules.can_kick = bar.rules.can_shoot_guns = bar.rules.can_shoot_cannons = false;

Place military;
military.rules.can_punch = military.rules.can_kick = military.rules.can_shoot_guns = military.rules.can_shoot_cannons = military.rules.can_sit = true;
military.rules.can_drink = military.rules.can_talk = false;

CurrentLocation cloc1;
bool cloc1.usable_abilities.can_punch         = bar.rules.can_punch         && person.can_punch,
     cloc1.usable_abilities.can_kick          = bar.rules.can_kick          && person.can_kick,
     cloc1.usable_abilities.can_drink         = bar.rules.can_drink         && person.can_drink,
     cloc1.usable_abilities.can_sit           = bar.rules.can_sit           && person.can_sit,
     cloc1.usable_abilities.can_shoot_guns    = bar.rules.can_shoot_guns    && person.can_shoot_guns,
     cloc1.usable_abilities.can_shoot_cannons = bar.rules.can_shoot_cannons && person.can_shoot_cannons
     cloc1.usable_abilities.can_talk          = bar.rules.can_talk          && person.can_talk;

bool cloc2.usable_abilities.can_punch         = military.rules.can_punch         && person.can_punch,
     cloc2.usable_abilities.can_kick          = military.rules.can_kick          && person.can_kick,
     cloc2.usable_abilities.can_drink         = military.rules.can_drink         && person.can_drink,
     cloc2.usable_abilities.can_sit           = military.rules.can_sit           && person.can_sit,
     cloc2.usable_abilities.can_shoot_guns    = military.rules.can_shoot_guns    && person.can_shoot_guns,
     cloc2.usable_abilities.can_talk          = military.rules.can_talk          && person.can_talk,
     cloc2.usable_abilities.can_shoot_cannons = military.rules.can_shoot_cannons && person.can_shoot_cannons;

একটি শাস্ত্রীয় উদাহরণ যেখানে বিট-প্যাটার্নস এবং বিটওয়াইস অপারেটর ব্যবহৃত হয় তা ইউনিক্স / লিনাক্স ফাইল সিস্টেম অনুমতিগুলির মধ্যে।


3
পক্ষের জন্য +1 ইস্যুটিকে প্রভাবিত করে। অবাক হওয়ার আগে এর উল্লেখ করা হয়নি
কনরাড ফ্রিক্স

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

প্রয়োগের বিশদটি (সংক্ষিপ্ত-সিরকুট / পার্শ্ব প্রতিক্রিয়া) কার্যকর হওয়ার আগে অবশ্যই ফাংশনটি বুঝতে হবে। আপনি খুশি হয়েছিলেন যে বুলেয়ান বনাম পূর্ণসংখ্যার যুক্তি, শর্ট সার্কিট নয়, মূল পার্থক্যটি সাফ করলেন।
হেবল

@ বৃদ্ধাশ্রম - হিংসাত্মক, আমি আপনার সন্ন্যাসীকে দেওয়া বিড়ম্বনা পছন্দ করি। দুর্দান্ত কাজ
brumScouse

8

এর ব্যাপারে:

if (obj != null && obj.Property == true) { }

প্রত্যাশার মতো কাজ করবে

কিন্তু:

if (obj != null & obj.Property == true) { }

সম্ভাব্যভাবে একটি নাল রেফারেন্স ব্যতিক্রম ছুঁড়ে ফেলতে পারে।


2

সংক্ষিপ্ত এবং সাধারণ:

1 && 2= সত্য
কারণ
সি = 1 = সত্য (শূন্য নয়) সি তে
= সত্য (শূন্য নয়)

trueযৌক্তিকভাবে এ্যান্ডএস trueদিতে হবে true

কিন্তু

1 & 2= 0 = মিথ্যা
কারণ
বাইনারি
2 = 0010 বাইনারিতে 1 = 0001

দশমিকের মধ্যে 0000 = 0 দেওয়ার জন্য 0001 এন্ডস বিটওয়াইজ 0010 দিয়ে।

তেমনিভাবে || এবং | অপারেটররাও ...!


2
-1: আমরা এখানে সি # এর কথা বলছি ... সি # 1 && 2তে অবৈধ
ড্যানিয়েল হিলগারথ

তবে এটি একটি অত্যন্ত গুরুত্বপূর্ণ উদাহরণ যা আপনাকে কেবল & &&& (যা অনেক লোক মনে করে বলে) বিনিময় করতে পারে না তা ব্যাখ্যা করে ।
bobobobo

1

&&এর শর্ট সার্কিট সংস্করণ &

যদি আমরা মূল্যায়ন false & trueকরি তবে ফলাফলটি মিথ্যা হবে এমন প্রথম তর্কটি আমরা ইতিমধ্যে দেখেছি। &&অপারেটর সংস্করণ যত তাড়াতাড়ি এটা করতে পারেন ফলে ফিরে আসবো, বরং পুরো অভিব্যক্তি নির্ণয় করা। |অপারেটরের একটি অনুরূপ ভার্শন আছে ||,।


1
if (list.Count() > 14 && list[14] == "foo")

নিরাপদ

if (list.Count() > 14 & list[14] == "foo")

তালিকার সঠিক আকার না থাকলে ক্রাশ হবে।


আমি কল্পনাও করতে পারি না যে কেউ "যদি (list.Count ()> 14 & list [14] ==" foo ")" "এর পরিবর্তে" if (list.Count ()> 14 && list [14] == "লিখতে পারে foo বিন্যাস ")"। & কেবলমাত্র এবং স্বাভাবিকভাবেই এই ক্ষেত্রে && এর জন্য ব্যবহার করা যায় না এমনকি যদি & এর অবশ্যই নিরাপদ থাকে (উদাহরণস্বরূপ [1] তালিকা)।
টিয়েন

1

সি # অপারেটরদের ব্যাখ্যা করা উচিত কেন:

মূলত দুটি &'গুলি |' এর অর্থ হ'ল এটি যৌক্তিকের চেয়ে শর্তযুক্ত, সুতরাং আপনি উভয়ের মধ্যে পার্থক্য বলতে পারবেন।

& অপারেটরের একটি ব্যবহারের উদাহরণ রয়েছে&


উভয় লিঙ্কই (কার্যকরভাবে) ভাঙ্গা হয়েছে ( "ভিজ্যুয়াল স্টুডিও 2005 অবসরপ্রাপ্ত ডকুমেন্টেশন" এ পুনঃনির্দেশ )।
পিটার মর্টেনসেন

1

ঠিক আছে, মুখের মান অনুসারে

    Boolean a = true;
    Boolean b = false;

    Console.WriteLine("a({0}) && b({1}) =  {2}", a, b, a && b);
    Console.WriteLine("a({0}) || b({1}) =  {2}", a, b, a || b);
    Console.WriteLine("a({0}) == b({1}) =  {2}", a, b, a == b);

    Console.WriteLine("a({0}) & b({1}) =  {2}", a, b, a & b);
    Console.WriteLine("a({0}) | b({1}) =  {2}", a, b, a | b);
    Console.WriteLine("a({0}) = b({1}) =  {2}", a, b, a = b);

একই উত্তর উত্পাদন। তবে, আপনি যেমনটি দেখিয়েছিলেন, আপনার যদি আরও জটিল প্রশ্ন থাকে তবে:

if (a and b and c and d) ..

যদি aএটি সত্য না হয় এবং হতে পারে bএমন কোনও ফাংশন যেখানে এটি বন্ধ করতে হবে, কোনও কিছুর সাথে সংযুক্ত হতে হবে, এটি পান, এটি করুন, সিদ্ধান্ত নিন .. কেন বিরক্ত করবেন? সময়ের অপচয়, আপনি জানেন যে এটি ইতিমধ্যে ব্যর্থ। কেন মেশিনটি বন্ধ করে দেওয়া এবং অতিরিক্ত অর্থহীন কাজ করা উচিত?

আমি সর্বদা ব্যবহার করেছি &&কারণ যখন আমি কোনও ব্যর্থতা নেই তখন এগিয়ে যাওয়ার আগে প্রথমে ব্যর্থ হওয়ার সম্ভাবনা কম রাখি er যদি কম সম্ভাব্য পছন্দগুলির পূর্বাভাস দেওয়ার কোনও উপায় না থাকে যেমন আপনার কাছে ডেটা আউটপুট সীমাবদ্ধ করার জন্য একটি বুলিয়ান রয়েছে, যেমন:

if (limit && !MyDictionary.ContainsKey("name")) 
    continue;

যদি তা না হয় limitতবে কীটি পরীক্ষা করতে বিরক্ত করবেন না, এতে বেশি সময় লাগতে পারে ..


1

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

তবে যদি প্রকাশিত বা এড বা এডি-এর একত্রে পার্শ্ব প্রতিক্রিয়া থাকে এবং আপনি চান যে এই সমস্তগুলি আপনার অভিব্যক্তির ফলাফল হিসাবে ঘটে (যৌক্তিক প্রকাশের ফলাফল নির্বিশেষে) &এবং তখন |ব্যবহার করা যেতে পারে। বিপরীতে, &&এবং ||অপারেটরগুলি অবাঞ্ছিত পার্শ্ব প্রতিক্রিয়াগুলির বিরুদ্ধে রক্ষক হিসাবে কার্যকর হতে পারে (যেমন একটি নাল পয়েন্টার যার ফলে ব্যতিক্রম ছোঁড়াতে পারে)।

অপারেটরগুলিও পূর্ণসংখ্যার সাথে ব্যবহার করা যেতে পারে &এবং এক্ষেত্রে |তারা একটি পূর্ণসংখ্যার ফলাফল উত্পন্ন করে যা বিট স্তরে দুটি অপারেশন এবং এড বা বা এড একসাথে হয়। এটি কার্যকর হতে পারে যখন কোনও পূর্ণসংখ্যা মানের বাইনারি বিটগুলি সত্য এবং মিথ্যা মানগুলির অ্যারে হিসাবে ব্যবহৃত হয়। একটি নির্দিষ্ট বিট চালু বা বন্ধ রয়েছে কিনা তা পরীক্ষা করতে, একটি বিট-মাস্কটি মান সহ বিটওয়াস এবং এড হয়। কিছুটা চালু করতে, একই মুখোশটি মান সহ বিটওয়াইস বা এড করা যেতে পারে। অবশেষে কিছুটা বন্ধ করার জন্য, ~একটি মাস্কের বিটওয়াস পরিপূরক (ব্যবহার করে ) মান সহ বিটওয়াইস এবং এড হয়।

int a = 0; // 0 means all bits off
a = a | 4; // set a to binary 100
if ((a & 4) != 0) {
    // will do something
}
a = a & (~4) // turn bit off again, a is now 000

সি # ব্যতীত অন্য ভাষাগুলিতে, & এবং | এর বিটওয়াইজ বিপরীতে লজিক্যাল বনামের সাথে যত্ন নিতে হবে। উপরের কোডে, ifবিবৃতিটির শর্তসাপেক্ষ প্রকাশটি (a & 4) != 0এই শর্তটি প্রকাশ করার একটি নিরাপদ উপায়, তবে অনেক সিতে ভাষার মতো শর্তযুক্ত বিবৃতি শূন্যের পূর্ণসংখ্যার মানকে মিথ্যা এবং শূন্য-শূন্য পূর্ণসংখ্যার মান হিসাবে সত্য হিসাবে বিবেচনা করতে পারে। (এর কারণ শর্তাধীন শাখা প্রসেসরের নির্দেশাবলী উপলভ্য, এবং প্রতিটি পূর্ণসংখ্যার ক্রিয়াকলাপের পরে আপডেট হওয়া শূন্য পতাকার সাথে তাদের সম্পর্ক সম্পর্কিত)) সুতরাং ìfশূন্যের জন্য বিবৃতিটির পরীক্ষাটি সরানো যেতে পারে এবং শর্তটি ছোট করা যেতে পারে (a & 4)

বিটওয়াইজ এবং অপারেটর রিটার্ন মানগুলি ব্যবহার করে যা এই লাইনটিকে বিট না করে ব্যবহার করে একত্রিত হয়ে এক্সপ্রেশনগুলি বিভ্রান্তি এবং এমনকি সমস্যা তৈরি করতে পারে। নীচের উদাহরণটি বিবেচনা করুন যেখানে দুটি ফাংশনের পার্শ্ব-প্রতিক্রিয়াগুলি পছন্দসই হয়েছে, তা পরীক্ষা করার আগে তারা উভয় সফল হয়েছিল (তাদের দ্বারা নির্ধারিত হিসাবে শূন্য-মান প্রদান করে):

if (foo() & bar()) {
    // do something
}

সি-তে, যদি foo()1 প্রদান করে এবং bar()2 ফেরত দেয় 1 & 2তবে শূন্য হওয়ায় "কিছু" করা হবে না ।

সি # এর শর্তসাপেক্ষ বিবৃতি প্রয়োজন যেমন ifএকটি বুলিয়ান ওপ্র্যান্ড থাকে এবং ভাষাটি কোনও পূর্ণসংখ্যার মানকে বুলিয়ান মানে ফেলে দিতে দেয় না। সুতরাং উপরের কোডটি সংকলক ত্রুটি তৈরি করবে। এটি আরও সঠিকভাবে নিম্নলিখিত হিসাবে প্রকাশ করা হবে:

if (foo() != 0 & bar() != 0) {
    // do something
}

1

আপনি যদি ওল্ড-টাইমার সি প্রোগ্রামার হন তবে সাবধান হন । সি # আমাকে সত্যিই অবাক করেছে।

এমএসডিএন| অপারেটরের জন্য বলে :

বাইনারি | অপারেটরগুলি ইন্টিগ্রাল টাইপ এবং বুলের জন্য পূর্বনির্ধারিত । অবিচ্ছেদ্য ধরণের জন্য, | এর অপারেশনগুলির বিটওয়াইয়া OR এর গণনা করে। বুল অপারেন্ডসের জন্য, | এর অপারেশনগুলির লজিক্যাল ওআর গণনা করে; এটি হ'ল, ফলাফলটি মিথ্যা এবং যদি কেবলমাত্র এর দুটি অপরেশনই মিথ্যা থাকে।

(জোর দেওয়া আমার।) বুলিয়ান প্রকারগুলি বিশেষভাবে পরিচালনা করা হয়, এবং এই প্রসঙ্গে প্রশ্নটি কেবল অর্থবোধ করতে শুরু করে, এবং পার্থক্যটি, যেমনটি তাদের উত্তরগুলিতে ইতিমধ্যে সমাপ্ত হয়েছে:

&&এবং ||শর্ট সার্কিট হয়। &এবং উভয় অপারেশন |মূল্যায়ন ।

এবং যা পছন্দনীয় তা পার্শ্ব-প্রতিক্রিয়া, কর্মক্ষমতা এবং কোড পাঠযোগ্যতার মতো অনেক বিষয়ের উপর নির্ভর করে তবে সাধারণত শর্ট সার্কিটকারী অপারেটররাও পছন্দনীয় কারণ তারা আমার মতো অনুরূপ ব্যাকগ্রাউন্ডের লোকেরা আরও ভাল বোঝে।

কারণটি হ'ল: আমি |এটির মতো যুক্তি দেব: যেহেতু সি তে কোনও আসল বুলিয়ান টাইপ নেই, আপনি বিটওয়াইস অপারেটরটি ব্যবহার করতে পারেন এবং এর ফলাফলটি যদি কোনও শর্তে সত্যবাদী বা মিথ্যা হিসাবে মূল্যায়ন করতে পারেন। তবে এটি সি # এর জন্য ভুল দৃষ্টিভঙ্গি, কারণ ইতিমধ্যে বুলিয়ান ধরণের ক্ষেত্রে একটি বিশেষ মামলা রয়েছে।


0

এটি গুরুত্বপূর্ণ, কারণ যদি বুল 2 (উদাহরণস্বরূপ) মূল্যায়নের ব্যয় বেশি হয় তবে বুল 1 মিথ্যা হয়, তবে আপনি && ওভার ব্যবহার করে নিজেকে মোটামুটি গণনা সংরক্ষণ করেছেন


0

কারণ &&এবং ঠিক যেমন প্রবাহ নিয়ন্ত্রণের|| জন্য ব্যবহৃত হয়। এটি সর্বদা শর্তসাপেক্ষ সম্পর্কে নয়। নিম্নলিখিত বা শর্তসাপেক্ষ হিসাবে নয় , বিবৃতি হিসাবে লেখার পক্ষে এটি সম্পূর্ণ যুক্তিযুক্ত :if/elseifwhile

 a() && b() && c() && d();

অথবা এমনকি

 w() || x() || y() || z();

এটি কেবল সমমানের if/elseসংস্করণগুলির চেয়ে বেশি টাইপ করা সহজ নয় ; তারা পড়া এবং বুঝতে খুব সহজ।


0

&& এবং & এর অর্থ দুটি খুব আলাদা জিনিস এবং আপনাকে দুটি পৃথক উত্তর দেয়।

1 && 21 ("সত্য")
1 & 2ফলন দেয় 0 ("মিথ্যা")

&&একটি লজিক অপারেটর - এর অর্থ "যদি উভয় অপারেন্ড সত্য হয় তবে"
&সামান্য দিকের তুলনা। এর অর্থ "আমাকে বলুন যে দুটি বিপরীতে কোন বিট সেট করা আছে"


2
প্রশ্নটি সি # নিয়ে। সি # তে, কোনও সংখ্যাগুলিতে বোল দেওয়ার কোনও উপায় নেই, সুতরাং 0 টি 'মিথ্যা' নয় এবং ননজারো 'সত্য' নয়; এখানে কোনও সমতা নেই।
নেট সি কে

সংখ্যাকে বুলে রূপান্তর করতে, 1 এর অর্থ সত্য এবং 0 টির অর্থ মিথ্যা, "এন! = 0" বলুন (আমি ধরে নিচ্ছি ... আমি সি # এর সাথে আসলেই পরিচিত নই)। আসলে আমি এই মন্তব্যটি প্রত্যাহার করতে চেয়েছিলাম কারণ এটি ভালভাবে গবেষণা করা হয়নি এবং আমি মনে করি না যে এটি আগের মন্তব্যটির সাথে এখনই সহায়ক বা সত্যই প্রাসঙ্গিক যে আমি এটি সম্পর্কে আরও বেশি চিন্তা করি, তবে আমি দুর্ঘটনাক্রমে এন্টার টিপে চলেছি এবং এখন আমি ভাবতে পারি না যে আমি পারব এটিকে বাতিল করুন তাই এখানে যান, এটির মূল্য যাই হোক না কেন তার জন্য :-)
ডন হ্যাচ

1 && 2একটি সংকলক ত্রুটি দেয়: "ত্রুটি 4 অপারেটর 'এবং&' 'int' এবং 'int' টাইপের অপারেন্ডগুলিতে প্রয়োগ করা যায় না"
পিটার মর্টেনসেন

0

এই লোকেদের কাছে এটি ব্যাখ্যা করার দ্রুততম (এবং কিছুটা নিচে নামিয়ে দেওয়া) উপায় যা এই কোডটি করার সময় কোডটির সঠিক ক্রিয়াকলাপগুলি জানার প্রয়োজন হয় না তা হ'ল

&& সমস্ত শর্তগুলির একটি চেক করছে যতক্ষণ না এটি একটি মিথ্যা খুঁজে পায় এবং পুরো ফলাফলটিকে মিথ্যা হিসাবে ফিরিয়ে দেয়

|| যতক্ষণ না এটি সত্য খুঁজে পায় এবং পুরো ফলাফলটিকে সত্য হিসাবে প্রত্যাবর্তন করে ততক্ষণ এই শর্তগুলির প্রত্যেকটিতে একটি চেক করা হয় ।

এবং সমস্ত শর্তাদি এবং ফলাফলের সাথে মোকাবিলা করে ম্যাথস ভিত্তিক আপন আপন করে দিচ্ছেন।

| পরিস্থিতি উভয়ই / সকলের ক্ষেত্রে ম্যাথস ভিত্তিক আপন করে চলেছে এবং ফলাফলটি ডিল করছে।

আমি কখনই এমন একটি পয়েন্টটি পাইনি যেখানে আমার & বা | ব্যবহার করার দরকার পড়ে যদি একটি বিবৃতি মধ্যে। আমি বেশিরভাগ ক্ষেত্রে বিটওয়াস শিফট ব্যবহার করে এর উপাদান রঙগুলিতে হেক্সাডেসিমাল মানগুলি কাটতে ব্যবহার করি।

উদাহরণ:

r = fullvalue >> 0xFF & 0xFF;
g = fullvalue >> 0xF & 0xFF;
b = fullvalue & 0xFF;

এই অপারেশনের মধ্যে "& 0xFF" কেবল বাইনারি মানটি দেখতে বাধ্য করছে cing | ব্যক্তিগতভাবে আমি এর জন্য কোনও ব্যবহার খুঁজে পাইনি তবুও।


0

কেবল,

if exp1 && exp2

এক্সপ 1 যদি এক্সপ 2 flase চেক করে না

কিন্তু

if exp1 & exp2

যদি exp1 হয় falseবা true চেক এক্সপো 2

এবং কদাচিৎ লোকেরা ব্যবহার করে &কারণ তারা খুব কমই এক্সপ 1 হয় কিনা এক্সপ 2 পরীক্ষা করতে চায়false

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