জাভা এবং && এর মধ্যে পার্থক্য কী?


167

আমি সর্বদা ভেবেছিলাম যে &&জাভাতে অপারেটর দুটি তার বুলিয়ান অপারেন্ডস কিনা তা যাচাই করার জন্য ব্যবহৃত হয় trueএবং &অপারেটরটি দুটি পূর্ণসংখ্যার প্রকারে বিট-ওয়াইজ অপারেশন করতে ব্যবহৃত হয়।

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

&জাভা মধ্যে অপারেটর অভ্যন্তরীণভাবে কি বোঝা চাপ? নাকি এর পেছনে অন্য কোনও ধারণা আছে?



সম্ভব হলে ডাবল শর্টকাট সম্পাদন করে।
নিকোলাস হ্যামিল্টন

উত্তর:


278

& <- উভয় অপারেশনকে যাচাই করে
&& <- প্রথম অপারেন্ড যদি মিথ্যাতে মূল্যায়ন করে তবে ফলাফলটি মিথ্যা হবে বলে মূল্যায়ন বন্ধ করে দেয়

(x != 0) & (1/x > 1)<- এর অর্থ মূল্যায়ন করুন (x != 0)তারপরে মূল্যায়ন করুন (1/x > 1)তারপরে & করুন। সমস্যাটি হল x = 0 এর জন্য এটি একটি ব্যতিক্রম ছুঁড়ে দেবে।

(x != 0) && (1/x > 1)<- এর অর্থ মূল্যায়ন করা হয় (x != 0)এবং কেবল যদি এটি সত্য হয় তবে মূল্যায়ন করুন (1/x > 1)তাই আপনার যদি x = 0 থাকে তবে এটি পুরোপুরি নিরাপদ এবং কোনও ব্যতিক্রম ছুঁড়ে ফেলবে না যদি (x! = 0) পুরো বিষয়টি সরাসরি মিথ্যাতে মূল্যায়ন করে তবে মূল্যায়ন ছাড়া (1/x > 1)

সম্পাদনা করুন:

exprA | exprB<- এর অর্থ মূল্যায়ন করুন exprAতারপর মূল্যায়ন করুন exprBতারপর করুন |

exprA || exprB<- এর অর্থ হল মূল্যায়ন exprAএবং কেবল যদি falseএটির পরে মূল্যায়ন করা হয় exprBএবং তা করা হয় ||


7
একটি & বা লিখার কারণ কী যদি বিবৃতিতে? এটি কখনই && এবং || এর চেয়ে দ্রুত হবে না। আমরা যদি ইতিমধ্যে উত্তর পেতে পারি তবে কেন আমরা দ্বিতীয় শর্তটি পরীক্ষা করতে চাই? আপনি দয়া করে বাস্তবের উদাহরণ প্রদান করতে পারেন?
মিচু 9

14
@ মিচু ৯৩: দ্বিতীয় অবস্থার কোনও ফাংশন কল যদি আপনার সর্বদা প্রয়োজন হয় এমন একটি পার্শ্ব প্রতিক্রিয়া থাকে তবে তার একটি উদাহরণ হতে পারে। যেহেতু পার্শ্ব প্রতিক্রিয়াগুলি সাধারণত এড়ানো উচিত, কেবল বিরল ক্ষেত্রেই আপনার এটির প্রয়োজন হবে এবং আমি এই মুহূর্তে বাস্তবের উদাহরণের কথা ভাবতে পারি না।
হেইনজি

54

উভয় অপারেশনকে মূল্যায়ন করে অলস মূল্যায়নকারী না হওয়ার পাশাপাশি, আমি মনে করি বিটওয়াইজ অপারেটরগুলির প্রধান বৈশিষ্ট্যগুলি নিম্নলিখিত উদাহরণগুলির মতো অপারেশনগুলির প্রতিটি বাইটগুলি তুলনা করে:

int a = 4;
int b = 7;
System.out.println(a & b); // prints 4
//meaning in an 32 bit system
// 00000000 00000000 00000000 00000100
// 00000000 00000000 00000000 00000111
// ===================================
// 00000000 00000000 00000000 00000100

