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

💡 نقطة مهمة: فخ عامل /

TEXT 📖 للعرض فقط
#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 عامل باقي القسمة %

% يحسب "الباقي":

CPP
#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

💡 نقطة مهمة: لا تكتب = بدلًا من ==!

TEXT 📖 للعرض فقط
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

الطريقة الصحيحة:

CPP
if (age == 20) { // ✅ Correct: this is comparison
 std::cout << "Exactly 20 years old" << std::endl;
}

💡 تقنية مضادة للأخطاء: ضع الثابت على الجانب الأيسر — إذا كتبت = بالخطأ سيحدث خطأ ترجمة:

TEXT 📖 للعرض فقط
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: فحص السنة الكبيسة (صعوبة ⭐)

CPP
#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;
}
▶ جرّب الكود

الخرج:

TEXT 📖 للعرض فقط
Please enter a year: 
 is a leap year
 is not a leap year

نتيجة التشغيل:

TEXT 📖 للعرض فقط
Please enter a year: 2024
2024 is a leap year

(2) 4.2 التقييم قصير الدائرة

C++ لديها آلية "قصيرة الدائرة":

TEXT 📖 للعرض فقط
#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 عامل الإسناد الأساسي =

CPP
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;

مثال:

TEXT 📖 للعرض فقط
#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: الزيادة السابقة مقابل الزيادة اللاحقة (صعوبة ⭐⭐)

CPP
#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;
}
▶ جرّب الكود

الخرج:

TEXT 📖 للعرض فقط
a = 5, ++a = 6, a = 6
b = 5, b++ = 5, b = 6

💡 طريقة سهلة للتذكر:

(2) 6.2 الاستخدام الشائع

TEXT 📖 للعرض فقط
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: تأثير الأسبقية (صعوبة ⭐⭐)

CPP
#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;
}
▶ جرّب الكود

الخرج:

TEXT 📖 للعرض فقط
5 + 3 * 2 = 11
(5 + 3) * 2 = 16

💡 القاعدة الذهبية: إذا لم تكن متأكدًا من الأسبقية، استخدم الأقواس! الأقواس لا تضمن الصحة فحسب، بل تجعل الكود أكثر قابلية للقراءة أيضًا.



8. تطبيق: برنامج تقييم الدرجات

▶ مثال 4: تقييم الدرجات بناءً على النتيجة (صعوبة ⭐⭐)

CPP
#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;
}
▶ جرّب الكود

الخرج:

TEXT 📖 للعرض فقط
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!

نتيجة التشغيل:

TEXT 📖 للعرض فقط
Please enter your score (0-100): 85
Good! Grade: B

❓ أسئلة شائعة

س لماذا 10 / 3 = 3 بدلًا من 3.3333؟
ج لأن كلا المعاملين عددان صحيحان، C++ تجري قسمة أعداد صحيحة (تتجاهل الجزء العشري). للحصول على نتيجة عشرية، اجعل أحد المعاملين على الأقل عدد فاصلة عائمة: 10.0 / 3 أو 10 / 3.0 تعطي 3.33333.
س هل يمكن لـ % العمل بالأعداد السالبة؟
ج نعم، لكن إشارة النتيجة تعتمد على المقسوم (معيار C++11). يُنصح باستخدام % فقط مع الأعداد الصحيحة الموجبة لتجنب المشاكل. مثلًا، (-10) % 3 تعطي -1.
س لماذا لا يمكنني كتابة 5 < x < 10؟
ج هذه صياغة رياضية لكن C++ لا تدعمها. الطريقة الصحيحة هي ربط شرطين بـ و المنطقية: if (5 < x && x < 10).
س ما الفرق الحقيقي بين i++ و++i؟
ج i++ (زيادة لاحقة) تُرجع القيمة الأصلية أولًا ثم تزيد؛ ++i (زيادة سابقة) تزيد أولًا ثم تُرجع القيمة الجديدة. للأنواع الأساسية مثل int لا يوجد فرق في الأداء، لكن للمكررات والأنواع المخصصة الأخرى قد يكون ++i أكثر كفاءة (لا حاجة لحفظ القيمة الأصلية). التوصية: فضّل ++i عندما لا تكون هناك حاجة خاصة.

📖 ملخص


📝 تمارين

  1. أساسي (صعوبة ⭐): اكتب برنامجًا يتيح للمستخدم إدخال عددين صحيحين، ثم إخراج المجموع والفرق والجداء والخارج والباقي.
TEXT 📖 للعرض فقط
Please enter the first integer: 10
Please enter the second integer: 3
Sum: 13
Difference: 7
Product: 30
Quotient: 3
Remainor: 1
  1. متوسط (صعوبة ⭐⭐): اكتب برنامجًا يتيح للمستخدم إدخال عدد مكون من ثلاثة أرقام (مثل 365)، ثم إخراج كل رقم على حدة (مئات، عشرات، آحاد).
TEXT 📖 للعرض فقط
Please enter a three-digit number: 365
Hundreds: 3
Tens: 6
Ones: 5

(تلميح: استخدم عوامل / و%)

  1. تحدي (صعوبة ⭐⭐⭐): اكتب برنامجًا ينفذ لعبة "خمّن الرقم":
  2. يولد البرنامج رقمًا عشوائيًا من 1-100 (تلميح: استخدم % 100 + 1 لتعيين الأرقام العشوائية إلى 1-100)
  3. دع المستخدم يخمن الرقم
  4. إذا كان التخمين مرتفعًا جدًا، تلميح "Too high!"
  5. إذا كان التخمين منخفضًا جدًا، تلميح "Too low!"
  6. إذا كان التخمين صحيحًا، تلميح "Congratulations, you got it!"
  7. (متقدم: عد عدد المحاولات التي قام بها المستخدم)

9. 🚀 الخطوة التالية

الآن بعد أن تعلمت العوامل، سنتعلم بعد ذلك الجمل الشرطية (if-else) (الدرس 05) — تمكين البرامج من اتخاذ القرارات وتنفيذ كود مختلف بناءً على شروط مختلفة.

Web-Tutorial.com

فريق Web-Tutorial التقني

منصة دروس برمجية يديرها عدة مطورين. كل درس يتم كتابته ومراجعته بواسطة مطورين متخصصين في المجال. نعمل على ضمان دقة وموثوقية المحتوى — إذا لاحظت أي مشكلة، فيرجى إخبارنا.

100%