العوامل (Operators)
تُستخدم العوامل في إجراء العمليات الحسابية أو تعديل القيم المخزّنة في المتغيّرات. وفيما يلي قائمة بأهم العوامل الأساسية في لغة C++.
عامل الإسناد: =
يُستخدم عامل الإسناد لتعيين قيمة محدّدة إلى متغيّر.
int x;
x = 5; // here we set the value of the variable 'x' to 5في المثال السابق، تم إسناد القيمة 5 (العامل الأيمن) إلى المتغيّر x (العامل الأيسر). يتم التقييم من اليمين إلى اليسار (سيتم توضيح ذلك بمزيد من الأمثلة لاحقًا).
العوامل الحسابية: *, /, %, +, -
| العامل | المعنى |
|---|---|
* |
الضرب |
/ |
القسمة |
% |
باقي القسمة (modulo) |
+ |
الجمع |
- |
الطرح |
جميع هذه العوامل هي ثنائية، أي تتطلّب عاملين (operands). على سبيل المثال:
5 * 3
1 + 1
6 / 2يعيد عامل باقي القسمة (%) الباقي الناتج من قسمة العامل الأيسر على العامل الأيمن. أما العمليات الأخرى فتُنفَّذ تمامًا كما في الرياضيات العادية.
إسناد التعابير (Assigning Expressions)
القيمة المسندة إلى متغيّر ليست بالضرورة ثابتة أو متغيّرًا آخر؛ إذ يمكن أن تكون تعبيرًا حسابيًا يحتوي على عوامل رياضية.
int x, y;
x = 5;
y = 3 + 2 * x;
// since '*' comes before '+' in operator precedence, y will be 13 not 25الإسناد المركّب: *=, /=, %=, +=, -=
إذا كان لدينا المتغيّر x ونرغب في إضافة أو ضرب أو تعديل قيمته ثم إسناد النتيجة إلى نفسه، يمكننا استخدام الصيغ المركّبة بدلًا من الكتابة الطويلة.
| التعبير العادي | باستخدام الإسناد المركّب |
|---|---|
x = x + y |
x += y |
x = x - 5 |
x -= 5 |
x = x / y |
x /= y |
price = price * (units + 1) |
price *= units + 1 |
تُعد هذه الطريقة أكثر اختصارًا ووضوحًا.
الزيادة والنقصان: ++, --
عند إضافة 1 إلى متغيّر ما، يمكننا استخدام x += 1، ولكن توجد طريقة أقصر عند التعامل مع الزيادة أو النقصان بمقدار واحد فقط.
int x;
x = 0;
x++; // after this line is executed x is 1
x--; // after this line is executed x is 0يوجد فرق دقيق بين ++ و += 1، إذ يمكن كتابة ++ أو -- قبل المتغيّر (prefix) أو بعده (suffix)، ولكل موضع معنى مختلف. على سبيل المثال:
int x, y;
x = 1;
y = ++x;في هذا المثال ستكون قيمة y هي 2 لأن الزيادة تحدث قبل استخدام القيمة.
int x, y;
x = 1;
y = x++;بينما هنا ستكون قيمة y هي 1 لأن الزيادة تتم بعد استخدام القيمة.
العوامل العَلاقية (Relational) والمقارنة (Comparison):
==, !=, >, <, >=, <=
تشبه هذه العوامل العوامل الحسابية من حيث أنها ثنائية، ولكن بدلاً من إجراء عمليات رياضية، تقوم بالمقارنة بين العاملين وتُرجع نتيجة من نوع منطقي (boolean).
تذكير: القيم المنطقية (Booleans) هي نوع بيانات يُخزّن قيمة إمّا true أو false.
| العامل | الوصف |
|---|---|
== |
يساوي |
!= |
لا يساوي |
< |
أصغر من |
> |
أكبر من |
<= |
أصغر من أو يساوي |
>= |
أكبر من أو يساوي |
int x = 1, y = 2;
bool same = (x==y); // since x and y are not equal (x==y) will be 'false'
bool x_less_than_y = (x < y); // since x < y the expression will be 'true'يمكن أيضًا مقارنة تعابير كاملة وليس متغيّرات فقط:
int x = 5;
bool even = (x % 2 == 0);
// a number is even if it can be divided by 2 with no remainder
// in this case 'false' will be assigned to the variable 'even'العوامل المنطقية (Logical Operators): !, &&, ||
العامل ! (NOT) هو أحادي (unary)، أي يعمل على عامل واحد من نوع منطقي. إذا كانت قيمة العامل true يُنتِج false، والعكس صحيح.
bool a = (5 > 7); // false
bool b = !a; // true
bool c = !(7 > 5); // falseأما العاملان && (AND) و || (OR) فهما ثنائيان، ويُستخدمان لدمج قيمتين منطقيتين.
العامل && يُرجع true فقط إذا كانت كلتا القيمتين true.
bool a = (5 % 2 == 0); // false, 5 is odd
bool b = (3 > 2); // true
bool c = a && b; // false because a is false
bool d = (!c) && b; // true because (!c) is true and b is trueأما العامل || فيُرجع true إذا كانت إحدى القيمتين أو كلتاهما true.
bool a = (5 < 2); // false
bool b = (4 % 2 == 0); // true, 4 is even
bool c = a && b; // false, because a is false
bool d = b || c; // true, because b is trueخاصية التقييم القصير (Short-Circuit Evaluation)
تتميّز العوامل && و || بخاصية التقييم القصير. على سبيل المثال، في التعبير A && B، إذا كانت A تساوي false، فلن يتم تقييم B لأن النتيجة معروفة مسبقًا (false).
int x = 0;
bool b = (5 % 2 == 0) && (x++ == 0); بما أن 5 % 2 == 0 تُعيد false، فلن يُنفَّذ الجزء الثاني (x++ == 0)، ولذلك لن تتغيّر قيمة x. وبالمثل، في حالة العامل ||، إذا كان العامل الأيسر true، فلن يتم تقييم العامل الأيمن.
العامل الثلاثي الشرطي (Conditional Ternary Operator): ?
يُعد هذا العامل ثلاثيًّا (ternary) لأنه يقبل ثلاثة عوامل: شرطًا، وتعبيرًا عند تحقق الشرط، وآخر عند عدم تحققه. وصيغته العامة كالتالي:
condition ? expression_t : expression_fإذا كان الشرط صحيحًا (true)، تُعاد القيمة expression_t، وإلا تُعاد expression_f.
int x = 5;
int y = (x % 2 == 0 ? x : x + 1); // if x is even then y = x, otherwise y = x + 1
// since 5 is odd then y = x + 1 = 6وإذا كان لدينا عددان a و b ونرغب في معرفة الأكبر بينهما:
int max = (a > b ? a : b);أولوية تنفيذ العوامل (Precedence of Operators)
عند وجود عدّة عوامل في تعبير واحد، فإن C++ تتّبع ترتيبًا محددًا لتنفيذها. على سبيل المثال: التعبير 5 + 7 % 2 يُقيَّم إلى 6 لأن % يُنفّذ قبل +. أما إذا كتبنا (5 + 7) % 2 فستكون النتيجة 0.
الجدول التالي يوضّح ترتيب الأولوية من الأعلى إلى الأدنى:
| المستوى | مجموعة الأولوية | العامل | الوصف | اتجاه التنفيذ | ||
|---|---|---|---|---|---|---|
| 1 | لاحقة (أحادية) | ++ -- |
زيادة/نقصان بعدية | من اليسار إلى اليمين | ||
| 2 | سابقة (أحادية) | ++ -- ! |
زيادة/نقصان سابقة، نفي منطقي | من اليمين إلى اليسار | ||
| 3 | حسابية: الضرب والقسمة | * / % |
الضرب، القسمة، باقي القسمة | من اليسار إلى اليمين | ||
| 4 | حسابية: الجمع والطرح | + - |
الجمع والطرح | من اليسار إلى اليمين | ||
| 5 | علاقية | < > <= >= |
المقارنة بين القيم | من اليسار إلى اليمين | ||
| 6 | المساواة | == != |
التساوي وعدم التساوي | من اليسار إلى اليمين | ||
| 7 | اقتران منطقي (AND) | && |
منطق AND | من اليسار إلى اليمين | ||
| 8 | اقتران منطقي (OR) | | | |
منطق OR | من اليسار إلى اليمين | ||
| 9 | الإسناد والتعبيرات الشرطية | = *= /= %= += -= ?: |
إسناد، إسناد مركّب، عامل شرطي | من اليمين إلى اليسار |
باختصار، معرفة ترتيب أولوية العوامل أمر ضروري لتفسير سلوك التعابير الحسابية والمنطقية بشكلٍ صحيح في C++.