আমরা সাধারণত কেন ব্যবহার করি || শেষ | পার্থক্য কি?


219

আমি কেবলই ভাবছি যে আমরা সাধারণত ||দুটি বুলিয়ানগুলির মধ্যে বিটওয়াইজ অর্ডার না হয়েও কেন লজিক্যাল ওআর ব্যবহার করি |, যদিও তারা উভয়ই ভালভাবে কাজ করছে।

মানে, নিম্নলিখিতটি দেখুন:

if(true  | true)  // pass
if(true  | false) // pass
if(false | true)  // pass
if(false | false) // no pass
if(true  || true)  // pass
if(true  || false) // pass
if(false || true)  // pass
if(false || false) // no pass

আমরা কি |পরিবর্তে ব্যবহার করতে পারি ||? একই জিনিস &এবং &&


16
বেশিরভাগ মানুষ তা ভুলে যায় | বিটওয়াইস অপারেটর হওয়া ছাড়াও একটি অ-শর্ট সার্কিটিং বুলিয়ান অপারেটর।
জন মেঘের

1
পার্থক্য সংক্রান্ত বিবরণগুলি জেএলএসে রয়েছে। Java.sun.com/docs/books/jls/third_edition/html/…
জন মেঘের

64
তারা একই নয়। দয়া করে তাদের উপর টিউটোরিয়ালগুলি বিশেষত শর্ট সার্কিট মূল্যায়ন বনাম আগ্রহী মূল্যায়ন সম্পর্কিত বিষয়ে দেখুন||এবং &&শর্ট সার্কিট |এবং &আগ্রহী যখন ।
পূর্ণ হওরক্রাফ্ট

4
কৌতূহলের বাইরে, আপনি কোন ক্ষেত্রে আসলে অ-শর্ট সার্কিট সংস্করণগুলি ব্যবহার করতে চান? আমি প্রায় সবসময়ই দেখি &&এবং ||তবে কখনও দেখি না & |। যদি আপনি এমন কিছু করছেন যা পার্শ্ব প্রতিক্রিয়াগুলির উপর নির্ভর করে, তবে আপনি কেন এমন কিছু ব্যবহার করতে চাইছেন না (a & b | c)যেহেতু কেউ সহজেই ভাবতে পারে "আমি সংক্ষিপ্ত সার্কিট সংস্করণ ব্যবহার করে এটি অনুকূলিত করতে পারি" "
মাইক বেইলি

2
এবং অবশ্যই তাদের আলাদা নজির রয়েছে।
হট লিকস

উত্তর:


349

আপনি যদি এই অপারেটরগুলির ফর্ম এবং ফর্মগুলির পরিবর্তে ||এবং &&ফর্মগুলি ব্যবহার করেন তবে জাভা একাই ডান হাতের ক্রিয়াকলাপটি মূল্যায়ন করতে বিরক্ত করবে না।|&

আপনি মূল্যায়নটি শর্ট সার্কিট করতে চান কিনা - এটি বেশিরভাগ সময় আপনি চান।

শর্ট-সার্কিটের সুবিধার চিত্রিত করার একটি ভাল উপায় নিম্নলিখিত উদাহরণটি বিবেচনা করা উচিত।

Boolean b = true;
if(b || foo.timeConsumingCall())
{
   //we entered without calling timeConsumingCall()
}

জেরেমি এবং পিটার যেমন উল্লেখ করেছেন, তেমনি আরেকটি সুবিধা হ'ল শর্ট সার্কিটের জন্য নাল রেফারেন্স চেক:

if(string != null && string.isEmpty())
{
    //we check for string being null before calling isEmpty()
}

অধিক তথ্য


115
ক্যানোনিকাল উদাহরণটি হ'লfoo != null && foo.hasBar()
জেরেমি

1
আপনি যদি ব্যবহার করে প্রায় নাল রেফারেন্স ব্যতিক্রম যোগ করেন @ জেরেমির মন্তব্য থেকে তবে এটি দুর্দান্ত উত্তর।
পিটার কেলি

এছাড়াও মনে রাখবেন যে && এবং || মেশিন কোড স্তরে একটি শাখা নির্দেশের অর্থ (মনে রাখবেন শাখাগুলি শাখার ভুল ধারণা তৈরি করতে পারে), সুতরাং যদি আপনি পারফরম্যান্স সম্পর্কে অতি-প্যাডেন্টিক হন কেবল তখনই তাদের ব্যবহার করুন যখন তাদের প্রয়োজন হয় ( foo != null && foo.hasBar()) বা দ্রুত ( b || foo.timeConsumingCall()) are যদিও 99% বিকাশকারীকে এই স্তরের মাইক্রো অপ্টিমাইজেশনের বিষয়ে চিন্তা করার দরকার নেই।
জোনাথন ডিকিনসন

