জাভা & = অপারেটর & বা && প্রয়োগ করে?


139

অভিমানী

boolean a = false;

আমি ভাবছিলাম:

a &= b; 

সমতুল্য

a = a && b; //logical AND, a is false hence b is not evaluated.

বা অন্যদিকে এর অর্থ

a = a & b; //Bitwise AND. Both a and b are evaluated.

উত্তর:


146

জাভা ভাষার স্পেসিফিকেশন থেকে - 15.26.2 যৌগিক অ্যাসাইনমেন্ট অপারেটর

ফর্ম একটি যৌগ নিয়োগ অভিব্যক্তি E1 op= E2সমতূল্য E1 = (T)((E1) op (E2)), যেখানে Tপ্রকার E1, যে ব্যতীত E1শুধুমাত্র একবার মূল্যায়ন করা হয়।

সুতরাং a &= b;সমতূল্য a = a & b;

(কিছু ব্যবহারের ক্ষেত্রে, টাইপ-কাস্টিং ফলাফলের ক্ষেত্রে একটি পার্থক্য তৈরি করে তবে এর মধ্যে একটি bহওয়া দরকার booleanএবং টাইপ-কাস্ট কিছুই করতে পারে না))

এবং, রেকর্ডের জন্য, a &&= b;বৈধ জাভা নয়। কোনও &&=অপারেটর নেই।


অনুশীলনে, এর মধ্যে a = a & b;এবং এর মধ্যে সামান্য অর্থগত পার্থক্য রয়েছে a = a && b;। (যদি bকোনও পরিবর্তনশীল বা ধ্রুবক হয় তবে ফলাফল উভয় সংস্করণের জন্য একই হতে চলেছে There bপার্শ্ব-প্রতিক্রিয়াযুক্ত এমন একটি সবেশন এক্সপ্রেশন হলে কেবল একটি অর্থগত পার্থক্য থাকে the &ক্ষেত্রে, পার্শ্ব-প্রতিক্রিয়া সর্বদা দেখা যায় In &&যদি এটির মান নির্ভর করে তবে এটি ঘটে a))

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


আপনার "অনুশীলনে" অনুচ্ছেদটি বিভ্রান্তিকর। & ওভার অ্যান্ড ও ব্যবহারের একমাত্র কারণ হ'ল "বি" তে
অপ্রয়োজনীয় সুব্রপ এক্সারেশন

ব্যাখ্যা। (আসলে, তুচ্ছ সত্যই এর মধ্যে আসে না))
স্টিফেন সি

51

জেএলএসের 15.22.2 দেখুন । বুলিয়ান অপারেন্ডগুলির জন্য, &অপারেটর বুলিয়ান, বিটওয়াইজ নয়। &&এবং মধ্যে একমাত্র পার্থক্য&বুলিয়ান অপারেন্ডগুলির for&& এটির জন্য স্বল্প সংক্ষিপ্তসার (অর্থাত প্রথম অপারেন্ড মিথ্যা হিসাবে মূল্যায়ন করলে দ্বিতীয় অপারেন্ডকে মূল্যায়ন করা হয় না)।

সুতরাং আপনার ক্ষেত্রে, যদি bএকটি আদিম হয় a = a && b, a = a & bএবং a &= bএকই জিনিস সব করতে।


2
সুতরাং (a & = b;) বি পদ্ধতিগত কল হলে শর্ট সার্কিট করবে না? "&& =" অপারেটরের মতো কিছু আছে কি?
is7s

2
দেখে মনে হচ্ছে এটি প্রশ্নের উত্তর দেয় না; শর্ট সার্কিট সম্পর্কে ওপি ইতিমধ্যে জানত।
বা ম্যাপার


0

এটি পরীক্ষা করার জন্য এখানে একটি সহজ উপায়:

public class OperatorTest {     
    public static void main(String[] args) {
        boolean a = false;
        a &= b();
    }

    private static boolean b() {
        System.out.println("b() was called");
        return true;
    }
}

আউটপুট হয় b() was called , অতএব ডান হাতের অপারেন্ড মূল্যায়ন করা হয়।

সুতরাং, অন্যদের দ্বারা ইতিমধ্যে উল্লিখিত হিসাবে, a &= bএকই a = a & b


-2

আমি বুলিয়ান ব্যবহার করে একই ধরণের পরিস্থিতি পেয়েছি যেখানে আমি বি () এর কলটি এড়াতে চেয়েছিলাম যদি ইতিমধ্যে মিথ্যা থাকে।

এটি আমার পক্ষে কাজ করেছে:

a &= a && b()

25
অপ্রয়োজনীয়তা এড়াতে (এখনও সংক্ষিপ্ত সার্কিট করার অনুমতি দেয়), আপনি কেবল লিখতে পারেন a=a&&b()
উনাই ভিভি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.