বুলিয়ান অপারেটরগুলির মধ্যে পার্থক্য: & বনাম && এবং | বনাম ||


উত্তর:


134

এগুলি হ'ল বিটওয়াইস এবং বিটওয়াইস বা অপারেটর।

int a = 6; // 110
int b = 4; // 100

// Bitwise AND    

int c = a & b;
//   110
// & 100
// -----
//   100

// Bitwise OR

int d = a | b;
//   110
// | 100
// -----
//   110

System.out.println(c); // 4
System.out.println(d); // 6

জাভা ল্যাঙ্গুয়েজ স্পেসে ( 15.22.1 , 15.22.2) উপযুক্ত বিভাগটি নির্দেশ করার জন্য কার্লোসকে ধন্যবাদ এর ইনপুটগুলির উপর ভিত্তি করে অপারেটরের বিভিন্ন আচরণ সম্পর্কে ) ।

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

if((a != null) && (a.something == 3)){
}

এটি হবে না:

if((a != null) & (a.something == 3)){
}

"শর্ট সার্কিট" অর্থ অপারেটর অগত্যা সমস্ত শর্ত পরীক্ষা করে না। উপরোক্ত উদাহরণগুলিতে, &&দ্বিতীয় শর্তটি কেবল তখনই পরীক্ষা করবে যখন aনা হয় null(অন্যথায় পুরো বিবৃতিটি মিথ্যা প্রত্যাবর্তন করবে এবং যে কোনও উপায়ে নিম্নলিখিত শর্তগুলি পরীক্ষা করা হবে), সুতরাং এর বিবৃতি a.somethingব্যতিক্রম বাড়াবে না, বা "নিরাপদ" হিসাবে বিবেচিত হবে । "

&অপারেটর সবসময় দফা প্রতিটি শর্ত পরীক্ষা করে, তাই উপরের উদাহরণগুলোতে এ, a.somethingমূল্যায়ন করা হতে পারে aএকটা সত্য হয় nullমান, একটি ব্যতিক্রম উত্থাপন।


1
স্পষ্ট করতে চেয়েছিলেন .. এবং দু'জন 1 হলেই 1 ফিরবেন? তাহলে 101 এবং 001 হবে 001? রাইট?
জিডিয়ন

@ জিডি @ জোনাথন - সেই পরিস্থিতি আরও ভাল করে দেখানোর জন্য আমি আমার মানগুলি আপডেট করেছি।
জাস্টিন নিসনার

অসম্পূর্ণ: তারাও লজিগাল অপারেটর (বুলিয়ানদের জন্য)।
ব্যবহারকারী 85421

1
@ কার্লোস- না They তারা এখনও বিটওয়াইড অপারেটর। তারা কেবল অ-শর্ট সার্কিট লজিকাল অপারেটরগুলির মতোই আচরণ করে। পার্থক্য আছে.
জাস্টিন নিসনার 13

4
এবং নন-শর্ট সার্কিটিং লজিকাল অপারেটরগুলি কী কী? অপারেটরগুলি এবং এবং | (ওপি দ্বারা জিজ্ঞাসিত) হলেন "ইন্টিজার বিটওয়াইজ অপারেটর" (জেএলএস 15.22.1) এবং "বুলিয়ান লজিকাল অপারেটর" (জেএলএস 15.22.2)। বা জাভা ভাষা নির্দিষ্টকরণ সম্পর্কে ভুল?
ব্যবহারকারী 85421

108

আমি মনে করি আপনি উভয় অপারেটরের যৌক্তিক অর্থ সম্পর্কে কথা বলছেন, এখানে আপনার একটি টেবিল-জীবনবৃত্তান্ত রয়েছে:

boolean a, b;

Operation     Meaning                       Note
---------     -------                       ----
   a && b     logical AND                    short-circuiting
   a || b     logical OR                     short-circuiting
   a &  b     boolean logical AND            not short-circuiting
   a |  b     boolean logical OR             not short-circuiting
   a ^  b     boolean logical exclusive OR
  !a          logical NOT

short-circuiting        (x != 0) && (1/x > 1)   SAFE
not short-circuiting    (x != 0) &  (1/x > 1)   NOT SAFE