2
প্রশ্নটি লজিক্যাল বুলিয়ান অপারেশন সম্পর্কে, বিটওয়াইজ অপারেশনগুলি সম্পর্কে নয়।
লার্নের মারকুইস

21
@ এজেপি এটি এখনও আমার মতো গুগলদের সহায়তা করে, যারা কেবল শিরোনামটি পড়ে।
বিজ্ঞাপন ইনফিনিটাম

29
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

সম্পাদনার জন্য আপনাকে আন্দ্রেসকে ধন্যবাদ, সম্ভবত এই অন্য প্রশ্নটিও সহায়তা করে: stackoverflow.com/questions/4014535/vs-and-vs
টরেস

11

এটি আর্গুমেন্টের ধরণের উপর নির্ভর করে ...

পূর্ণসংখ্যার যুক্তিগুলির জন্য, একক অ্যাম্পারস্যান্ড ("&") হ'ল "বিট-ওয়াইন্ড এবং" অপারেটর। ডাবল এম্পারস্যান্ড ("&&") দুটি বুলিয়ান আর্গুমেন্ট ব্যতীত অন্য কোনও কিছুর জন্য সংজ্ঞায়িত করা হয়নি।

বুলিয়ান আর্গুমেন্টের জন্য, একক অ্যাম্পারস্যান্ড (শর্তহীন) "লজিকাল অ্যান্ড" অপারেটর গঠন করে যখন ডাবল অ্যাম্পারস্যান্ড ("&&") হ'ল "শর্তাধীন লজিকাল অ্যান্ড" অপারেটর। এর অর্থ হ'ল একক এম্পারস্যান্ড সর্বদা উভয় যুক্তিই মূল্যায়ন করে যেখানে ডাবল অ্যাম্পারস্যান্ড কেবলমাত্র প্রথম যুক্তিটি সত্য হলে দ্বিতীয় তর্কটিকে মূল্যায়ন করবে।

অন্যান্য সমস্ত আর্গুমেন্টের ধরণের এবং সংমিশ্রণের জন্য একটি সংকলন-সময় ত্রুটি হওয়া উচিত।


9

&& হ'ল একটি শর্ট সার্কিট অপারেটর এবং এটি একটি অ্যান্ড অপারেটর।

এটা চেষ্টা কর.

    String s = null;
    boolean b = false & s.isEmpty(); // NullPointerException
    boolean sb = false && s.isEmpty(); // sb is false

7

এটি জেএলএস (15.22.2) তে নির্দিষ্ট হিসাবে রয়েছে :

যখন একটি &, ^, বা | এর উভয় ক্রিয়াকলাপ অপারেটর টাইপ বুলিয়ান বা বুলিয়ান, তারপরে বিটওয়াইস অপারেটরের এক্সপ্রেশনটির ধরণটি বুলিয়ান। সমস্ত ক্ষেত্রে অপারেন্ডগুলি প্রয়োজনীয় হিসাবে আনবক্সিং রূপান্তর (§5.1.8) এর সাপেক্ষে।

& এর জন্য, উভয় অপরেন্ড মানগুলি সত্য হলে ফলাফলের মানটি সত্য; অন্যথায়, ফলাফল মিথ্যা।

^ এর জন্য, অপারেন্ড মানগুলি পৃথক হলে ফলাফলের মানটি সত্য; অন্যথায়, ফলাফল মিথ্যা।

| এর জন্য, উভয় অপরেন্ড মানগুলি মিথ্যা হলে ফলাফলের মানটি মিথ্যা; অন্যথায়, ফলাফল সত্য।

"কৌশল" এটি &হ'ল একটি ইন্টিজার বিটওয়াইস অপারেটর পাশাপাশি বুলিয়ান লজিকাল অপারেটর । সুতরাং কেন না, এটি অপারেটর ওভারলোডিংয়ের উদাহরণ হিসাবে দেখা যুক্তিসঙ্গত।


7

আমি মনে করি আমার উত্তরটি আরও বোধগম্য হতে পারে:

তার মাঝে দুই পার্থক্য আছে &এবং &&

যদি তারা লজিকাল এ্যান্ড হিসাবে ব্যবহার করে