3
আপনি যখন ব্যবহার করতে চান তখন আমি অবাক হয়েছি নুনের কথা | আমি যখন ব্যবহার করি তার মধ্যে সবচেয়ে প্রচলিত দৃশ্যটি হ'ল যখন কোনও পরিবর্তনশীল (জে> 3 | ++ i> 3) বা (++ i> 3 | সংশোধনগ্লোবালআ্যামংঅথারথিংস () = সত্য) এ পরিবর্তিত হয়। যদিও খুব সাধারণ না।
AndSoYouCode

8
আর একটি প্রচলিত উদাহরণ হল string == null || string.isEmpty();)
পিটার লরে

83

| বুলিয়ান এক্সপ্রেশনগুলিতে শর্ট সার্কিট মূল্যায়ন করে না||প্রথম অপারেন্ডটি সত্য হলে মূল্যায়ন করা বন্ধ করে দিবে, তবে তা |হবে না।

এছাড়াও, |বাইট / শর্ট / ইনট / দীর্ঘ মানগুলিতে বিটওয়াইস-ওআর অপারেশন করতে ব্যবহৃত হতে পারে। ||না পারেন.


একটি সম্পূর্ণ উত্তর সরবরাহ করুন এবং আমি এটি গ্রহণ করব। এখনও অবধি আপনি এর দিকটি বেছে নেওয়ার পক্ষে প্রথম।
জন মেঘের

এর বিটওয়াইজ দিকটি অনুপস্থিত
জন মেঘের

63

সুতরাং কেবলমাত্র একটি উদাহরণ সহ অন্যান্য উত্তরগুলি তৈরি করতে, নিম্নলিখিত প্রতিরক্ষামূলক চেকগুলিতে শর্ট সার্কিট করা অত্যন্ত গুরুত্বপূর্ণ:

if (foo == null || foo.isClosed()) {
    return;
}

if (bar != null && bar.isBlue()) {
    foo.doSomething();
}

ব্যবহার |এবং &পরিবর্তে NullPointerExceptionএখানে ফেলে দেওয়া হতে পারে ।


আপনি যদি নালওজেক্ট প্যাটার্নটি প্রয়োগ করেন তবে তা (বা বরং উত্তরটিকে প্রত্যাখ্যান করবে)। এছাড়াও, আমি বলব foo নীল কিনা তা যাচাইয়ের জন্য অভ্যন্তরীণ কিছু। যদি এটি নীল হয় তবে ডস কিছু কিছু করা উচিত নয়।
নিকোডেমাস 13

@ নিকোডেমাস 13 - ভাল পয়েন্ট, যদিও নাল অবজেক্ট প্যাটার্নটি কেবল কখনও কখনও আকাঙ্ক্ষিত হয়, এবং শরীরটি অন্য কল থেকে ভিন্ন কিছু হতে পারে foo। পিটার লরির "ক্যানোনিকাল উদাহরণ" সেরা।
পল বেলোরা

@ খান: হ্যাঁ, আমি বরং নৈর্ব্যক্তিক হয়ে উঠছিলাম এবং নাল অবজেক্টটি সর্বদা উপযুক্ত নয়। আমি বরং সাব-সচেতনভাবে জিনিসগুলি রিফ্যাক্টর করার অভ্যাসে চলে এসেছি। আপনার উত্তরের সাথে বিশেষত কোনও ভুল নেই।
নিকোডেমাস 13

39

লজিকাল ||এবং &&ডান হাত পরীক্ষা প্রয়োজন হলেই। |এবং &পরীক্ষা উভয় পক্ষের সব।

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

int i = 12;
if (i == 10 & i < 9) // It will check if i == 10 and if i < 9
...

এটি আবার লিখুন:

int i = 12;
if (i == 10 && i < 9) // It will check if i == 10 and stop checking afterward because i != 10
...

আরেকটি উদাহরণ:

int i = 12;
if (i == 12 | i > 10) // It will check if i == 12 and it will check if i > 10
...

এটি আবার লিখুন:

int i = 12;
if (i == 12 || i > 10) // It will check if i == 12, it does, so it stops checking and executes what is in the if statement
...

18

একটি সাধারণ সমস্যাটিও লক্ষ্য করুন: অলস অপারেটরদের অলসতার চেয়ে বেশি প্রাধান্য রয়েছে, তাই:

boolean a, b, c;
a || b && c; //resolves to a || (b && c)
a | b && c; //resolves to (a | b) && c

তাদের মিশ্রিত করার সময় সাবধানতা অবলম্বন করুন।


15

শর্ট সার্কিটের পাশাপাশি, আরেকটি বিষয় মনে রাখতে হবে যে 0 বা 1 এর চেয়ে অন্য যে মান হতে পারে সেগুলি নিয়ে বিটওয়াইজ লজিক অপারেশন করা শর্তযুক্ত যুক্তির চেয়ে খুব আলাদা অর্থ রয়েছে different যদিও এটি সর্বদা একইর জন্য |এবং এর ||সাথে &এবং &&আপনি খুব আলাদা ফলাফল পান (উদাহরণস্বরূপ 2 & 40 / মিথ্যা যখন 2 && 41 / সত্য হয়)।

