برای ایجاد یک تصمیم گیری، ما می توانیم به هر تعداد که بخواهیم، از عملگرهای || یا && استفاده کنیم.
بعنوان مثال، اگر بخواهیم به هر دانش آموزی که به هر چهار سوال یک آزمون به درستی پاسخ دهد، جایزه اعطا کنیم(جایزه را با متغیر BONUS تعریف می کنیم)، ممکن است کدهای زیر را ایجاد کنیم:
if(score1 == PERFECT || score2 == PERFECT || score3 == PERFECT || score4 == PERFECT)
bonus = BONUS;
else
bonus = 0;
در این مورد، اگر حداقل یکی از متغیرهای نمره برابر با ثابت PERFECT باشد، دانش آموز امتیاز جایزه را دریافت می کند. با اینکه ما می توانیم هر تعداد از && یا || را با یکدیگر ترکیب کنیم، اما هنگام ترکیب آنها، باید مراقبت ویژه ای انجام دهیم.
در فصل 2 آموختید که عملیات ها از تقدم های بیشتر یا کمتری برخوردار هستند و تقدم یک عملگر، باعث تفاوت در چگونگی ارزیابی یک عبارت می شود. بعنوان مثال، در یک عبارت محاسباتی، ضرب و تقسیم همواره قبل از جمع و تفریق انجام می شوند. جدول 5.1 تقدم عملگرهایی که تاکنون مورد استفاده قرار داده ایم را نشان می دهد.
(جدول 5.1 : تقدم عملگرها برای عملگرهایی که تاکنون استفاده کرده ایم)
تقدم | عملگر | نماد |
بیشترین تقدم | NOT منطقی | ! |
تقدم متوسط | ضرب، تقسیم، مدول(باقی مانده یا modulus) | * / % |
جمع و تفریق | - + | |
عملگرهای رابطه ای | > < >= <= | |
عملگرهای برابری | == != | |
عملگر AND منطقی | && | |
عملگر OR منطقی | || | |
عملگر شرطی(Conditional) | :? | |
کمترین تقدم | عملگر انتساب | = |
به طور کلی، ترتیب اولویت ها با آنچه در جبر متداول است مطابقت دارد.
بعنوان مثال، در هر عبارت ریاضی، مانند x = a + b
، اول محاسبه انجام می شود و انتساب در آخر انجام می شود. رابطه && و || ممکن است آنقدر واضح نباشد. عملگر && تقدم بیشتری نسبت به عملگر || دارد. بعنوان مثال، بخش های مشخص شده ی برنامه ی نشان داده شده در تصویر 5.24 را در نظر بگیرید.
از این قطعه کدها انتظار می رود که بخشی از برنامه ی یک شرکت بیمه را تشکیل دهد، که مشخص می کند آیا باید یک حق بیمه اضافی از یک راننده که هردو معیار زیر را دارد، دریافت شود یا خیر:
- بیش از دو بلیط ترافیک(traffic tickets) داشته باشد یا کمتر از 25 سال سن داشته باشد.
- مرد باشد.
(تصویر 5.24 : دو مقایسه با استفاده از && و || )
شماره 1 : عملگر && اول ارزیابی می شود. در این کد، حق بیمه ی اضافی نادرست محاسبه می شود.
شماره 2 : عبارت درون پرانتز داخلی، اول ارزیابی می شود. در این کد، حق بیمه ی اضافی به درستی محاسبه می شود.
نکته: اگر خواستید تقدم AND و OR را به یاد داشته باشید، کافیست بدانید که تقدم این دو، طبق ترتیب حروف الفبا می باشد.
یک راننده ی زن 30 ساله را که سه بلیط ترافیک دارد در نظر بگیرید؛ بر اساس معیارهای زیر، نباید حق بیمه اضافی به او اختصاص داده شود؛ زیرا او مرد نیست.
با در نظر گرفتن اولین دستور if در تصویر 5.24، می بینیم که عملگر && تقدم دارد، بنابراین دستور age < 25 && gender == 'M'
در ابتدا ارزیابی می شود. مقدار این عبارت false است؛ زیرا age این راننده کمتر از 25 نیست؛ بنابراین عبارت مورد نظر به trafficTickets > 2 or false
تقلیل می یابد. چونکه مقدار متغیر تیکت بزرگتر از 2 است؛ ارزش کل عبارت برابر با true می شود و مقدار 200 دلار به extraPremium انتساب داده می شود(هرچند که این عبارت مشکل دارد و نباید اینگونه باشد).
در داخل دستور if دوم، که در تصویر 5.24 نشان داده شده است، پرانتزها اضافه شده اند؛ بنابراین ابتدا عملگر || ارزیابی می شود؛ در اینجا ارزش عبارت trafficTickets > 2 || age < 25
برابر با true است، زیرا مقدار trafficTickets برابر با 3 است. بنابراین عبارت ما به صورت true && gender == 'M'
تکامل می یابد. چونکه gender برابر با 'M'
نیست؛ بنابراین ارزش کل عبارت برابر با false است و مقدار extraPremium برابر با 200 نمی شود. و این صحیح است.
نکته: استفاده از پرانتزها برای واضح کردن منظور خود، هیچ موقع اشتباه نیست. حتی وقتی که یک عبارت به صورت درستی، بدون استفاده از پرانتزهای اضافی ارزیابی می شود، اضافه کردن پرانتزها می تواند به دیگران کمک کند تا راحت تر برنامه های شما را درک کنند.
خوب است دو نکته ی زیر را به یاد داشته باشید:
- ترتیبی که شما از عملگرها استفاده می کنید، باعث تفاوت (در نتایج) می شود.
- ما همواره می توانیم از پرانتزها برای تغییر تقدم یا مقاصد خود را واضح تر کنید.
دو عبارت صحیح و یک عبارت اشتباه
موضوع: درک تقدم عملگرها در جاوا
1. فرض کنید p و q و r هرسه متغیرهای بولین باشند که مقدار true به آنها انتساب داده شده باشد. پس از اینکه عبارت زیر اجرا شود، مقدار p هنوز برابر با true خواهد بود:
p = !q || r;
2. فرض کنید p و q و r هرسه متغیرهای بولین باشند که مقدار true به آنها انتساب داده شده باشد. پس از اینکه عبارت زیر اجرا شود، مقدار p هنوز برابر با true خواهد بود:
p = !(!q && !r);
3. فرض کنید p و q و r هرسه متغیرهای بولین باشند که مقدار true به آنها انتساب داده شده باشد. پس از اینکه عبارت زیر اجرا شود، مقدار p هنوز برابر با true خواهد بود:
p = !(q || !r);
پاسخ: گزینه ی شماره 3 اشتباه است.
اگر p و q و r هرسه متغیرهایی بولین باشند که مقدار true به آنها انتساب داده شده باشد، آنگاه پس از اینکه عبارت p = !(q || !r);
اجرا شود، مقدار p برابر با false خواهد بود. در ابتدا، ارزش q برابر با true است؛ بنابراین کل عبارت درون پرانتزها true است(چون از || یعنی "یا" استفاده شده است). حالا عملگر NOT که در ابتدای عبارت قرار دارد، این مقدار true (در پرانتز) را نقیض می کند و به false تبدیل می کند و آن را در p انتساب می دهد.