&& (এবং) এবং || (বা) যদি বিবৃতিতে


137

আমার কাছে নিম্নলিখিত কোড রয়েছে:

if(!partialHits.get(req_nr).containsKey(z) || partialHits.get(req_nr).get(z) < tmpmap.get(z)){  
    partialHits.get(z).put(z, tmpmap.get(z));  
}

যেখানে partialHitsএকটি হ্যাশম্যাপ।
প্রথম বক্তব্য সত্য হলে কী হবে? জাভা এখনও দ্বিতীয় বিবৃতি চেক করবে? কারণ প্রথম বিবৃতিটি সত্য হওয়ার জন্য, হ্যাশম্যাপে প্রদত্ত কীটি থাকা উচিত নয়, সুতরাং দ্বিতীয় বিবৃতিটি যদি পরীক্ষা করা হয় তবে আমি পেয়ে যাব NullPointerException
সুতরাং সহজ কথায়, যদি আমাদের নিম্নলিখিত কোড থাকে

if(a && b)  
if(a || b)

জাভা কি প্রথম ক্ষেত্রে মিথ্যা কিনা এবং দ্বিতীয় ক্ষেত্রে সত্য bকিনা aতা পরীক্ষা করে দেখাবে a?

উত্তর:


202

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

if (str != null && !str.isEmpty()) {
  doSomethingWith(str.charAt(0));
}

কাছাকাছি বা অন্যান্য উপায়

if (str == null || str.isEmpty()) {
  complainAboutUnusableString();
} else {
  doSomethingWith(str.charAt(0));
}

জাভাতে যদি আমাদের 'শর্ট সার্কিট' না থাকে তবে আমরা উপরের কোডের লাইনগুলিতে প্রচুর নলপয়েন্টারএক্সেপশন পেয়ে যাব।


আপনি কীভাবে উভয় এক্সপ্রেশনকে মূল্যায়ন করতে পারেন তাতে কি বিটওয়াইজের তুলনা বিদ্যমান ? অর্থাত্ যদি (str! = নাল | str.isEmpty ())? (অবশ্যই এটি ব্যবহারিক উদাহরণ নয়, বাস্তবে এটি নির্বোধ, তবে আপনি ধারণাটি পাবেন)
কেজজার

5
যতক্ষণ অভিব্যক্তিগুলির পার্শ্ব প্রতিক্রিয়া না থাকে ততক্ষণ শর্ট সার্কিট শব্দার্থবিজ্ঞান যুক্তিযুক্তভাবে সম্পূর্ণ মূল্যায়নের সমতুল্য। এটি হ'ল, যদি এ সত্য হয় তবে আপনি জানেন যে এ বি বি এর মূল্যায়ন না করে সত্য The কেবলমাত্র কোনও সময় পার্থক্য তৈরি হবে যদি কোনও অভিব্যক্তিটির পার্শ্ব প্রতিক্রিয়া হয়। অন্যান্য অপারেটর হিসাবে, আপনি ব্যবহার করতে পারেন *এবং +হিসাবে যৌক্তিক andএবং or; ((A?1:0) * (B?1:0)) == 1, ((A?1:0) + (B?1:0)) > 0। এমনকি আপনি কি করতে পারেন xor: ((A?1:0) + (B?1:0)) == 1
outis

1
@ কেজ্জার: আসলেই কি বিটের দিকের তুলনা? আমি মনে করি এটি একজন boolean(যৌক্তিক) অপারেটর। এটি bitwiseএকই সংকেত থাকা সত্ত্বেও (পূর্ণসংখ্যা) অপারেটরের চেয়ে পৃথক ...
ব্যবহারকারী 85421

4
যখন আপনি'&& 'এবং' || 'এর মধ্যে স্যুইচ করতে চান তখন একটি সহজ কৌশল এক্সপ্রেশনগুলি সম্পূর্ণরূপে প্রকাশকে তুচ্ছ করা হয়, যাতে: !(str != null && !str.isEmpty()) হয়ে যায়: (str !(!=) null !(&&) !(!)str.isEmpty()) এবং তার পরে: (str == null || str.isEmpty()) কারণ: !(!=) is == !(&&) is || !(!) eliminates itself অন্যান্য সহায়ক !(<) is >= !(>) is <=
অবহেলাগুলি হ'ল