আপনি যদি কোনও ফাংশন থেকে জিনিসটি পেয়ে যাচ্ছেন তা আসলে একটি ত্রুটি কোড এবং আপনি নন-0-নেসের জন্য পরীক্ষা করছেন, এটি যথেষ্ট পরিমাণে বিবেচনা করতে পারে।

এটি জাভাতে যতটা সমস্যা রয়েছে তেমন নয়, যেখানে আপনাকে 0 বা এর মতো তুলনা করতে স্পষ্টভাবে টাইপকাস্ট করতে হবে, তবে অন্য ভাষায় অনুরূপ বাক্য গঠন (সি / সি ++ ইত্যাদি) সহ এটি বেশ বিভ্রান্তিকর হতে পারে।

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


3
আমি আনন্দিত যে কমপক্ষে কেউ বিটওয়াইজ অপারেটরদের অস্তিত্বের পুরো উদ্দেশ্যটি উল্লেখ করেছে।
ulidtko

9

শুধুমাত্র সময় আপনি ব্যবহার করেন |বা &পরিবর্তে ||বা &&আপনি খুব সহজ বুলিয়ান এক্সপ্রেশন এবং স্বল্প কাটা (অর্থাত একটি শাখা) খরচ আছে সময় আপনি পরে এক্সপ্রেশন মূল্যায়নের না করে সংরক্ষণ চেয়ে বেশী।

তবে এটি একটি মাইক্রো-অপ্টিমাইজেশন যা খুব নিম্ন স্তরের কোড ব্যতীত খুব কমই গুরুত্বপূর্ণ।


1
এটি আকর্ষণীয় হবে যে সংকলকটি কিছু ক্ষেত্রে স্বয়ংক্রিয়ভাবে এটি করে কিনা।
স্টার ব্লু

সম্ভবত জেআইটি পারত, তবে সংকলকটি কেবলমাত্র সাধারণ অপটিমাইজেশন নিয়ে কাজ করে।
পিটার লরি

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

4
@ ফ্লাফি, গল্পটির নৈতিকতা হ'ল আপনি যদি কিছু মুশকিল করেন তবে আপনি কেন এটি করেছেন বা আপনার প্রচেষ্টা পরে নষ্ট হতে পারে সে সম্পর্কে মন্তব্য করা দরকার। ;)
পিটার ল্যারি

1
হ্যাঁ, শেষ পর্যন্ত তিনি একটি মন্তব্য যুক্ত করলেন (কীভাবে ঠিকাদারকে এটি 'ফিক্সিং' বন্ধ করতে হবে তার পরামর্শে) এবং সব ঠিক আছে।
ফ্লাফি

8

|| যখন লজিকাল বা অপারেটর হয় বিটওয়াইস বা অপারেটর।

boolean a = true;
boolean b = false;

if (a || b) {
}

int a = 0x0001;
a = a | 0x0002;

1
মিস করছি | এটি একটি অ-শর্ট-সার্কিটিং বুলিয়ান অপারেটরও।
জন মেঘের

2
@John Meagher: যে অন্তর্নিহিত এটা এর মত , bitwise
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳

@ L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳ আপনি আপনার প্রোফাইলে নিজের নামটিকে কীভাবে আলাদা স্টাইল বানিয়েছেন?
উদয়কিরণ পুলিপতি

8

ক | বি: যে কোনও ক্ষেত্রে খ মূল্যায়ন

ক || বি: মূল্যায়ন বি শুধুমাত্র যদি একটি মূল্যায়নের মিথ্যা


7

যোগ করার সাথে সাথে | বিটওয়াইজ-অপারেটর: || একটি শর্ট সার্কিট অপারেটর - যখন একটি উপাদান মিথ্যা থাকে, তখন এটি অন্যদের পরীক্ষা করে না।

 if(something || someotherthing)
 if(something | someotherthing)

যদি কিছু সত্য হয়, || অন্য কিছু মূল্যায়ন করবে না, যখন | করব. আপনার যদি বিবৃতিতে ভেরিয়েবলগুলি আসলে ফাংশন কল হয়, || সম্ভবত প্রচুর পারফরম্যান্স সঞ্চয় করছে।


আপনি কেন কখনও ব্যবহার করবেন? যদি একটি বিবৃতিতে। || বুলিয়ান, | হয় না, | যদি আপনার ইতিমধ্যে দুটি বুলিয়ান মান নিয়ে কাজ করে তবেই বুলিয়ান হবে।
ফ্লাইওয়াত

এটি সব পাওয়ার প্রথম উত্তর।
জন মেঘের

এই উত্তরটি ভুল। যদি কিছু মিথ্যা হয় তবে উভয় অপারেটরই পরবর্তী অপারেন্ডে যাবে। পার্থক্যটি তখনই উত্থাপিত হয় যখন প্রথম অপারেন্ডটি সত্য হয়।
মাইকেল ময়র্স

খারাপ এটির একটি একেবারে হাস্যকর উদাহরণ রয়েছে।
ফ্লাইওয়াত

