تفاوت عملگر & و && در جاوا


به نام تنها برنامه نویس هستی

دیروز نصفه شبی یهو به سرم زد که تفاوت دو تا عملگر(operator) & و && رو تو جاوا یه بررسی عملی بکنم. بعد اینکه فهمیدم گفتم یه مقاله حتی کوتاه در موردش بنویسم شاید به درد کسی خورد.

اول یه توضیح سریع در مورد عملگر و عملوند(operand) رو با مثال برا کسایی که نمی دونند بگم. عبارت 2*3 در نظر بگیرید. اینجا 2 و 3 عملوند حساب می شن و * هم عملگر(حوصله نداشتم تعریفش اش بچینم). تو زمینه برنامه نویسی هم مثلا وقتی میگیم a&b اینجا درحقیقت a و b عملوند حساب میشن و && هم عملگر.

بگذریم..بریم سراغ مقایسه. دو تا عملگر && و & رو از چند لحاظ میشه بررسی کرد:

  • عملگر & میتونه با اعداد و boolean ها مورد استفاده قرار بگیره ولی عملگر && فقط میتونه با boolean ها استفاده بشه.
int a = 9;
int b = 7;
System.out.println(a & b);
System.out.println((a>2) & (b<5));
.....
System.out.println(a && b); //compile error: Operator '&&' cannot be applied to 'int', 'int'
System.out.println((a>2) && (b<5));
  • در رابطه با boolean ها، تو عملگر & ابتدا دو عملوند مقدارشون ارزیابی میشه و بعد AND میشن در صورتی که تو عملگر && اگر مقدار عبارت سمت چپی false بشه دیگه عبارت سمت راستی ارزیابی نمیشه و نتیجه هم false میشه.
String name = null;
System.out.println(name != null & !name.isEmpty()); //runtime exception: java.lang.NullPointerException

خروجی کد بالا یک اکسپشن از نوع NullPointerException هست. در صورتی که خروجی کد پایین برابر false هست و خطایی رخ نمیده:

String name = null;
System.out.println(name != null && !name.isEmpty());
  • عملگر && یک عملگر منطقی هست در صورتی که عملگر & یک عملگر بیتی هست، به این معنی که میاد تک تک بیت های عملوند هاش رو با هم دیگه AND می کنه و جواب اون رو تو خروجی نهایی اضافه می کنه. وقتی دو تا بیت با هم دیگه AND میشن، تنها موقعی جواب یک میشه که هر دوشون 1 باشند در غیر اینصورت نتیجه 0 میشه. به مثال زیر دقت کنید:
System.out.println(9&7);

چیزی که تو خروجی چاپ میشه برای کد بالا برابر عدد 1 هست. به دلیل زیر:

reason:
9 => 1001
7 => 0111
  => 0001

همون طور که می بینید عدد 9 در مبنای باینری برابر 1001 و عدد 7 برابر 0111 میشه. وقتی تک تک بیت های این دو عدد نظیر به نظیر با هم دیگه AND میشن، عدد حاصل برابر 0001 میشه که در مبنای decimal(همون ده دهی خودمون) برابر 1 میشه.

امیدوارم مفید واقع بشه.