&এবং &&যৌক্তিক হতে পারে AND, যখন &বা &&বাম এবং ডান অভিব্যক্তি ফলাফল সব সত্য, পুরো অপারেশন ফলাফলের সত্য হতে পারে।

যখন &এবং &&হিসাবে যুক্তিযুক্ত AND, একটি পার্থক্য আছে:

&&লজিকাল হিসাবে ব্যবহার করার সময় AND, যদি বাম প্রকাশের ফলাফলটি মিথ্যা হয়, ডান এক্সপ্রেশন কার্যকর হবে না।

উদাহরণটি ধরুন:

String str = null;

if(str!=null && !str.equals("")){  // the right expression will not execute

}

যদি ব্যবহার করা হয় &:

String str = null;

if(str!=null & !str.equals("")){  // the right expression will execute, and throw the NullPointerException 

}

অন্য একটি উদাহরণ:

int x = 0;
int y = 2;
if(x==0 & ++y>2){
    System.out.print(“y=”+y);  // print is: y=3
}

int x = 0;
int y = 2;
if(x==0 && ++y>2){
    System.out.print(“y=”+y);  // print is: y=2
}

এবং বিট অপারেটর হিসাবে ব্যবহার করা যেতে পারে

&বিটওয়াইস ANDঅপারেটর হিসাবে ব্যবহার করা যেতে পারে , &&পারে না।

বিটওয়াইস এবং "&" অপারেটরটি 1 উত্পাদন করে এবং কেবল যদি তার অপারেশনগুলিতে বিট উভয়ই 1 হয় তবে তবে, বিটগুলির উভয় যদি 0 বা উভয় বিট পৃথক হয় তবে এই অপারেটরটি 0 উত্পাদন করে To এবং "&" অপারেটর দুটি বিটের কোনও 1 হলে 1 প্রদান করে এবং বিটগুলির কোনও 0 হলে এটি 0 প্রদান করে। 

উইকি পৃষ্ঠা থেকে:

http://www.roseindia.net/java/master-java/java-bitwise-and.shtml


4

'এবং&': - এটি একটি যৌক্তিক এবং অপারেটর তার যুক্তিগুলির যৌক্তিক সম্পর্কের ভিত্তিতে সত্য বা মিথ্যা এর বুলিয়ান মান উত্পাদন করে।

উদাহরণস্বরূপ: - শর্ত 1 && শর্ত 2

যদি কন্ডিশন 1 টি মিথ্যা হয়, তবে (কন্ডিশন 1 && শর্ত 2) সর্বদা মিথ্যা হবে, এই কারণেই এই লজিকাল অপারেটরটি শর্ট সার্কিট অপারেটর হিসাবেও পরিচিত কারণ এটি অন্য শর্তটি মূল্যায়ন করে না। যদি কন্ডিশন 1 টি মিথ্যা হয় তবে কনডিটন 2 মূল্যায়নের দরকার নেই।

কন্ডিশন 1 যদি সত্য হয় তবে কন্ডিশন 2 মূল্যায়ন করা হয়, যদি এটি সত্য হয় তবে সামগ্রিক ফলাফল সত্য হবে অন্যথায় এটি মিথ্যা হবে।

'এবং': - একজন বিটওয়াস এবং অপারেটর। উভয় ইনপুট বিট যদি এক হয় তবে এটি আউটপুটে একটি (1) উত্পাদন করে। অন্যথায় এটি শূন্য (0) উত্পাদন করে।

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

int a = 12; // 12 এর বাইনারি উপস্থাপনা 1100

ইন্ট বি = 6; // 6 এর বাইনারি উপস্থাপনা 0110

int c = (a & b); // এর বাইনারি উপস্থাপনা (12 এবং 6) 0100

গ এর মান 4।

রেফারেন্সের জন্য, এই পড়ুন http://techno-terminal.blogspot.in/2015/11/difference-between-operator-and-operator.html


3

&&এবং ||শর্ট সার্কিট অপারেটর বলা হয়। যখন তারা ব্যবহার করা হয়|| - যদি প্রথম অপারেন্ডটি মূল্যায়ন করে trueতবে অপারেটরগুলির বাকী মূল্যায়ন হয় না। জন্য &&- যদি প্রথম অপারেন্ড মূল্যায়ন করেfalse , তাদের বাকি সব সময়ে মূল্যায়ন পেতে না।