কেন কেউ ব্যবহার করবে সে সম্পর্কে আমার ধারণা নেই বা & সহজ বুলিয়ান তুলনার জন্য যদি একটি বিবৃতিতে, কিন্তু এটি পুরোপুরি আইনী, এবং আমি প্রোগ্রামিং শিখতে শুরু করার সময় এর উদাহরণগুলি দেখেছি।
মাইকেল স্টাম


3

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

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

বিটওয়াইজ অপারেটরগুলি যে কোনও সংখ্যাসূচক অপারেণ্ডের সাথে কাজ করে।

আপনি যদি লজিকাল তুলনা করতে চান তবে আপনার শর্তসাপেক্ষ অপারেটরগুলি ব্যবহার করা উচিত , যেহেতু আপনি আপনার কোডটিতে কোনও ধরণের সুরক্ষা যুক্ত করবেন।


|ও , এবং &শর্তসাপেক্ষে অপারেটরও। মূল পোস্টে আমার মন্তব্যে লিঙ্কটি দেখুন।
অফ হোলক্র্যাফ্ট

@ হোভারক্রাফ্ট অফ ইলস ফুল: এই চার্টটি কিছুটা বিভ্রান্তিকর; এটি কেবলমাত্র বুলিয়ান মানগুলির প্রসঙ্গে শর্তসাপেক্ষ অপারেটর হিসাবে তাদের উল্লেখ করছে, যেখানে তারা গণিতগতভাবে আগ্রহী লজিকাল অপারেটরগুলির সমতুল্য। আপনি যখন 0 বা 1, বা ভাসমান পয়েন্টের মান বা পয়েন্টার বা অন্য যে কোনও কিছু সহ মান আছে এমন জিনিসগুলির সাথে ডিল শুরু করেন, তুলনাটি ভেঙে যায়।
ফ্লাফি

@ ফ্লুফি: চার্ট সম্পর্কে বিভ্রান্ত করার কিছু নেই কারণ আলোচনাটি কেবল বুলিয়ান অপারেটরদের নিয়েই ছিল। যেটি |এবং &বিট-বুদ্ধিমান অপারেটর হিসাবে ব্যবহৃত হতে পারে এটি সম্পূর্ণ পৃথক সমস্যা।
অফ হোলক্র্যাফ্ট পূর্ণ

1
সেগুলি বুলিয়ান মানগুলিতে ব্যবহার করা বিট-ওয়াইজ অপারেটর হিসাবে উল্লেখ করা আরও সঠিক হবে, না বুলিয়ান অপারেটরগুলি। যখন কেবল একটি বিট থাকে তখন তারা গাণিতিক সমতুল্য হতে পারে।
ফ্লাফি

2

একটি পার্শ্ব নোট: জাভা আছে | = তবে একটি || = নয়

আপনাকে কখন ব্যবহার করতে হবে তার একটি উদাহরণ || প্রথম এক্সপ্রেশনটি যখন দ্বিতীয় এক্সপ্রেশনটি ফুটে উঠবে কিনা তা পরীক্ষা করার জন্য। যেমন একক ব্যবহার | hte নিম্নলিখিত ক্ষেত্রে একটি এনপিই হতে পারে।

public static boolean isNotSet(String text) {
   return text == null || text.length() == 0;
}

2

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

&এবং |হয় ইন্টিজার বিটওয়াইজ অপারেটর বা বুলিয়ান লজিকাল অপারেটর হতে পারে। বিটওয়াইস এবং লজিকাল অপারেটরগুলির জন্য সিনট্যাক্স ( .215.22 ):

AndExpression:
  EqualityExpression 
  AndExpression & EqualityExpression

ExclusiveOrExpression:
  AndExpression 
  ExclusiveOrExpression ^ AndExpression

InclusiveOrExpression:
  ExclusiveOrExpression 
  InclusiveOrExpression | ExclusiveOrExpression

সিনট্যাক্স জন্য EqualityExpressionসংজ্ঞায়িত করা হয় §15.21 , যা প্রয়োজন RelationalExpressionসংজ্ঞায়িত §15.20 , যেটা ঘুরে ফিরে প্রয়োজন ShiftExpressionএবং ReferenceTypeসংজ্ঞায়িত §15.19 এবং §4.3 যথাক্রমে। .115.18 এ সংজ্ঞায়িত করা ShiftExpressionদরকার যা বুনিয়াদী গাণিতিক, অ্যানারি অপারেটর, ইত্যাদি সংজ্ঞায়িত করে ড্রিল অবিরত করে চলেছে , কোনও ধরণের প্রতিনিধিত্ব করার জন্য বিভিন্ন উপায়ে ড্রিল চালিয়ে যায় । (যদিও আদিম ধরনের অন্তর্ভুক্ত নয়, আদিম ধরনের সংজ্ঞা শেষ পর্যন্ত, প্রয়োজন বোধ করা হয় হিসাবে তারা একটি অ্যারের, যার জন্য মাত্রা টাইপ হতে পারে হয় একটি ।)AdditiveExpressionReferenceTypeReferenceTypeReferenceType

