تقدم عملگرها
تقدم عملگرها مشخص می کند که در محاسباتی که بیش از دو عملوند دارند ابتدا کدام عملگر اثرش را اعمال کند. عملگر ها در ++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 قرار می دهید.