জাভা লজিকাল অপারেটর শর্ট সার্কিট


102

কোন সেটটি শর্ট সার্কিট হয়, এবং জটিল শর্তসাপেক্ষ এক্সপ্রেশনটি সংক্ষিপ্ত-সংকেত হয় এর সঠিক অর্থ কী?

public static void main(String[] args) {
  int x, y, z;

  x = 10;
  y = 20;
  z = 30;

  // T T
  // T F
  // F T
  // F F

  //SET A
  boolean a = (x < z) && (x == x);
  boolean b = (x < z) && (x == z);
  boolean c = (x == z) && (x < z);
  boolean d = (x == z) && (x > z);
  //SET B    
  boolean aa = (x < z) & (x == x);
  boolean bb = (x < z) & (x == z);
  boolean cc = (x == z) & (x < z);
  boolean dd = (x == z) & (x > z);

}

4
: এই প্রশ্ন দেখতে পাবেন stackoverflow.com/questions/7101992/...
Eng.Fouad

উত্তর:


247

&&এবং ||অপারেটরদের "শর্ট সার্কিট", যার মানে তারা সঠিক দিকে মূল্যায়ন না হলে এটা প্রয়োজন হয় না।

&এবং |অপারেটর, যখন যৌক্তিক অপারেটার হিসাবে ব্যবহার, সবসময় উভয় পক্ষের নির্ণয় করা।

প্রতিটি অপারেটরের জন্য শর্ট সার্কিটের কেবল একটি ক্ষেত্রে রয়েছে এবং সেগুলি হ'ল:

  • false && ...- ডান দিকের দিকটি কী তা জানা দরকার নেই কারণ ফলাফলটি কেবল falseসেখানে মান নির্বিশেষেই হতে পারে
  • true || ...- ডান দিকের দিকটি কী তা জানা দরকার নেই কারণ ফলাফলটি কেবল trueসেখানে মান নির্বিশেষেই হতে পারে

আসুন আচরণটি একটি সাধারণ উদাহরণে তুলনা করুন:

public boolean longerThan(String input, int length) {
    return input != null && input.length() > length;
}

public boolean longerThan(String input, int length) {
    return input != null & input.length() > length;
}

২ য় সংস্করণটি নন-শর্ট-সার্কিট অপারেটর ব্যবহার করে &এবং NullPointerExceptionযদি inputহয় nullতবে একটি নিক্ষেপ করবে , তবে 1 ম সংস্করণটি falseব্যতিক্রম ছাড়াই ফিরে আসবে ।


9
আমি এই উত্তরটি কিছুটা বাড়িয়ে দিতে চাই। & = অপারেটরটি এক্স = এক্স এবং এক্সপ্রেশনের জন্য একটি শর্টহ্যান্ড এবং তাই শর্ট সার্কিট নয়। | = অপারেটরের ক্ষেত্রেও একই কথা।
স্টর্মক্লাউড

11
আমি একটি বিষয় হাইলাইট করতে চাই, | এবং & বাইনারি অপারেটর হয়, যখন && এবং || শর্তসাপেক্ষে (যৌক্তিক) অপারেটরগুলি। | এবং & বুলিয়ান ছাড়াও বেশি কাজ করুন, যখন && এবং || শুধুমাত্র বুলিয়ান উপর কাজ।
একটি পৌরাণিক কাহিনী 18

4
তারা ডান হাতের অভিব্যক্তিটি কেবল মূল্যায়ন করে না, মূল্যায়নের জন্য কিছু থাকার জন্য কোডটি কার্যকর করা হয় না। এটি বোঝার একটি গুরুত্বপূর্ণ বিষয় যদি কোনও পার্শ্ব প্রতিক্রিয়া তৈরি হয় তবে।
ম্যাকেনজম

@ এমকেনজম মূল্যায়ন ও সম্পাদন করার মধ্যে পার্থক্য কী?
ক্রোনেন

@ ক্রোনেন এক্সিকিউশনের ফলে মূল্যায়নের চেয়ে বেশি ফলাফল হতে পারে এবং এর ব্যতিক্রম বা বিলম্বের মতো পার্শ্ব প্রতিক্রিয়া তৈরি হতে পারে, আমি এই উদাহরণের সাথে প্রাসঙ্গিক দেব না।
mckenzm

9

এসইটি এ শর্ট সার্কিটকারী বুলিয়ান অপারেটর ব্যবহার করে।

বুলিয়ান অপারেটরদের প্রসঙ্গে 'শর্ট সার্কিটাইটিং' বলতে কী বোঝায় তা হ'ল এই বুলিয়ানগুলির প্রথমটি সত্য হওয়ার সাথে সাথে শর্ট সার্কিট সংস্করণগুলি মূল্যায়ন বন্ধ করে দেবে (|| ) বা মিথ্যা (&&)

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

// 2 == 2 will never get evaluated because it is already clear from evaluating
// 1 != 1 that the result will be false.
(1 != 1) && (2 == 2)