বিটওয়াইজ এবং লজিকাল অপারেটরগুলির নিম্নলিখিত বৈশিষ্ট্য রয়েছে:

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

কিনা অপারেটর একটি bitwise অপারেটর বা একটি লজিক্যাল অপারেটর হিসেবে কাজ করে পার্থক্য operands "একটি আদিম অবিচ্ছেদ্য টাইপ পরিবর্তনীয়" (কিনা উপর নির্ভর করে §4.2 ) অথবা তারা ধরনের হলে booleanবা Boolean( §5.1.8 )।

যদি অপারেন্ডগুলি অবিচ্ছেদ্য ধরণের হয় তবে উভয় অপারেন্ডে বাইনারি সংখ্যার প্রচার ( §5.6.2 ) সঞ্চালিত হয়, তাদের উভয়ই অপারেশনের জন্য longs বা ints হিসাবে ছেড়ে যায় । অপারেশনের ধরণটি (প্রচারিত) অপারেশনগুলির ধরণ হবে। এই মুহুর্তে, &বিটওয়াইস এবং অ্যান্ড ^বিটওয়াইজ এক্সক্লুসিভ হবে OR, এবং |বিটওয়াইস ইনক্লুসিভ ওআর হবে। ( .215.22.1 )

Operands হন booleanবা Boolean, operands আনবক্সিং রূপান্তর প্রয়োজনে (সাপেক্ষে হতে হবে §5.1.8 ), এবং অপারেশন ধরণ হতে হবে boolean&ফলে হবে trueউভয় operands যদি true, ^পরিণাম ডেকে আনবে trueউভয় operands আলাদা, এবং |পরিণাম ডেকে আনবে trueযদি পারেন প্রতীক হয় true। ( .215.22.2 )

বিপরীতে, && "শর্তসাপেক্ষে এবং অপারেটর" ( §15.23 ) এবং ||এটি "শর্তসাপেক্ষ-বা অপারেটর" ( .215.24 )। তাদের বাক্য গঠনটি সংজ্ঞায়িত করা হয়:

ConditionalAndExpression:
  InclusiveOrExpression 
  ConditionalAndExpression && InclusiveOrExpression

ConditionalOrExpression:
  ConditionalAndExpression 
  ConditionalOrExpression || ConditionalAndExpression

&&এর মতো &, বাদে এটি কেবলমাত্র ডান অপরেন্ডকে মূল্যায়ন করে যদি বাম অপারেন্ড হয় true||এর মতো |, বাদে এটি কেবলমাত্র ডান অপরেন্ডকে মূল্যায়ন করে যদি বাম অপারেন্ড হয় false

শর্তাধীন-এবং নিম্নলিখিত বৈশিষ্ট্য রয়েছে:

  • শর্তসাপেক্ষে এবং অপারেটরটি সিন্ট্যাক্টিক্যালি বাম-অ্যাসোসিয়েটিভ (এটি বাম থেকে ডানকে গোষ্ঠী দেয়)।
  • শর্তসাপেক্ষে এবং অপারেটর উভয় পার্শ্ব প্রতিক্রিয়া এবং ফলাফলের মান সম্মানের সাথে সম্পূর্ণরূপে সম্মিলিত। অর্থাৎ কোনো এক্সপ্রেশন জন্য a, bএবং cমত প্রকাশের মূল্যায়ন ((a) && (b)) && (c)একই ফলাফল, একই পার্শ্ব প্রতিক্রিয়া, একই আদেশ ঘটছে মত প্রকাশের মূল্যায়ন হিসাবে উত্পাদন করে (a) && ((b) && (c))
  • শর্তসাপেক্ষ-এবং অপারেটর প্রত্যেকটি প্রতীক ধরনের হতে হবে booleanবা Boolean, অথবা একটি কম্পাইল-টাইম এরর দেখা দেয়।
  • শর্তসাপেক্ষে এবং প্রকাশের ধরণটি সর্বদা boolean
  • রান টাইমে, বাম-হাতের ক্রিয়াকলাপটি প্রথমে মূল্যায়ন করা হয়; যদি ফলাফলটি টাইপ করে থাকে তবে Booleanএটি আনবক্সিং রূপান্তর ( §5.1.8 ) সাপেক্ষে
  • যদি ফলাফলটি মান হয় falseতবে শর্তাধীন-ও প্রকাশের মান হয় falseএবং ডান হাতের অপারেন্ড এক্সপ্রেশনটির মূল্যায়ন হয় না।
  • যদি বাম-হাতের ক্রিয়াকলাপের মান হয় trueতবে ডান হাতের অভিব্যক্তিটি মূল্যায়ন করা হয়; যদি ফলাফলটি টাইপ করে থাকে তবে Booleanএটি আনবক্সিং রূপান্তর ( §5.1.8 ) সাপেক্ষে । ফলস্বরূপ মান শর্তসাপেক্ষে এবং ভাবের মান হয়ে যায়।
  • সুতরাং, &&যেমন একই ফলাফল নির্ণয় &উপর booleanoperands। এটি কেবলমাত্র ডান হাতের অপারেন্ড এক্সপ্রেশনটি সর্বদা পরিবর্তে শর্তসাপেক্ষে মূল্যায়ন করা হয় তার মধ্যে পৃথক।

