C++: نظرة عامة على العوامل
آخر تحديث: 2026-08-26
في الدرس 03 تعلمنا كيفية تخزين البيانات باستخدام المتغيرات.
لكن مجرد تخزين البيانات ليس كافيًا — نحتاج لأن نكون قادرين على إجراء عمليات عليها، مثل الحسابات والمقارنات والأحكام المنطقية.
هذا هو غرض العوامل. تمامًا مثل +، -، ×، ÷ في الرياضيات، C++ لديها مجموعتها الخاصة من العوامل.
1. فئات العوامل
يمكن تقسيم عوامل C++ إلى عدة فئات رئيسية:
| الفئة | العوامل | الغرض |
|---|---|---|
| حسابية | +، -، *، /، % |
العمليات الرياضية |
| علاقات | ==، !=، >، <، >=، <= |
مقارنة القيم |
| منطقية | &&، ` |
|
| إسناد | =، +=، -=، *=، /= |
تعيين قيم للمتغيرات |
| زيادة/نقصان | ++، -- |
إضافة 1 أو طرح 1 من متغير |
| أخرى | sizeof، ? :، .، -> |
ستُغطى لاحقًا |
2. العوامل الحسابية
(1) 2.1 خمسة عوامل حسابية أساسية
| العامل | الاسم | المثال | النتيجة |
|---|---|---|---|
+ |
الجمع | 10 + 3 |
13 |
- |
الطرح | 10 - 3 |
7 |
* |
الضرب | 10 * 3 |
30 |
/ |
القسمة | 10 / 3 |
3 (انتبه!) |
% |
باقي القسمة | 10 % 3 |
1 |
💡 نقطة مهمة: فخ عامل /
#include <iostream>
int main() {
int a = 10;
int b = 3;
std::cout << "10 / 3 = " << a / b << std::endl; // Outputs 3 (integer division, decimal part discarded)
double c = 10.0;
double d = 3.0;
std::cout << "10.0 / 3.0 = " << c / d << std::endl; // Outputs 3.33333
return 0;
}
القواعد:
- عند قسمة عددين صحيحين، النتيجة تبقى عددًا صحيحًا (الجزء العشري يُتجاهل)
- إذا كان أي من المعاملين عدد فاصلة عائمة، النتيجة تكون عدد فاصلة عائمة
(2) 2.2 عامل باقي القسمة %
% يحسب "الباقي":
#include <iostream>
int main() {
std::cout << "10 % 3 = " << 10 % 3 << std::endl; // 1
std::cout << "20 % 7 = " << 20 % 7 << std::endl; // 6
std::cout << "5 % 5 = " << 5 % 5 << std::endl; // 0
// Check even/odd
int num = 7;
if (num % 2 == 0) {
std::cout << num << " is Even" << std::endl;
} else {
std::cout << num << " is Odd" << std::endl;
}
return 0;
}
💡 نصيحة: % يمكن استخدامه فقط مع الأعداد الصحيحة، وليس أعداد الفاصلة العائمة (10.5 % 3 سيسبب خطأ).
3. عوامل العلاقات
تُستخدم عوامل العلاقات لمقارنة قيمتين، وتُرجع true أو false.
(1) 3.1 ستة عوامل علاقات
| العامل | الاسم | المثال | النتيجة |
|---|---|---|---|
== |
يساوي | 5 == 3 |
false |
!= |
لا يساوي | 5 != 3 |
true |
> |
أكبر من | 5 > 3 |
true |
< |
أصغر من | 5 < 3 |
false |
>= |
أكبر من أو يساوي | 5 >= 5 |
true |
<= |
أصغر من أو يساوي | 5 <= 3 |
false |
💡 نقطة مهمة: لا تكتب = بدلًا من ==!
int age = 18;
if (age = 20) { // ❌ Error: this is assignment, not comparison!
std::cout << "An adult" << std::endl;
}
// The above code always outputs "An adult", because age = 20 assigns 20 to age,
// then checks if age is truthy (non-zero), which is always true
الطريقة الصحيحة:
if (age == 20) { // ✅ Correct: this is comparison
std::cout << "Exactly 20 years old" << std::endl;
}
💡 تقنية مضادة للأخطاء: ضع الثابت على الجانب الأيسر — إذا كتبت = بالخطأ سيحدث خطأ ترجمة:
if (20 = age) { // ❌ Compile error: cannot assign to a constant
if (20 == age) { // ✅ Correct
4. العوامل المنطقية
تُستخدم العوامل المنطقية لدمج شروط متعددة.
(1) 4.1 ثلاثة عوامل منطقية
| العامل | الاسم | القاعدة | المثال |
|---|---|---|---|
&& |
و المنطقية | يجب أن يكون كلا الجانبين صحيحًا لتكون النتيجة صحيحة | (5 > 3) && (10 > 5) → true |
| ` | ` | أو المنطقية | |
! |
لا المنطقية | تنفي القيمة | !(5 > 3) → false |
▶ مثال 1: فحص السنة الكبيسة (صعوبة ⭐)
#include <iostream>
int main() {
int year;
std::cout << "Please enter a year: ";
std::cin >> year;
// Leap year rule: divisible by 4 but not by 100, OR divisible by 400
bool isLeapYear = (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
if (isLeapYear) {
std::cout << year << " is a leap year" << std::endl;
} else {
std::cout << year << " is not a leap year" << std::endl;
}
return 0;
}
الخرج:
Please enter a year:
is a leap year
is not a leap year
نتيجة التشغيل:
Please enter a year: 2024
2024 is a leap year
(2) 4.2 التقييم قصير الدائرة
C++ لديها آلية "قصيرة الدائرة":
&&: إذا كان الجانب الأيسر خاطئًا، الجانب الأيمن لن يُنفَّذ (لأن النتيجة حُددت بالفعل بأنها خاطئة)||: إذا كان الجانب الأيسر صحيحًا، الجانب الأيمن لن يُنفَّذ (لأن النتيجة حُددت بالفعل بأنها صحيحة)
#include <iostream>
int main() {
int x = 5;
// Short-circuit example
if (x > 10 && (x = 100)) { // x > 10 is false, so x = 100 won't execute
// ...
}
std::cout << "x = " << x << std::endl; // Outputs x = 5 (not changed to 100)
return 0;
}
💡 نصيحة: باستخدام التقييم قصير الدائرة، يمكنك وضع "الشروط الأكثر احتمالًا أن تكون خاطئة" على الجانب الأيسر من && لتحسين كفاءة البرنامج.
5. عوامل الإسناد
(1) 5.1 عامل الإسناد الأساسي =
int x = 5; // Assign 5 to x
(2) 5.2 عوامل الإسناد المركبة
| العامل | يكافئ | المثال |
|---|---|---|
+= |
x = x + y |
x += 5; → x = x + 5; |
-= |
x = x - y |
x -= 3; → x = x - 3; |
*= |
x = x * y |
x *= 2; → x = x * 2; |
/= |
x = x / y |
x /= 4; → x = x / 4; |
%= |
x = x % y |
x %= 3; → x = x % 3; |
مثال:
#include <iostream>
int main() {
int x = 10;
x += 5; // x becomes 15
x -= 3; // x becomes 12
x *= 2; // x becomes 24
x /= 4; // x becomes 6
x %= 4; // x becomes 2
std::cout << "x = " << x << std::endl; // Outputs x = 2
return 0;
}
💡 نصيحة: عوامل الإسناد المركبة ليست فقط أكثر إيجازًا في الكتابة، بل في بعض الحالات يمكن للمترجم توليد كود أكثر كفاءة.
6. عوامل الزيادة والنقصان
++ و-- هما علامتا C++ المميزتان (حصلت C++ على اسمها منهما).
(1) 6.1 الاستخدام الأساسي
| العامل | الاسم | التأثير | يكافئ |
|---|---|---|---|
++x |
زيادة سابقة | يُزاد x أولًا، ثم تُرجع القيمة الجديدة | x = x + 1; return x; |
x++ |
زيادة لاحقة | تُرجع القيمة الأصلية أولًا، ثم يُزاد x | temp = x; x = x + 1; return temp; |
--x |
نقصان سابق | يُنقص x أولًا، ثم تُرجع القيمة الجديدة | x = x - 1; return x; |
x-- |
نقصان لاحق | تُرجع القيمة الأصلية أولًا، ثم يُنقص x | temp = x; x = x - 1; return temp; |
▶ مثال 2: الزيادة السابقة مقابل الزيادة اللاحقة (صعوبة ⭐⭐)
#include <iostream>
int main() {
int a = 5;
int b = 5;
std::cout << "a = " << a << ", ++a = " << ++a << ", a = " << a << std::endl;
// Output: a = 5, ++a = 6, a = 6
std::cout << "b = " << b << ", b++ = " << b++ << ", b = " << b << std::endl;
// Output: b = 5, b++ = 5, b = 6
return 0;
}
الخرج:
a = 5, ++a = 6, a = 6
b = 5, b++ = 5, b = 6
💡 طريقة سهلة للتذكر:
++x: زِد أولًا، ثم استخدم (يُزاد x أولًا، ثم تُستخدم القيمة الجديدة)x++: استخدم أولًا، ثم زِد (تُستخدم القيمة الأصلية أولًا، ثم يُزاد x)
(2) 6.2 الاستخدام الشائع
for (int i = 0; i < 10; i++) { // Here i++ and ++i have the same effect
// ...
}
int x = 5;
int y = x++; // y = 5, x = 6
int z = ++x; // x increments to 7 first, z = 7
💡 توصية: إذا لم تكن هناك حاجة خاصة، فضّل ++i على i++ — للأنواع المخصصة (ستُغطى لاحقًا)، قد يكون ++i أكثر كفاءة.
7. أسبقية العوامل
عندما يحتوي تعبير على عوامل متعددة، يحدد C++ ترتيب التقييم بناءً على الأسبقية.
(1) 7.1 جدول الأسبقية (جزئي)
| الأسبقية | العوامل | الترابط |
|---|---|---|
| 1 (الأعلى) | ++، -- (لاحق)، () (استدعاء دالة) |
من اليسار لليمين |
| 2 | ++، -- (سابق)، !، - (نفي) |
من اليمين لليسار |
| 3 | *، /، % |
من اليسار لليمين |
| 4 | +، - (طرح) |
من اليسار لليمين |
| 5 | <، <=، >، >= |
من اليسار لليمين |
| 6 | ==، != |
من اليسار لليمين |
| 7 | && |
من اليسار لليمين |
| 8 | ` | |
| 9 (الأدنى) | =، +=، -=، ... |
من اليمين لليسار |
▶ مثال 3: تأثير الأسبقية (صعوبة ⭐⭐)
#include <iostream>
int main() {
int result1 = 5 + 3 * 2; // First 3 * 2 = 6, then 5 + 6 = 11
int result2 = (5 + 3) * 2; // First 5 + 3 = 8 in parentheses, then 8 * 2 = 16
std::cout << "5 + 3 * 2 = " << result1 << std::endl; // 11
std::cout << "(5 + 3) * 2 = " << result2 << std::endl; // 16
return 0;
}
الخرج:
5 + 3 * 2 = 11
(5 + 3) * 2 = 16
💡 القاعدة الذهبية: إذا لم تكن متأكدًا من الأسبقية، استخدم الأقواس! الأقواس لا تضمن الصحة فحسب، بل تجعل الكود أكثر قابلية للقراءة أيضًا.
8. تطبيق: برنامج تقييم الدرجات
▶ مثال 4: تقييم الدرجات بناءً على النتيجة (صعوبة ⭐⭐)
#include <iostream>
int main() {
int score;
std::cout << "Please enter your score (0-100): ";
std::cin >> score;
if (score >= 90 && score <= 100) {
std::cout << "Excellent! Grade: A" << std::endl;
} else if (score >= 80 && score < 90) {
std::cout << "Good! Grade: B" << std::endl;
} else if (score >= 70 && score < 80) {
std::cout << "Medium! Grade: C" << std::endl;
} else if (score >= 60 && score < 70) {
std::cout << "Pass! Grade: D" << std::endl;
} else if (score >= 0 && score < 60) {
std::cout << "Not Pass! Grade: F" << std::endl;
} else {
std::cout << "Error: Score must be between 0-100!" << std::endl;
}
return 0;
}
الخرج:
Please enter your score (0-100):
Excellent! Grade: A
Good! Grade: B
Medium! Grade: C
Pass! Grade: D
Not Pass! Grade: F
Error: Score must be between 0-100!
نتيجة التشغيل:
Please enter your score (0-100): 85
Good! Grade: B
❓ أسئلة شائعة
10.0 / 3 أو 10 / 3.0 تعطي 3.33333.% العمل بالأعداد السالبة؟% فقط مع الأعداد الصحيحة الموجبة لتجنب المشاكل. مثلًا، (-10) % 3 تعطي -1.if (5 < x && x < 10).i++ (زيادة لاحقة) تُرجع القيمة الأصلية أولًا ثم تزيد؛ ++i (زيادة سابقة) تزيد أولًا ثم تُرجع القيمة الجديدة. للأنواع الأساسية مثل int لا يوجد فرق في الأداء، لكن للمكررات والأنواع المخصصة الأخرى قد يكون ++i أكثر كفاءة (لا حاجة لحفظ القيمة الأصلية). التوصية: فضّل ++i عندما لا تكون هناك حاجة خاصة.📖 ملخص
- C++ لديها خمس فئات عوامل رئيسية: حسابية، علاقات، منطقية، إسناد، وزيادة/نقصان
- قسمة الأعداد الصحيحة تتجاهل الجزء العشري؛ للحصول على نتيجة عشرية، اجعل أحد المعاملين عدد فاصلة عائمة على الأقل
- لا تكتب
=بدلًا من==، وإلا ستحصل على أخطاء كبيرة ++iيزيد أولًا ثم يستخدم القيمة؛i++يستخدم القيمة أولًا ثم يزيد- إذا لم تكن متأكدًا من أسبقية العوامل، استخدم الأقواس!
- العوامل المنطقية لديها سلوك قصير الدائرة، مما يمكن أن يحسن الكفاءة
📝 تمارين
- أساسي (صعوبة ⭐): اكتب برنامجًا يتيح للمستخدم إدخال عددين صحيحين، ثم إخراج المجموع والفرق والجداء والخارج والباقي.
Please enter the first integer: 10
Please enter the second integer: 3
Sum: 13
Difference: 7
Product: 30
Quotient: 3
Remainor: 1
- متوسط (صعوبة ⭐⭐): اكتب برنامجًا يتيح للمستخدم إدخال عدد مكون من ثلاثة أرقام (مثل 365)، ثم إخراج كل رقم على حدة (مئات، عشرات، آحاد).
Please enter a three-digit number: 365
Hundreds: 3
Tens: 6
Ones: 5
(تلميح: استخدم عوامل / و%)
- تحدي (صعوبة ⭐⭐⭐): اكتب برنامجًا ينفذ لعبة "خمّن الرقم":
- يولد البرنامج رقمًا عشوائيًا من 1-100 (تلميح: استخدم
% 100 + 1لتعيين الأرقام العشوائية إلى 1-100) - دع المستخدم يخمن الرقم
- إذا كان التخمين مرتفعًا جدًا، تلميح "Too high!"
- إذا كان التخمين منخفضًا جدًا، تلميح "Too low!"
- إذا كان التخمين صحيحًا، تلميح "Congratulations, you got it!"
- (متقدم: عد عدد المحاولات التي قام بها المستخدم)
- C++ خمس فئات عوامل رئيسية: حسابية، علاقات، منطقية، إسناد، زيادة/نقصان
- قسمة الأعداد الصحيحة تتجاهل الجزء العشري؛ حوّل المعاملات إلى فاصلة عائمة للحصول على نتائج عشرية
- عوامل العلاقات تُرجع قيم bool؛ انتبه للفرق بين == و=
- العوامل المنطقية لديها سلوك قصير الدائرة
- عند عدم التأكد من الأسبقية، استخدم الأقواس
9. 🚀 الخطوة التالية
الآن بعد أن تعلمت العوامل، سنتعلم بعد ذلك الجمل الشرطية (if-else) (الدرس 05) — تمكين البرامج من اتخاذ القرارات وتنفيذ كود مختلف بناءً على شروط مختلفة.