// 2 != 2 will never get evaluated because it is already clear from evaluating
// 1 == 1 that the result will be true.
(1 == 1) || (2 != 2)

দয়া করে নির্দিষ্ট করে দিন যে &&||
এটির

4
প্রকৃতপক্ষে, সত্যই সম্পূর্ণ হওয়ার জন্য &&, সমস্তটি ||, &এবং |বাম থেকে ডানদিকে মূল্যায়ন। বুলিয়ানস বি 1, বি 2, ..., বিএন এর সেটগুলির জন্য, যখন এই বুলিয়ানগুলির প্রথমটি সত্য ( ||) বা মিথ্যা ( &&) হয় তখন শর্ট সার্কিট সংস্করণগুলি মূল্যায়ন বন্ধ করে দেয় । ); বাঃ, নীতি নেই
fge

@ ফিজ: হ্যাঁ, আপনি অবশ্যই ঠিক বলেছেন। আপনার সংজ্ঞা আমার চেয়ে এক্সটেক্টর। আমি আপনার মন্তব্যে বাক্যটি দিয়ে আমার উত্তর আপডেট করেছি। আমি আশা করি আপনি কিছু মনে করবেন না।
আফ্রিচেকে

কোনও উদ্বেগ নেই, জ্ঞানটি ভাগ না করা থাকলে তার কোনও মূল্য নেই।
fge

4

সংক্ষিপ্ত সঞ্চালন মানে প্রথম অপারেটর চূড়ান্ত ফলাফলের সিদ্ধান্ত নিলে দ্বিতীয় অপারেটরটি পরীক্ষা করা হবে না।

যেমন এক্সপ্রেশন: সত্য || মিথ্যা

|| এর ক্ষেত্রে, সত্য হওয়া আমাদের একদিকে থাকা দরকার। সুতরাং বাম দিকটি যদি সত্য হয় তবে ডান হাতের দিকটি পরীক্ষা করে দেখার কোনও মানে নেই এবং তাই এটি মোটেও পরীক্ষা করা হবে না।

একইভাবে, মিথ্যা && সত্য

&& এর ক্ষেত্রে, সত্য হতে আমাদের উভয় পক্ষের প্রয়োজন । সুতরাং বাম হাতটি যদি মিথ্যা হয় তবে ডান হাতের চেক করার কোনও মানে নেই, উত্তরটি মিথ্যা হতে হবে। এবং সেজন্য এটি মোটেও পরীক্ষা করা হবে না।


4
boolean a = (x < z) && (x == x);

এই ধরণের শর্ট সার্কিট হবে, অর্থাত্ যদি (x < z)এটি মিথ্যা হিসাবে মূল্যায়ন করে তবে পরেরটির মূল্যায়ন হয় না, aমিথ্যা &&হবে , অন্যথায় এটিও মূল্যায়ন করবে (x == x)

& এটি একটি বিটওয়াস অপারেটর, তবে এটি একটি বুলিয়ান এবং অপারেটর যা শর্ট সার্কিট নয়।

আপনি নিম্নলিখিত হিসাবে তাদের কিছু পরীক্ষা করতে পারেন (প্রতিটি ক্ষেত্রে পদ্ধতিটি কতবার ডাকা হয় দেখুন):

public static boolean getFalse() {
    System.out.println("Method");
    return false;
}

public static void main(String[] args) {
    if(getFalse() && getFalse()) { }        
    System.out.println("=============================");        
    if(getFalse() & getFalse()) { }
}

-1 আপনার উত্তরটি বোঝায় যে &এটি কেবলমাত্র বিটওয়াস অপারেটর, তবে এটি সত্য নয়। এটা এছাড়াও একটি বুলিয়ান "বা" অপারেটর।
বোহেমিয়ান

@ বোহেমিয়ান: মাথা উঁচু করার জন্য ধন্যবাদ। true & falseমিথ্যা যাও মূল্যায়ন। আপনি দয়া করে এই "বুলিয়ান" বা "অপারেটর" ব্যাখ্যা করতে পারেন? আপনি যা বলতে চাইছেন তা আমি পাচ্ছি না May
ভেশে গুরুং

দুঃখিত - আমি বুলিয়ান মানে AND, না OR! যেমন true & falseবৈধ বাক্য গঠন। -1 সরানো হয়েছে :)
বোহেমিয়ান

4

সরল ভাষায়, সংক্ষিপ্ত-প্রচারের অর্থ মূল্যায়ন বন্ধ করা আপনি একবার জানলে উত্তর আর পরিবর্তন করতে পারে না। উদাহরণস্বরূপ, আপনি যদি লজিকাল ANDএর একটি শৃঙ্খলের মূল্যায়ন করে থাকেন এবং আপনি FALSEসেই শৃঙ্খলার মাঝখানে কোনও আবিষ্কার করেন, আপনি জানেন যে ফলটি মিথ্যা হতে চলেছে, শৃঙ্খলে থাকা বাকী বাক্যগুলির মান কী তা বিবেচনা না করেই। একইগুলি একটি শৃঙ্খলার জন্য যায় OR: একবার আপনি আবিষ্কার TRUEকরে ফেললে, আপনি এখনই উত্তরটি জানবেন, এবং তাই আপনি বাকী বাক্য প্রকাশের মূল্যায়ন এড়িয়ে যেতে পারেন।