শর্তাধীন-বা নিম্নলিখিত বৈশিষ্ট্য রয়েছে:

  • শর্তসাপেক্ষে বা অপারেটরটি সিন্টেক্সিকভাবে বাম-সহযোগী হয় (এটি বাম থেকে ডানকে গোষ্ঠী দেয়)।
  • শর্তসাপেক্ষে বা অপারেটর উভয় পার্শ্ব প্রতিক্রিয়া এবং ফলাফলের মানের ক্ষেত্রে সম্পূর্ণরূপে সম্মিলিত। অর্থাৎ কোনো এক্সপ্রেশন জন্য a, bএবং cমত প্রকাশের মূল্যায়ন ((a) || (b)) || (c)একই ফলাফল, একই পার্শ্ব প্রতিক্রিয়া, একই আদেশ ঘটছে মত প্রকাশের মূল্যায়ন হিসাবে উত্পাদন করে (a) || ((b) || (c))
  • শর্তাধীন বা অপারেটর প্রত্যেকটি প্রতীক ধরনের হতে হবে booleanবা Boolean, অথবা একটি কম্পাইল-টাইম এরর দেখা দেয়।
  • একটি শর্তাধীন বা মত প্রকাশের টাইপ সর্বদা boolean
  • রান টাইমে, বাম-হাতের ক্রিয়াকলাপটি প্রথমে মূল্যায়ন করা হয়; যদি ফলাফলটি টাইপ করে থাকে তবে Booleanএটি আনবক্সিং রূপান্তর ( §5.1.8 ) সাপেক্ষে
  • যদি ফলাফলটি মান হয় trueতবে শর্তসাপেক্ষ-বা অভিব্যক্তির মান হয় trueএবং ডান হাতের অপারেন্ড এক্সপ্রেশনটির মূল্যায়ন হয় না।
  • যদি বাম-হাতের ক্রিয়াকলাপের মান হয় falseতবে ডান হাতের অভিব্যক্তিটি মূল্যায়ন করা হয়; যদি ফলাফলটি টাইপ করে থাকে তবে Booleanএটি আনবক্সিং রূপান্তর ( §5.1.8 ) সাপেক্ষে । ফলস্বরূপ মান শর্তসাপেক্ষ-বা ভাবের মান হয়ে যায়।
  • সুতরাং, উপর বা অপারেশন ||হিসাবে একই ফলাফল গণনা । এটি কেবলমাত্র ডান হাতের অপারেন্ড এক্সপ্রেশনটি সর্বদা পরিবর্তে শর্তসাপেক্ষে মূল্যায়ন করা হয় তার মধ্যে পৃথক।|booleanBoolean

সংক্ষেপে বলতে গেলে, যেমন @JohnMeagher বারবার আউট মন্তব্যের উল্লেখ করেছে, &এবং |আসলে, অ শর্ট-সার্কিট operands হচ্ছে পারেন নির্দিষ্ট ক্ষেত্রে বুলিয়ান অপারেটরদের হয়, booleanবা Boolean। ভাল অনুশীলনের সাথে (যেমন: কোনও গৌণ প্রভাব নেই), এটি একটি সামান্য পার্থক্য। অপারেটরগুলি booleans বা Booleans না থাকলেও, অপারেটরগুলি খুব আলাদাভাবে আচরণ করে : বিটওয়াইজ এবং লজিকাল অপারেশনগুলি জাভা প্রোগ্রামিংয়ের উচ্চ স্তরে কেবল তুলনামূলকভাবে তুলনা করে না।


2

1)। (এক্সপ্রেশন 1 | এক্সপ্রেশন 2), | অপারেটর 1 এক্সপ্রেশন 1 এর ফলাফল সত্য বা মিথ্যা নির্বিশেষে এক্সপ্রেশন 2 মূল্যায়ন করবে।

উদাহরণ:

class Or 
{
    public static void main(String[] args) 
    {
        boolean b=true;

        if (b | test());
    }

    static boolean test()
    {
        System.out.println("No short circuit!");
        return false;
    }
}

2)। (এক্সপ্রেশন 1 || এক্সপ্রেশন 2), || এক্সপ্রেশন 1 সত্য হলে অপারেটর এক্সপ্রেশন 2 মূল্যায়ন করবে না।

উদাহরণ:

class Or 
{
    public static void main(String[] args) 
    {
        boolean b=true;

        if (b || test())
        {
            System.out.println("short circuit!");
        }
    }

    static boolean test()
    {
        System.out.println("No short circuit!");
        return false;
    }
}

1

