تقدم عملگرها در جاوا

یکی از اشکالات و ابهامات رایج در یادگیری هر زبان برنامهنویسی مثل جاوا، ترتیب اجرای عملگرهاست. در این مطلب، با مطالعه یک سوال و جواب خوب از یکی از کاربران جاواکاپ و دکتر علیاکبری این ابهام را برای خودتان نیز حل کنید.
سوال:
بر اساس آن چیزی که شما بیان کردید و جدولی هم نشان دادید عملگر پیشوندی ++ تقدم بالاتری نسبت به جمع یا ضرب دارد پس باید ابتدا مورد بررسی قرار بگیرد ولی در مثال خلاف آن را دیدم :
int f, a = 3; int b = 5; f = a*b + ++a;
با توجه به ویدیو شما، ابتدا باید مقدار متغیر a افزایش پیدا کند (ضمن اینکه شرکت پذیری آن هم از سمت راست است) و سپس عمل ضرب بین مقدار جدید a و b انجام شود. در صورتی که ابتدا عمل ضرب انجام میشود، سپس افزایش. پس بالاتر بودن اولویت عملگر ++ چه معنی دارد؟
پاسخ:
سؤال جالبی است.
به یک نکته دقت کنید (یک سوء تفاهم در سؤال شما مستتر است):
اولویت عملگرها یعنی وقتی ترتیب عملگرها مبهم است، ترتیب را از روی اولویت عملگرها تشخیص دهیم. در عبارتی که شما مثال زدید، فقط یک جا ابهام وجود دارد: این که اول «ضرب» انجام شود و یا «جمع»؟
اولویت عملگرها باعث میشود که عبارتی که مثال زدید به این شکل ارزيابی شود:
f = (a*b) + (++a);
به عبارت دیگر، مسأله «اولویت عملگرها» درباره ی اولویت «عملگرها» است و نه اولویت «عملوندها». همین عبارت فوق را به دو شکل میتوان ارزيابی کرد: حالت اول: ابتدا پرانتز سمت راستی اعمال شود. حالت دوم: ابتدا پرانتز سمت چپی اجرا شود. این که کدام یک از این دو حالت انجام میشود به اولویت (Precedence) یا شرکت پذیری (associativity) بستگی ندارد.
خلاصه جواب سؤال شما درباره مفاهیم اولویت و شرکت پذیری عملگرها نیست. زبان جاوا برای چنین حالتهایی (که از روی اولویت عملگرها نمیتوانیم ترتیب اجرای عملوندها (Operands) را تشخیص دهیم) عبارتها را از چپ به راست اجرا میکند. در برخی از زبانها مثل C و ++C رفتار کامپایلر در قبال چنین دستوراتی نامشخص و غیرقابل پیشبینی است (اصطلاحاً unspecified) است.
برای توضیح بیشتر این را ببینید:
http://stackoverflow.com/questions/6800590/what-are-the-rules-for-evaluation-order-in-java
موفق باشید.