تقدم عملگرها

تقدم عملگرها مشخص می کند که در محاسباتی که بیش از دو عملوند دارند ابتدا کدام عملگر اثرش را اعمال کند. عملگر ها در ++C در محاسبات دارای حق تقدم هستند.به عنوان مثال :

number = 1 + 2 * 3 / 1;

اگر ما حق تقدم عملگرها را رعایت نکنیم و عبارت بالا را از سمت چپ به راست انجام دهیم نتیجه 9 خواهد شد (3=2+1 سپس 9=3×3 و در آخر 9=1/9).اما کامپایلر با توجه به تقدم عملگرها محاسبات را انجام می دهد.برای مثال عمل ضرب و تقسیم نسبت به جمع و تفریق تقدم دارند.بنابراین در مثال فوق ابتدا عدد 2 ضربدر 3 و سپس نتیجه آنها تقسیم بر 1 می شود که نتیجه 6 به دست می آید.در آخر عدد 6 با 1 جمع می شود و عدد 7 حاصل می شود. در جدول زیر تقدم عملگرهای ++C از بالا به پایین آمده است :

Level Precedence group Operator Description Grouping
1 Scope :: scope qualifier Left-to-right
2 Postfix (unary) ++ — postfix increment / decrement Left-to-right
() functional forms
[] subscript
. -> member access
3 Prefix (unary) ++ — prefix increment / decrement Right-to-left
~ ! bitwise NOT / logical NOT
+ – unary prefix
& * reference / dereference
new delete allocation / deallocation
sizeof parameter pack
(type) C-style type-casting
4 Pointer-to-member .* ->* access pointer Left-to-right
5 Aritdmetic: scaling * / % multiply, divide, modulo Left-to-right
6 Aritdmetic: addition + – addition, subtraction Left-to-right
7 Bitwise shift << >> shift left, shift right Left-to-right
8 Relational < > <= >= comparison operators Left-to-right
9 Equality == != equality / inequality Left-to-right
10 And & bitwise AND Left-to-right
11 Exclusive or ^ bitwise XOR Left-to-right
12 Inclusive or | bitwise OR Left-to-right
13 Conjunction && logical AND Left-to-right
14 Disjunction || logical OR Left-to-right
15 Assignment-level expressions = *= /= %= += -=
>>= <<= &= ^= |=
assignment / compound assignment Right-to-left
?: conditional operator
16 Sequencing , comma separator Left-to-right

ابتدا عملگرهای با بالاترین و سپس عملگرهای با پایین ترین حق تقدم در محاسبات تاثیر می گذارند.به این نکته توجه کنید که تقدم عملگرها ++ و – به مکان قرارگیری آنها بستگی دارد (در سمت چپ یا راست عملوند باشند). به عنوان مثال :

int number = 3;

number1 = 3 + ++number; //results to 7
number2 = 3 + number++; //results to 6

در عبارت اول ابتدا به مقدار numberیک واحد اضافه شده و 4 می شود و سپس مقدار جدید با عدد 3 جمع می شود و در نهایت عدد 7 به دست می آید.در عبارت دوم مقدار عددی 3 به مقدار number اضافه می شود و عدد 6 به دست می آید.سپس این مقدار در متغیر number2 قرار می گیرد. و در نهایت مقدار number به 4 افزایش می یابد. برای ایجاد خوانایی در تقدم عملگرها و انجام محاسباتی که در آنها از عملگرهای زیادی استفاده می شود از پرانتز استفاده می کنیم :

number = ( 1 + 2 ) * ( 3 / 4 ) % ( 5 - ( 6 * 7 ));

در مثال بالا ابتدا هر کدام از عباراتی که داخل پرانتز هستند مورد محاسبه قرار می گیرند.به نکته ای در مورد عبارتی که در داخل پرانتز سوم قرار دارد توجه کنید.در این عبارت ابتدا مقدار داخلی ترین پرانتز مورد محاسبه قرار می گیرد یعنی مقدار 6 ضربدر 7 شده و سپس از 5 کم می شود. اگر دو یا چند عملگر با حق تقدم یکسان موجود باشد ابتدا باید هر کدام از عملگرها را که در ابتدای عبارت می آیند مورد ارزیابی قرار دهید. به عنوان مثال :

number = 3 * 2 + 8 / 4;

هر دو عملگر * و / دارای حق تقدم یکسانی هستند. بنابر این شما باید از چپ به راست آنها را در محاسبات تاثیر دهید.یعنی ابتدا 3 را ضربدر 2 می کنید و سپس عدد 8 را بر 4 تقسیم می کنید. در نهایت نتیجه دو عبارت را جمع کرده و در متغیر number قرار می دهید.