|| দুটি মান বা 'বুলিয়ান মান প্রদান করে (এটি কেন একটি লজিকাল হিসাবে পরিচিত বা এটি)

অর্থাৎ,

if (A || B) 

সত্যই যদি A বা B হয় সত্য হয়, বা মিথ্যা উভয়ই মিথ্যা হলে প্রত্যাবর্তন করবে।

| হ'ল একটি অপারেটর যা দুটি মানের জন্য কিছুটা বিটওয়াইজ অপারেশন করে। বিটওয়াইজ অপারেশনগুলি আরও ভালভাবে বুঝতে, আপনি এখানে পড়তে পারেন:

http://en.wikipedia.org/wiki/Bitwise_operation


1

একটি প্রধান পার্থক্য হ'ল || এবং&& "শর্ট সার্কিট" প্রদর্শন করে, সুতরাং প্রয়োজনে আরএইচএস কেবল মূল্যায়ন করা হবে।

যেমন যেমন

if (a || b) {
    path1...
} else {
    path2..
}

উপরে যদি সত্য হয় তবে b পরীক্ষা করা হবে না এবং পাথ 1 কার্যকর হবে। যদি | ব্যবহৃত হয়েছিল তখন উভয় পক্ষকে মূল্যায়ন করা হবে এমনকি যদি 'এ' সত্য হয়।

আরও কিছু তথ্যের জন্য এখানে এবং এখানে দেখুন।

আশাকরি এটা সাহায্য করবে.


1

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

class foo {

    ArrayList<Bar> list1 = new ArrayList<Bar>();
    ArrayList<Bar> list2 = new ArrayList<Bar>();

    //Returns true if bar is removed from both lists, otherwise false.
    boolean removeBar(Bar bar) {
        return (list1.remove(bar) & list2.remove(bar));
    }
}

যদি আপনার পদ্ধতিটি পরিবর্তে শর্তসাপেক্ষ অপারেন্ড ব্যবহার করে, তবে প্রথম তালিকাটি মিথ্যা প্রমাণিত হলে এটি দ্বিতীয় তালিকা থেকে অবজেক্টটি সরিয়ে ফেলতে ব্যর্থ হবে।

//Fails to execute the second remove if the first returns false.
boolean removeBar(Bar bar) {
    return (list1.remove(bar) && list2.remove(bar));
}

এটি আশ্চর্যজনকভাবে কার্যকর নয় এবং (বেশিরভাগ প্রোগ্রামিংয়ের কাজ হিসাবে) আপনি অন্যান্য উপায়ে এটি অর্জন করতে পারেন। তবে এটি বিটওয়াইজ অপারেন্ডগুলির জন্য একটি ব্যবহারের কেস।


1

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

int two = -2; int four = -4;
result = two | four; // bitwise OR example

System.out.println(Integer.toBinaryString(two));
System.out.println(Integer.toBinaryString(four));
System.out.println(Integer.toBinaryString(result));

Output:
11111111111111111111111111111110
11111111111111111111111111111100
11111111111111111111111111111110

আরও পড়ুন: http://javarevisited.blogspot.com/2015/01/differences-between-bitwsie-and-logical.html#ixzz45PCxdQhk


অপারেশনগুলি বুলিয়ান এবং মূup় বিন্যাসকরণে অসন্তুষ্ট হয়।
লার্নের মারকুইস

2
কেন Long.valueOf (100 | 200) = 236 বোঝার জন্য এটি আমার পক্ষে সহায়ক ছিল Here এখানে কেন: 0 1 1 0 0 1 0 0 | 1 1 0 0 1 0 0 0 = 1 1 1 0 1 1 0 0 = 128 64 32 0 8 4 0 0 = 236
দানিস

1

যখন আমার এই প্রশ্নটি হয়েছিল আমি এ সম্পর্কে ধারণা পেতে পরীক্ষার কোড তৈরি করেছি।

public class HelloWorld{

   public static boolean bool(){
      System.out.println("Bool");
      return true;
   }

   public static void main(String []args){

     boolean a = true;
     boolean b = false;

     if(a||bool())
     {
        System.out.println("If condition executed"); 
     }
     else{
         System.out.println("Else condition executed");
     }

 }
}

এই ক্ষেত্রে, আমরা কেবল শর্তটি a বা b যোগ করলে বাম দিকের মানটি পরিবর্তন করব।

|| দৃশ্য, যখন বাম দিকটি সত্য [যদি (একটি || বুল ())]

আউটপুট "If condition executed"

|| পরিস্থিতি, যখন বাম দিকটি মিথ্যা [যদি (খ || বুল ())]

Output-

Bool
If condition executed

Conclusion of || ব্যবহার করার সময় ||ডান দিকটি কেবল বাম দিকটি মিথ্যা কিনা তা পরীক্ষা করে দেখুন।

| পরিস্থিতি, যখন বাম দিকটি সত্য [যদি (একটি | বুল ())]

Output-

Bool
If condition executed

| পরিস্থিতি, যখন বাম দিকটি মিথ্যা [যদি (b | bool ())]