সুতরাং if (a || (++x > 0))এই উদাহরণে ভেরিয়েবল এক্স একটি থাকলে বৃদ্ধি পাবে না true


3

বুলিয়ানগুলির সাথে, দুটির মধ্যে কোনও আউটপুট পার্থক্য নেই। আপনি অ্যান্ড অ্যান্ড অ্যান্ড অ্যান্ড ওআর || এবং | এবং এটি কখনই আপনার অভিব্যক্তির ফলাফল পরিবর্তন করবে না।

পার্থক্যটি সেই দৃশ্যের পিছনে রয়েছে যেখানে তথ্য প্রক্রিয়া করা হচ্ছে। যখন আপনি a = 0 এবং b = 1 এর জন্য "(a! = 0) & (b! = 0)" একটি অভিব্যক্তি ঠিক করেন, নিম্নলিখিতটি ঘটে:

left side: a != 0 --> false
right side: b 1= 0 --> true
left side and right side are both true? --> false
expression returns false

(a != 0) && ( b != 0)A = 0 এবং b = 1 এ যখন আপনি একটি এক্সপ্রেশন লিখেন , নিম্নলিখিতটি ঘটে:

a != 0 -->false
expression returns false

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


2
অপারেন্ডগুলির পার্শ্ব-প্রতিক্রিয়া থাকলে এটি প্রকাশের সামগ্রিক ফলাফলকে পরিবর্তন করবে।
লার্নের মারকুইস

3

এছাড়াও && এবং || সংক্ষিপ্ত সার্কিট হওয়া, দুটি ফর্মের মিশ্রণের সময় অপারেটরের প্রাধান্যও বিবেচনা করুন। আমি মনে করি এটি তাত্ক্ষণিকভাবে সবার কাছে প্রকাশিত হবে না যে ফলাফল 1 এবং ফলাফল 2 এর বিভিন্ন মান রয়েছে।

boolean a = true;
boolean b = false;
boolean c = false;

boolean result1 = a || b && c; //is true;  evaluated as a || (b && c)
boolean result2 = a  | b && c; //is false; evaluated as (a | b) && c

0

এবং হ'ল বিটওয়াসার অপারেটর প্লাস যা উভয় শর্ত পরীক্ষা করার জন্য ব্যবহৃত হয় কারণ মাঝে মাঝে আমাদের উভয় অবস্থার মূল্যায়ন করতে হয়। যখন প্রথম শর্তটি সত্য হয় তবে && যৌক্তিক অপারেটর ২ য় শর্তে যান।


0

সমস্ত উত্তর হয় great, এবং এটি noআরও উত্তর বলে মনে হয় is needed তবে আমি &&অপারেটর সম্পর্কে ডাকা কিছু বলতে চেয়েছিdependent condition

অপারেটর ও& ব্যবহার করে এক্সপ্রেশন, একটি শর্ত - আমরা এটিকে ডাকব - dependent conditionনির্ভরশীল শর্তটি মূল্যবান হওয়ার জন্য আমাদের আরও একটি শর্ত সত্য হতে হবে।

এই ক্ষেত্রে, ত্রুটিগুলি রোধ করার জন্য নির্ভরশীল শর্তটি && অপারেটরের পরে রাখা উচিত।

অভিব্যক্তি বিবেচনা করুন (i != 0) && (10 / i == 2)। নির্ভরযোগ্য শর্তটি শূন্য দ্বারা বিভাজনের সম্ভাবনা রোধ করতে অপারেটরকে (10 / i == 2)অবশ্যই আবশ্যক ।appear after&&

আরেকটি উদাহরণ (myObject != null) && (myObject.getValue() == somevaluse)

এবং অন্য জিনিস: &&এবং ||বলা হয় শর্ট সার্কিট মূল্যায়ন কারণ দ্বিতীয় যুক্তি সম্পাদিত বা মূল্যায়ন করা হয় যুক্তি আছে করতে এরonly iffirstnot sufficedeterminevalueexpression

তথ্যসূত্র: জাভা Program কীভাবে প্রোগ্রাম করুন (প্রাথমিক বিষয়গুলি), দশম সংস্করণ

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