শর্ট-সার্কিট মূল্যায়ন , ন্যূনতম মূল্যায়ন, বা ম্যাকার্থি মূল্যায়ন (জন ম্যাকার্থির পরে) কিছু প্রোগ্রামিং ভাষায় কিছু বুলিয়ান অপারেটরদের শব্দার্থবিজ্ঞান যেখানে দ্বিতীয় যুক্তিটি কার্যকর করা হয় বা মূল্যায়ন করা হয় কেবল যদি প্রথম যুক্তিটির মান নির্ধারণের জন্য যথেষ্ট না হয় অভিব্যক্তি: যখন অ্যান্ড ফাংশনটির প্রথম যুক্তিটি মিথ্যাতে মূল্যায়ন করে, সামগ্রিক মানটি অবশ্যই মিথ্যা হবে; এবং যখন ফাংশনটির প্রথম যুক্তিটি সত্যের কাছে মূল্যায়ন করে, সামগ্রিক মানটি অবশ্যই সত্য হয় be

নিরাপদ নয় মানে অপারেটর সর্বদা ধারাটির প্রতিটি শর্ত পরীক্ষা করে, সুতরাং উপরের উদাহরণগুলিতে 1 / এক্সকে মূল্যায়ন করা যেতে পারে যখন এক্স ব্যতীত, 0 মান হয়।


1
@ টরেস - "শর্ট সার্কিট" এবং "নিরাপদ" ব্যাখ্যা করে আপনার উত্তরটি প্রসারিত করুন। এছাড়াও "এক্সক্লুসিভ বা" এবং "যৌক্তিক নয়" এছাড়াও "শর্ট সার্কিট নয়"? এবং কেন এটি "বুলিয়ান লজিকাল নয়" এর পরিবর্তে "লজিকাল নয়" বলা হয়? এবং কেন "যৌক্তিক নয়" "যৌক্তিক AND" এবং "লজিকাল OR" এর সাথে গোষ্ঠীযুক্ত নয়? ভাল উত্তর কিন্তু কাজ প্রয়োজন।
tfmontague

@ টিএমএমটিগ, আমি শর্ট সার্কিটের অর্থ কী তা ব্যাখ্যা করেছি (এই উত্তরটি সম্পাদনা করে) .. আমার সম্পাদনাটি "পিয়ার পর্যালোচনা" হওয়ার জন্য অপেক্ষা করছে।
তাসলিম ওসেনি

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

26

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

লজিকাল এবং: লজিকাল অ্যান্ড (ওরফে শর্তসাপেক্ষে AND) && অপারেটর ব্যবহার করে । এটি স্বল্প সংকীর্ণ অর্থ: যদি বাম অপারেন্ডটি মিথ্যা হয় তবে ডান অপারেন্ডকে মূল্যায়ন করা হবে না।
উদাহরণ:

int x = 0;
if (false && (1 == ++x) {
    System.out.println("Inside of if");
}
System.out.println(x); // "0"

উপরের উদাহরণে x এর কনসোলে মুদ্রিত মান 0 হবে, কারণ if স্টেটমেন্টের প্রথম অপারেন্ডটি মিথ্যা, সুতরাং জাভা গণনা করার প্রয়োজন নেই (1 == ++ x) সুতরাং এক্স গুণনা করা হবে না।

Bitwise এবং: bitwise ও ব্যবহার করে & অপারেটর। এটি মানটির উপরে বিটওয়াইজ অপারেশনটি ব্যবহার করতে ব্যবহৃত হয়। বাইনারি সংখ্যার অপারেশন দেখে কী চলছে তা দেখতে অনেক সহজ:

int a = 5;     //                    5 in binary is 0101
int b = 12;    //                   12 in binary is 1100
int c = a & b; // bitwise & preformed on a and b is 0100 which is 4

উদাহরণস্বরূপ আপনি দেখতে পাচ্ছেন, যখন 5 এবং 12 সংখ্যার বাইনারি উপস্থাপনাগুলি রেখাযুক্ত থাকে, তখন কিছুটা বিস্মৃত হয় এবং পূর্বনির্ধারিত কেবল একটি বাইনারি সংখ্যা তৈরি করে যেখানে উভয় সংখ্যার একই অঙ্কের 1 থাকে। সুতরাং 0101 এবং 1100 == 0100. দশমিক কোনটি 5 এবং 12 == 4।

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

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

int x = 0;
if (false & (1 == ++x) {
    System.out.println("Inside of if");
}
System.out.println(x); //"1"

এখন যখন স্টেটমেন্টটি চালানো হয় তখন বাম অপারেন্ডটি মিথ্যা হলেও অভিব্যক্তি (1 == ++ x) কার্যকর করা হবে। সুতরাং এক্স এর জন্য মুদ্রিত মানটি 1 হবে কারণ এটি বৃদ্ধি পেয়েছে।

এটি লজিক্যাল ওআর (||), বিটওয়াইস ওআর (|) এবং বুলিয়ান ওআর (|) এর ক্ষেত্রেও প্রযোজ্য আশা করি এটি কিছু বিভ্রান্তি দূর করে।


to preform that bitwise AND, it must know the value of both left and right operandsএটি আমার কাছে ঠিক শোনাচ্ছে না। একটি সম্পাদন করার জন্য BITWISE ANDআপনাকে বাম অপারেন্ড হলে ফলাফলটি বের করতে সক্ষম হতে ডান অপারেণ্ড জানতে হবে না FALSE। আপনি যা ব্যাখ্যা করেছেন তা সঠিক, তবে আপনি যে যুক্তিটি বলেছেন তা কমপক্ষে আমার কাছে মনে হয় না
কোরাই তুগাই

7

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


7
-1 ওপিকে তিনি ইতিমধ্যে কী জানতেন এবং আসলে তিনি যে প্রশ্নটি করেছিলেন সেটির উত্তর না দেওয়ার জন্য।
Alnitak

5

এবং এবং | &&& এর মতো একই ফলাফল সরবরাহ করে অপারেটর। পার্থক্যটি হ'ল তারা সর্বদা প্রকাশের উভয় দিকই মূল্যায়ন করে যেখানে && এবং || প্রথম শর্তটি ফলাফল নির্ধারণের জন্য পর্যাপ্ত কিনা তা মূল্যায়ন করা বন্ধ করুন।


1
ভুল .... এর জন্য &&এটি উভয় ফলাফলকে মূল্যায়ন করে যখন ||প্রথম শর্তটি সত্য হলে কেবল ফেরত দেয়।
বুহাকে সিন্ধি

1
তাই না? && কেবলমাত্র তখনই ভাবের ডান হাতের মূল্যায়ন করে যদি বাম পাশের পক্ষটি ইতিমধ্যে সত্যের কাছে মূল্যায়ন করে। অন্যথায় এটি প্রথম মিথ্যা জড়িত হিসাবে মূল্যায়ন করা বন্ধ করে দেয় ফলাফলটি সত্য হতে পারে না। দেখুন jguru.com/faq/view.jsp?EID=16530
ব্রায়ান স্কট

1
( 2 & 4 )মূল্যায়ন false, যেখানে ( 2 && 4 )মূল্যায়ন true। ঠিক কীভাবে একই ফলাফল?
পিসকভোর

1
@ পিসকভোর - জাভাতে নেই! 2 & 4একটি পূর্ণসংখ্যার ফলাফল, একটি বুলিয়ান নয় (এক্ষেত্রে শূন্য)। 2 && 4সংকলন করবে না, && কেবল বুলেটগুলি গ্রহণ করবে। জাভা বুলেট এবং অন্তর্নিহিত মিশ্রণের অনুমতি দেয় না: শূন্য নয় false, falseশূন্য নয় ...
ব্যবহারকারী 85421

1
@ বুহাকেসিন্ডি ভুল জন্য &&এটি শুধুমাত্র দ্বিতীয় প্রতীক মূল্যায়ণ যদি প্রথম প্রতীক হয় true
লার্নের মারকুইস

2

জাভাতে, একক অপারেটরগুলি &; |, ^,! অপারেশন উপর নির্ভর করে। যদি উভয় অপারেন্ডগুলি ইনট হয় তবে একটি বিটওয়াস অপারেশন করা হয়। যদি উভয়ই বুলিয়ান হয় তবে একটি "লজিকাল" অপারেশন করা হয়।

উভয় অপারেশন মিল না থাকলে একটি সংকলন সময় ত্রুটি নিক্ষেপ করা হয়।

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

যদি ((a <0) && (খ <0)) {...} বা একইভাবে, যদি ((a <0) || (খ <0)) {...}

উত্স: জাভা প্রোগ্রামিং ল্যাং 4 র্থ সংস্করণ


1

&এবং |অবিচ্ছেদ্য ধরনের bitwise অপারেটরদের (যেমন হয় int): http://download.oracle.com/javase/tutorial/java/nutsandbolts/op3.html

&&এবং ||কেবল বুলিয়ানগুলিতে পরিচালনা করুন (এবং শর্ট সার্কিট, যেমন অন্যান্য উত্তর ইতিমধ্যে বলেছে)।


3
&এবং |বুলিয়ান প্রকারের বুলিয়ান অপারেটরগুলিও।
লার্নের মারকুইস

1

সম্ভবত এটি জেনে রাখা দরকারী যে বিটওয়াইস এবং বিটওয়াইজ বা অপারেটরগুলি সর্বদা শর্তসাপেক্ষে এবং শর্তসাপেক্ষে একই অভিব্যক্তিতে ব্যবহৃত হওয়ার আগে মূল্যায়ন করা হয়।

if ( (1>2) && (2>1) | true) // false!

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

1

&&; || লজিকাল অপারেটরগুলি .... শর্ট সার্কিট

&; | বুলিয়ান লজিকাল অপারেটরগুলি .... নন-শর্ট সার্কিট

অভিব্যক্তিগুলিতে মৃত্যুদণ্ড কার্যকর করার ক্ষেত্রে পার্থক্যে চলে যাওয়া। বিটওয়াইজ অপারেটরগুলি বাম দিকের ফলাফল নির্বিশেষে উভয় পক্ষকে মূল্যায়ন করে। লজিকাল অপারেটরগুলির সাথে এক্সপ্রেশন মূল্যায়নের ক্ষেত্রে ডান হাতের অভিব্যক্তিটির মূল্যায়ন বাম হাতের অবস্থার উপর নির্ভরশীল।

উদাহরণ স্বরূপ:

int i = 25;
int j = 25;
if(i++ < 0 && j++ > 0)
    System.out.println("OK");
System.out.printf("i = %d ; j = %d",i,j);

এটি i = 26 মুদ্রণ করবে; j = 25, প্রথম শর্তটি মিথ্যা হওয়ায় ডান হাতের শর্তটি বাইপাস করা হয় কারণ ডান হাতের অবস্থা নির্বিশেষে ফলজ যাই হোক না কেন মিথ্যা। (শর্ট সার্কিট)

int i = 25;
int j = 25;
if(i++ < 0 & j++ > 0)
    System.out.println("OK");
System.out.printf("i = %d ; j = %d",i,j);

তবে, এটি i = 26 মুদ্রণ করবে; ঞ = 26,


0

যদি বুলিয়ান এবং অপারেটরের সাথে জড়িত কোনও অভিব্যক্তি মূল্যায়ন করা হয় তবে উভয় অপারেশনকে মূল্যায়ন করা হবে। তারপরে অপারেটরটি অপারেন্ডে প্রয়োগ করা হয়।

যখন && অপারেটর জড়িত একটি অভিব্যক্তি মূল্যায়ন করা হয়, প্রথম অপারেন্ড মূল্যায়ন করা হয়। প্রথম অপারেন্ডটি যদি মিথ্যা হিসাবে মূল্যায়ন করে তবে দ্বিতীয় অপারেন্ডের মূল্যায়ন এড়িয়ে যায়।

প্রথম অপারেন্ড যদি সত্যের মান দেয় তবে দ্বিতীয় অপারেন্ডকে মূল্যায়ন করা হয়। দ্বিতীয় অপারেন্ড যদি সত্যের মান দেয় তবে && অপারেটরটি প্রথম এবং দ্বিতীয় অপারেন্ডগুলিতে প্রয়োগ করা হয়।

জন্য অনুরূপ এবং ||


0

যদিও মূল পার্থক্যটি এটি &বেশিরভাগ বিটওয়াইজ অপারেশনের জন্য ব্যবহৃত হয় long, intবা byteযেখানে এটি কোনও মুখোশের ধরণের জন্য ব্যবহার করা যেতে পারে, আপনি যুক্তিযুক্ত পরিবর্তে এটি ব্যবহার করলেও ফলাফলগুলি পৃথক হতে পারে &&

কিছু পরিস্থিতিতে পার্থক্যটি আরও লক্ষণীয়:

  1. কিছু এক্সপ্রেশন মূল্যায়ন সময় সাপেক্ষ
  2. পূর্বের সত্যটি যদি সত্য হয় তবেই কোনওটির এক্সপ্রেশন মূল্যায়ন করা সম্ভব
  3. এক্সপ্রেশনগুলির কিছু পার্শ্ব-প্রতিক্রিয়া রয়েছে (উদ্দেশ্যযুক্ত বা না)

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

দ্বিতীয় দফার জন্য, এই উদাহরণটি দেখুন:

if ((a != null) & (a.isEmpty()))

এটি ব্যর্থ হয় null, হিসাবে দ্বিতীয় এক্সপ্রেশন মূল্যায়নের একটি NullPointerException। লজিকাল অপারেটর &&অলস, যদি বাম অপারেন্ডটি মিথ্যা হয় তবে ডান অপারেন্ডটি যাই হোক না কেন ফলটি মিথ্যা।

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

if (departmentDao.update(department, newBuilding) & buildingDao.remove(building))

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

হিসাবে a || bএটি সমতুল্য !(!a && !b), এটি যদি aসত্য হয় তবে এটি বন্ধ হয়ে যায়, আর কোনও ব্যাখ্যাের প্রয়োজন নেই।

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