Output-

Bool
If condition executed

Conclusion of | ব্যবহার করার সময় |, বাম এবং ডানদিকে উভয় চেক করুন।


0

| = বিটওয়াইস বা, || = যুক্তি বা


2
মিস করছি | এটি একটি অ-শর্ট-সার্কিটিং বুলিয়ান অপারেটরও।
জন মেঘের

0

প্রাক বর্ধিত এবং পোস্ট ইনক্রিমেন্ট অপারেটর থাকাকালীন আমি সাধারণত ব্যবহার করি। নিম্নলিখিত কোডটি দেখুন:

package ocjpPractice;
/**
 * @author tithik
 *
 */
public class Ex1 {

    public static void main(String[] args) {
    int i=10;
    int j=9;
    int x=10;
    int y=9;
    if(i==10 | ++i>j){
        System.out.println("it will print in first if");  
        System.out.println("i is: "+i);
    }

    if(x==10 ||++x>y){
        System.out.println("it will print in second if");   
        System.out.println("x is: "+x);
    }
    }
}

আউটপুট:

এটি
আমি প্রথম হলে মুদ্রণ করবে : 11

এটি এক্সতে যদি
10 হয় তবে এটি দ্বিতীয়টি মুদ্রণ করবে

উভয় ifব্লক একই তবে ফলাফল পৃথক। যখন |উভয় শর্ত মূল্যায়ন করা হবে। তবে এটি যদি হয় তবে এটি ||দ্বিতীয় শর্তটি মূল্যায়ন করবে না কারণ প্রথম শর্তটি ইতিমধ্যে সত্য।


1
আমি এটি খুব বিভ্রান্তকর মনে করি
নিমচিম্পস্কি

0

অনেক ব্যবহারের ক্ষেত্রে পরামর্শ কেন তুমি যেতে উচিত ||বদলে |। কিছু ব্যবহারের ক্ষেত্রে আছে ব্যবহার |সব শর্ত চেক করতে অপারেটর।

উদাহরণস্বরূপ, আপনি যদি ফর্মের বৈধতা যাচাই করতে চান এবং আপনি ব্যবহারকারীকে কেবল একটি প্রথম অবৈধ ক্ষেত্রের পরিবর্তে ত্রুটি পাঠ্য সহ সমস্ত অবৈধ ক্ষেত্রটি প্রদর্শন করতে চান

|| অপারেটর হবে,

   if(checkIfEmpty(nameField) || checkIfEmpty(phoneField) || checkIfEmpty(emailField)) {
      // invalid form with one or more empty fields
   }

   private boolean checkIfEmpty(Widget field) {
      if(field.isEmpty()) {
        field.setErrorMessage("Should not be empty!");
        return true;
      }
      return false;
   }

সুতরাং উপরের স্নিপেটের সাথে, ব্যবহারকারী যদি সমস্ত খালি ক্ষেত্রের সাথে ফর্মটি জমা দেয় তবে কেবল nameFieldত্রুটি বার্তায় প্রদর্শিত হবে। তবে, আপনি যদি এটিকে পরিবর্তন করেন,

   if(checkIfEmpty(nameField) | checkIfEmpty(phoneField) | checkIfEmpty(emailField)) {
      // invalid form with one or more empty fields
   }

এটি trueশর্ত নির্বিশেষে প্রতিটি ক্ষেত্রে সঠিক ত্রুটির বার্তা প্রদর্শন করবে ।


0

|যৌক্তিক অপারেটর হিসাবে জাভা প্যাটার্ন অনুশীলনের সাথে সামঞ্জস্য রেখে যদি সাবধানতার সাথে এই বিষয়টি পড়ার পরে আমার কাছে এখনও অস্পষ্ট হয় ।

আমি সম্প্রতি একটি মন্তব্যে সম্বোধন করে একটি টানার অনুরোধে কোডটি সংশোধন করেছি

if(function1() | function2()){
  ...
}

থেকে পরিবর্তন করতে হয়েছিল

boolean isChanged = function1();
isChanged |= function2();
if (isChanged){
  ...
}

প্রকৃত স্বীকৃত সংস্করণটি কী?

জাভা ডকুমেন্টেশনগুলি লজিকাল নন-শর্টসার্কুইটিং ওআর অপারেটর হিসাবে উল্লেখ করছে না|

কোনও ভোটে আগ্রহী নন তবে মান খুঁজে বের করতে আরও কি?! উভয় কোড সংস্করণ সংকলন এবং প্রত্যাশার মতো কাজ করছে।





-2

| একটি বিটওয়াস অপারেটর। || একটি লজিকাল অপারেটর।

একজনের জন্য দুটি বিট এবং তাদের নেওয়া হবে।

একজন সত্য নির্ধারণ করবে (এটি বা এটি) যদি এটি সত্য হয় বা এটি সত্য হয় তবে উত্তরটি সত্য।

ওহ, এবং ডাং লোকেরা এই প্রশ্নের দ্রুত উত্তর দেয়।

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