68

জাভাতে 5 টি আলাদা বুলিয়ান তুলনা অপারেটর রয়েছে: &, &&, |, ||, ^ ^

& এবং& হল "এবং" অপারেটর, | এবং || "বা" অপারেটর, "হ'ল" জোর "

এককগুলি পরামিতিগুলির মানগুলি পরীক্ষা করার আগে মানগুলি নির্বিশেষে প্রতিটি পরামিতি পরীক্ষা করবে। ডাবলগুলি প্রথমে বাম প্যারামিটার এবং তার মানটি পরীক্ষা করবে এবং true( ||) বা false( &&) দ্বিতীয়টিকে যদি কোনও ছোঁয়া না ফেলে। শব্দ সংকলিত? একটি সহজ উদাহরণ এটি পরিষ্কার করা উচিত:

সমস্ত উদাহরণের জন্য দেওয়া:

 String aString = null;

এবং:

 if (aString != null & aString.equals("lala"))

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

 if (aString != null && aString.equals("lala"))

প্রথম প্যারামিটারটি চেক করা হয়েছে এবং এটি ফিরে আসে false, তাই দ্বিতীয় প্যারামিটারটি চেক করা হবে না, কারণ ফলাফল falseযাইহোক is

বা এর জন্য একই:

 if (aString == null | !aString.equals("lala"))

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

 if (aString == null || !aString.equals("lala"))

প্রথম প্যারামিটারটি চেক করা হয়েছে এবং এটি ফিরে আসে true, তাই দ্বিতীয় প্যারামিটারটি চেক করা হবে না, কারণ ফলাফল trueযাইহোক is

এক্সওআরটি অনুকূলিত করা যায় না, কারণ এটি উভয় পরামিতির উপর নির্ভর করে।


3
"জাভাতে 4 টি আলাদা বুলিয়ান তুলনা অপারেটর রয়েছে: &, &&, |, ||" ... আপনি ^(xor) ভুলে যাচ্ছেন ।
আইয়ুব

ওহ, আমি জানতাম না এটি বুলিয়ান বুলিয়ান মানগুলিও পরীক্ষা করে। এটি এখন পর্যন্ত বিটমাস্কগুলির জন্য ব্যবহার করেছেন।
হার্ডকোড


20

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

বিভাগ 15: 15, শর্তসাপেক্ষে এবং অপারেটর (&&) , বলেছেন:

&& অপারেটরটি & (§15.22.2) এর মতো, তবে কেবলমাত্র তার বাম-হাতের ক্রিয়াকলাপের মানটি সত্য হলে তার ডান হাতের ক্রিয়াকলাপটিকে মূল্যায়ন করে। [...] চলাকালীন সময়ে, বাম-হাতের ক্রিয়াকলাপের এক্সপ্রেশনটি প্রথমে মূল্যায়ন করা হয় [...] যদি ফলাফলের মানটি মিথ্যা হয়, শর্তাধীন-এবং অভিব্যক্তির মান মিথ্যা এবং ডান হাতের অপারেণ্ড এক্সপ্রেশনটির মূল্যায়ন হয় না । যদি বাম-হাতের ক্রিয়াকলাপের মানটি সত্য হয় তবে ডান হাতের অভিব্যক্তিটি মূল্যায়ন করা হয় [...] ফলে প্রাপ্ত মানটি শর্তাধীন এবং অভিব্যক্তির মান হয়ে যায়। সুতরাং, && বুলিয়ান অপারেন্ডগুলির হিসাবে এবং একই ফলাফলকে গণনা করে। এটি কেবলমাত্র ডান হাতের অপারেন্ড এক্সপ্রেশনটি সর্বদা পরিবর্তে শর্তসাপেক্ষে মূল্যায়ন করা হয় তার মধ্যে পৃথক।

এবং একইভাবে, বিভাগ 15:24, শর্তাধীন-বা অপারেটর (||) বলেছেন:

দি || অপারেটর মত | (§15.22.2), তবে কেবলমাত্র তার বাম-হাতের ক্রিয়াকলাপের মানটি মিথ্যা হলে তার ডান হাতের ক্রিয়াকলাপটিকে মূল্যায়ন করে। [...] রান সময়ে, বাম-হাতের ক্রিয়াকলাপটি প্রথমে মূল্যায়ন করা হয়; [...] যদি ফলাফলটি মানটি সত্য হয় তবে শর্তাধীন-বা অভিব্যক্তির মান সত্য এবং ডান হাতের ক্রিয়াকলাপের এক্সপ্রেশনটি মূল্যায়ন করা হয় না। যদি বাম-হাতের ক্রিয়াকলাপের মানটি মিথ্যা হয় তবে ডান হাতের অভিব্যক্তিটি মূল্যায়ন করা হয়; [...] ফলাফলটি শর্তযুক্ত-বা ভাবের মান হয়ে যায়। এইভাবে, || | হিসাবে একই ফলাফল গণনা বুলিয়ান বা বুলিয়ান অপারেশনগুলিতে। এটি কেবলমাত্র ডান হাতের অপারেন্ড এক্সপ্রেশনটি সর্বদা পরিবর্তে শর্তসাপেক্ষে মূল্যায়ন করা হয় তার মধ্যে পৃথক।

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

int x = (y == null) ? 0 : y.getFoo();

একটি নালপয়েন্টার এক্সসেপশন ছাড়াই।


6

না, যদি একটি সত্য হয় (একটি orপরীক্ষায়), খ পরীক্ষা করা হবে না, কারণ পরীক্ষার ফলাফল সর্বদা সত্য হবে, খ এর এক্সপ্রেশনটির মান যাই হোক না কেন।

একটি সহজ পরীক্ষা করুন:

if (true || ((String) null).equals("foobar")) {
    ...
}

নিক্ষেপ করবে নাNullPointerException !


6

এখানে শর্ট সার্কিটের অর্থ দ্বিতীয় শর্তটি মূল্যায়ন করা হবে না।

যদি (এএন্ডএন্ড বি) শর্ট সার্কিটের ফলস্বরূপ যদি এ মিথ্যা হয় তবে।

যদি (A&&B) এর ফলাফলটি সত্য হয় তবে সংক্ষিপ্ত সার্কিট তৈরি হবে না

যদি (এ || বি) শর্ট সার্কিটের ফলাফল করে তবে যদি এটি সত্য হয়।

(একটি || বি) হবে না শর্ট সার্কিট ফলে যদি একটি মিথ্যা নয়।


4

না এটি হবে না, জাভা শর্ট সার্কিট করবে এবং ফলাফলটি জানার পরে মূল্যায়ন বন্ধ করবে।


4

হ্যাঁ, বুলিয়ান এক্সপ্রেশনগুলির জন্য শর্ট সার্কিট মূল্যায়ন হ'ল সমস্ত সি-জাতীয় পরিবারে ডিফল্ট আচরণ।

একটি উত্সাহব্যঞ্জক সত্য যে জাভা এছাড়াও ব্যবহার করে &এবং |লজিক operands (তারা ওভারলোড করা হয়, সঙ্গে intধরনের তারা প্রত্যাশিত, bitwise অপারেশন হয়) অভিব্যক্তি, যা দরকারী যখন আপনি পার্শ্ব প্রতিক্রিয়া প্রয়োজন সমস্ত শর্তাবলী নির্ণয় করা।


এটি মনে রাখা আকর্ষণীয়: উদাহরণস্বরূপ কোনও মেথড চেঞ্জডাটা (ডেটা) দেওয়া যা একটি বুলিয়ান দেয়, তারপরে: যদি (a.changeData (ডেটা) || বি। .c a.changeData () সত্য প্রত্যাবর্তন করে বি তে চেঞ্জডেটা চালায় না, তবে (a.changeData (ডেটা) | b.changeData (ডেটা)) {doSomething () a এ এবং বি, উভয়ই চেঞ্জডেটা () চালায় যদি কেউ প্রত্যাবর্তিত সত্য হয়।
সাম্পিসা

0

এটি & এবং&&, | এর মধ্যে মূল পার্থক্যটিতে ফিরে যায় এবং ||

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

Z z2 = partialHits.get(req_nr).get(z); // assuming a value cannout be null.
Z z3 = tmpmap.get(z); // assuming z3 cannot be null.
if(z2 == null || z2 < z3){   
    partialHits.get(z).put(z, z3);   
} 
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.