আপনি জাভাতে নির্দেশ করেছেন যে আপনি &&পরিবর্তে &এবং ||পরিবর্তে ব্যবহার করে শর্ট সার্কিট করতে চান |। আপনার পোস্টের প্রথম সেটটি শর্ট সার্কিট।

নোট করুন যে এটি কয়েকটি সিপিইউ চক্র সংরক্ষণের চেয়ে বেশি চেষ্টা করা হয়েছে: এর মত প্রকাশে

if (mystring != null && mystring.indexOf('+') > 0) {
    ...
}

সংক্ষিপ্ত-সার্কিট মানেই সঠিক অপারেশন এবং ক্রাশের মধ্যে পার্থক্য (যে ক্ষেত্রে মাইস্ট্রিং নাল হয়) is


2

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

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

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

if ( denom != 0 && num / denom >10)

যেহেতু AND ( &&) এর শর্ট সার্কিট ফর্মটি ব্যবহৃত হয়, তাই শূন্য দ্বারা বিভাজন থেকে রান-টাইম ব্যতিক্রম হওয়ার ঝুঁকি নেই। কোডের এই লাইনটি যদি এ্যান্ড এর একক &সংস্করণ ব্যবহার করে লেখা হয় তবে উভয় পক্ষের মূল্যায়ন করতে হবে, denomশূন্য হলে রান-টাইম ব্যতিক্রম ঘটবে ।

বুলিয়ান যুক্তির সাথে জড়িত এবং বিটওয়াইজ অপারেশনের জন্য একক-চরিত্রের সংস্করণগুলি রেখে কেবল শর্ট সার্কিট ফর্মগুলি AND এবং OR এর ব্যবহার করা স্ট্যান্ডার্ড অনুশীলন। তবে, এই নিয়মের ব্যতিক্রম আছে। উদাহরণস্বরূপ, নিম্নলিখিত বিবৃতি বিবেচনা করুন:

 if ( c==1 & e++ < 100 ) d = 100;

এখানে, একটি একক ব্যবহার &নিশ্চিত করে যে বৃদ্ধি অপারেশন প্রয়োগ করা হবে eকিনা cহয় 1 বা না সমান।


2

লজিকাল ওআর: - কমপক্ষে অপারেটরগুলির মধ্যে একটি সত্যকে যদি মূল্যায়ন করে তবে এটি সত্য প্রত্যাবর্তন করে। ওআর অপারেটর প্রয়োগের আগে উভয় অপারেশনকে মূল্যায়ন করা হয়।

শর্ট সার্কিট বা: - যদি বাম হাতের অপারেন্ডটি সত্য করে দেয় তবে ডান হাতের অপারেন্ডকে মূল্যায়ন না করেই সত্যটি ফিরে আসে।


2

সেখানে মধ্যে পার্থক্য একটি দম্পতি আছে &এবং &&অপারেটর। একই পার্থক্য প্রযোজ্য |এবং ||। মনে রাখতে হবে সবচেয়ে গুরুত্বপূর্ণ বিষয় হল &&একটি হল লজিক্যাল সময়, অপারেটর যেটি শুধুমাত্র বুলিয়ান operands প্রযোজ্য &একটি হল , bitwise পূর্ণসংখ্যা ধরনের সেইসাথে Booleans জন্য প্রযোজ্য অপারেটর।

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

(7 == 8) || ( (1 == 3) && (4 == 4))

শুধুমাত্র জোর দেওয়া অংশগুলি মূল্যায়ন করা হবে। গণনা করতে ||, প্রথমে কিনা 7 == 8তা পরীক্ষা করুন true। যদি এটি হয় তবে ডান হাতটি পুরোপুরি বাদ দেওয়া হবে। ডান হাত কেবল আছে কিনা 1 == 3তা পরীক্ষা করে false। যেহেতু এটি তাই, 4 == 4যাচাই করার দরকার নেই এবং পুরো এক্সপ্রেশনটি মূল্যায়ন করে false। যদি বাম পাশের অংশটি থাকে true, উদাহরণস্বরূপ 7 == 7পরিবর্তে 7 == 8, পুরো ডান হাতটি এড়িয়ে যায় কারণ পুরো ||অভিব্যক্তি trueনির্বিশেষে হবে।

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


1
if(demon!=0&& num/demon>10)

যেহেতু AND (এবং&) এর শর্ট সার্কিট ফর্মটি ব্যবহার করা হয়, তাই অসুর শূন্য হলে রান-টাইম ব্যতিক্রম হওয়ার ঝুঁকি থাকে না।

রেফারেন্স হারবার্ট শিল্ডের জাভা 2 পঞ্চম সংস্করণ

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