در زبان های برنامه‌نویسی وابسته بودن یک عملگر یک ویژگی است که چگونگی اولویت عملگرها را در غیاب پرانتز مشخص می‌کند. به طور کلی در اکثر زبان های برنامه نویسی عملگرها با ترتیب خاصی اعمال می‌شوند، که این قوانین تحت عنوان اولویت عملگرها و وابستگی عملگرها شناخته می‌شوند. اگر دو عملگر با سطح اولویت یکسان هم قبل و هم بعد از یک عملوند بیایند، قانون وابستگی عملگر به کامپایلر می‌گوید که آن عملگرها را از سمت راست به چپ و یا چپ به راست به ترتیب اولویت بدهد. به عنوان مثال، در عبارت اولویت عملگرهای ضرب و تقسیم، هر دو در یک سطح قرار دارند. از آنجا که ضرب و تقسیم از سمت چپ به راست ارزیابی می‌شود، جواب این عبارت می‌شود. [۱] و همچنین مثال دیگری از این حالت ^3^ است. عملگرها به چهار دستهٔ وابسته (یعنی عملیات می‌تواند به صورت دلخواه گروه بندی شوند)، وابستهٔ چپ (به معنای این که عملیات‌ها از سمت چپ گروه بندی می شوند) و وابستهٔ راست (به معنای این که عملیات‌ها از سمت راست گروه بندی شده اند) یا غیر وابسته (به معنای این است که عملیات به دلیل ناسازگاری با نوع ورودی نمی‌تواند گروه بندی شود) تقسیم می‌شند. تعریف نوع وابستگی عملگرها و اولویت آن ها در تعریف زبان برنامه نویسی مشخص می‌شود. در زبان‌های برنامه‌نویسی مختلف ممکن است نوع وابستگی و اولویت برای یک عملگر متفاوت باشد.[۲]

برای فهم تفاوت این چهار دسته عبارت را در نظر بگیرید. اگر کامپایلر عملگر ~ را وابسته ی چپ در نظر گرفت، این عبارت را به صورت درنظر میگیریم. اگر کامپایلر عملگر را وابستهٔ راست در نظر گرفت، این عبارت را به صورت در نظر می‌گیریم. و اگر عملگر غیر وابسته بود، به ارور سینتکسی بر می‌خوریم یا ممکن است که این حالت با توجه به نوع تعریف عملگر معنای خاصی داشته باشد.

جدول وابستگی در زبان های برنامه نویسی ویرایش

جدول وابستگی نشان دهنده ی نوع وابستگی هر عملگر موجود در آن زبان برنامه‌نویسی است. جدول زیر یک جدول اولویت در زبان جاوا است که نشان‌دهندهٔ نوع وابستگی هر عملگر موجود در این زبان است.[۳]

در این جدول هر گروه از عملگرهای جدول تقدم یکسان دارند. هر چه تقدم بالاتر باشد، اولویت گروه بندی بالاتر است.

 
وابستگی راست برای عملگر = در زبان جاوا
جدول اولویت عملگرها در زبان جاوا
وابستگی عملگر الویت
غیر وابسته ()

[]

1
غیر وابسته new 2
وابستگی چپ . 3
غیر وابسته ++

- -

4
وابستگی راست !

~

(unary)+

(unary)-

(type)

5
وابستگی چپ *

/

%

6
وابستگی چپ +

-

7
وابستگی چپ <<

>>

>>>

8
غیر وابسته instance of

<

>

<=

>=

9
وابستگی چپ

== !=

10
وابستگی چپ & 11
وابستگی چپ ^ 12
وابستگی چپ | 13
وابستگی چپ && 14
وابستگی چپ || 15
وابستگی راست :? 16
وابستگی راست =

*=

/=

%=

-=

<<=

>>=

>>>=

&=

^=

|=

17

مثال ویرایش

همان‌طور که ذکر شد، وابستگی عملگرها وقتی مطرح می‌شود که عملگرها دارای اولویت یکسانی باشند. به طور مثال عملگرهای ضرب و تقسیم اولویت یکسانی دارند. عبارت   را در نظر بگیرید. اگر وابستگی راست را برای این عملگرها اعمال کنیم، حاصل عبارت به صورت   محاسبه می‌شود. اما اگر وابستگی چپ را در نظر بگیریم، عبارت به صورت    به دست می‌آید.

در عبارات ریاضی و برای استفاده‌های معمولی، عملیات‌های جمع، تفریق، ضرب و تقسیم با وابستگی چپ در نظر گرفته می‌شوند.  عملیات مقداردهی نیز معمولاً با وابستگی راست نمایش داده می‌شود. اما عملیات‌های توان‌رسانی قاعده کلی ندارند و ممکن است با وابستگی چپ یا راست نمایش داده شوند. در قاعده‌ی کلی، عملگرهایی که اولویت یکسانی دارند باید وابستگی یکسانی داشته باشند.[۴]

برای درک بهتر عبارت 2^3^2 را با وابستگی راست در نظر بگیرید. یک تجزیه‌کننده که عبارت را از چپ به راست می‌خواند، با توجه به وابستگی راست عملگر ^ به صورت زیر عمل می‌کند:

  1. ترم 2 خوانده می‌شود.
  2. ناپایانه ^ خوانده می‌شود. در درخت راس ^2 ذخیره می‌شود.
  3. ترم 3 خوانده می‌شود. و در درخت راس 3^2 نگه داشته می‌شود.
  4. ناپایانه ^ خوانده می‌شود. با توجه به وابستگی راست عملگر ^ ، راس 3)^2 در درخت ذخیره می‌گردد.
  5. ترم 2 خوانده می‌شود. راس 2^3)^2 در درخت ذخیره می‌گردد.
  6. نشانه دیگری وجود ندارد و بنا بر وابستگی راست، راس (2^3)^2 در درخت درج می‌شود.

با استفاده از الگوریتم جستجوی اول عمق، گام‌های زیر بر روی درخت اجرا می‌شود:

  1. در درخت از اولین ^ شروع می‌کنیم تا به آخرین (در اینجا دومین) عملگر ^ برسیم.
  2. مقدار 9=2^3 محاسبه شده و به عنوان عملوند دوم در عملگر ^ اول استفاده می‌شود.
  3. یک سطح در درخت بالا می‌رویم و به ریشه درخت می‌رسیم. در نتیجه حاصل برابر با 512=9^2 خروجی داده می‌شود.

اگر برای عملگر توانی وابستگی چپ در نظر گرفته شود، عبارت 64=2^(3^2) به دست خواهد آمد.

وابستگی راست در عملگر مقداردهی ویرایش

عملگر مقداردهی (=) در اکثر زبان‌های برنامه‌نویسی دستوری با وابستگی راست تعریف شده‌است. همچنین مقداردهی به صورت یک اصطلاح تعریف می‌شود. تفاوت اصطلاح با عبارت این است که اگر در انتهای یک اصطلاح ; اضافه کنیم، به عبارت تبدیل می‌شود. در نتیجه امکان مقداردهی زنجیره‌ای به وجود می‌آید و مقدار یک مقداردهی به عنوان ورودی به یک مقداردهی دیگر داده می‌شود.

به طور مثال در زبان C ، با اجرای مقداردهی   ، مقدار متغیر b در a قرار داده می‌شود. وابستگی راست عملگر مقداردهی این امکان را ایجاد می‌کند که اصطلاحاتی نظیر   به صورت   ترجمه شود و در نتیجه مقدار متغیر c در هر دو متغیر a و b قرار گیرد. اما در زبان C++ مقداردهی a = b وابستگی چپ دارد . لذا   به صورت   در می‌آید. و معادل با عبارات   عمل می‌کند.[۵]

جستارهای وابسته ویرایش

منابع ویرایش

  1. "آموزش زبان ++C : اولویت عملگرها (Operator precedence) و وابستگی (associativity)". خوش آموز (به انگلیسی). Retrieved 2020-01-31.
  2. «SIP Reference Manual» (PDF).
  3. «[Chapter 4] 4.14 Order of Operations». web.deu.edu.tr. دریافت‌شده در ۲۰۲۰-۰۲-۰۱.
  4. «Exponentiation Associativity and Standard Math Notation - Code Plea». codeplea.com. دریافت‌شده در ۲۰۲۰-۰۲-۰۱.
  5. «Operator Precedence and Associativity in C». GeeksforGeeks (به انگلیسی). ۲۰۱۴-۰۲-۰۷. دریافت‌شده در ۲۰۲۰-۰۲-۰۱.