Menu
flag Ar iconالعربيةdown icon

برنامج Hello World في C++: أول برنامج لك سطرًا بسطر

شرح برنامج Hello World في C++ سطرًا بسطر: #include <iostream>، وint main()، وstd::cout و<<، وstd::endl مقابل '\n'، وreturn 0، مع طريقة ترجمته وإصلاح أول الأخطاء التي يواجهها المبتدئون.

تحتوي هذه الصفحة على محررات قابلة للتشغيل - حرّر، شغّل، وشاهد النتيجة فوراً.

البرنامج

هذا هو برنامج Hello World الكامل في C++. اضغط Run لترجمته وتنفيذه في المتصفح:

يطبع سطرًا واحدًا:

Hello, World!

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

سطرًا بسطر

#include <iostream>

الأسطر التي تبدأ بـ# تعليمات للمعالج المسبق (preprocessor)، الذي يعمل قبل المترجم نفسه. يُدرج #include <iostream> التصريحات الموجودة في الترويسة القياسية <iostream> (تدفقات الإدخال والإخراج). وفي هذه الترويسة يُصرَّح عن std::cout وstd::endl. لا تملك C++ تعليمة طباعة مدمجة، فالطباعة جزء من المكتبة القياسية، وأنت تستدعيها بهذا السطر.

int main() {

يبدأ تنفيذ كل برنامج C++ من دالة اسمها main. يجب أن توجد دالة واحدة فقط بهذا الاسم، وأن تُكتب بأحرف صغيرة. تعني int قبلها أن main تُرجع عددًا صحيحًا إلى نظام التشغيل عندما تنتهي. والأقواس الفارغة تعني أنها لا تأخذ وسائط هنا، والقوس المعقوف { يبدأ جسم الدالة.

std::cout << "Hello, World!" << std::endl;

هذا السطر هو الذي يطبع فعلًا.

  • std::cout هو تدفق الإخراج القياسي، وهو الطرفية في العادة. تعني البادئة std:: أن cout موجود في مساحة الأسماء std، حيث تُحفظ المكتبة القياسية كلها.
  • << هو مُعامِل الإدراج. يرسل القيمة الموجودة على يمينه إلى التدفق الموجود على يساره. يمكنك تسلسله، وكل << يضيف القطعة التالية إلى الإخراج نفسه.
  • "Hello, World!" قيمة نصية حرفية (string literal): نص بين علامتي تنصيص مزدوجتين.
  • std::endl ينهي السطر.
  • الفاصلة المنقوطة تنهي العبارة. وكل عبارة في C++ تحتاج إلى واحدة.

return 0;

تُنهي return الدالة main وتُعيد قيمة إلى نظام التشغيل. وحسب العُرف تعني 0 أن البرنامج نجح، وأي رقم آخر يشير إلى خطأ. تقرأ السكربتات وأدوات البناء رمز الخروج هذا. وداخل main يكون هذا السطر اختياريًا: إذا وصل التنفيذ إلى القوس المعقوف الختامي، تتصرف C++ كأنك كتبت return 0;.

القوس المعقوف الختامي

ينهي القوس المعقوف الختامي جسم main، وينتهي معه البرنامج.

std::endl مقابل '\n'

هناك طريقتان شائعتان لإنهاء السطر، وكلتاهما تظهر في الكود الحقيقي:

المخرجات:

Hello, World!
Hello again!
Line one
Line two

النتيجة الظاهرة واحدة. الفرق أن std::endl يكتب سطرًا جديدًا ثم يُفرغ التدفق، فيدفع أي نص مخزّن مؤقتًا إلى الطرفية فورًا. أما '\n' فيكتب السطر الجديد فقط، ويُفرغ التدفق نفسه وفق جدوله الخاص (عند انتهاء البرنامج على أبعد تقدير). في حلقة تطبع آلاف الأسطر، يُحدث الإفراغ الإضافي الذي يسببه std::endl فرقًا قابلًا للقياس، ولهذا يستخدم كثير من مبرمجي C++ '\n' افتراضيًا ولا يستخدمون std::endl إلا عندما يجب أن يظهر النص فورًا. ويعمل رمز الهروب \n أيضًا داخل النص، كما يُظهر السطر الثالث. تشرح صفحة الإدخال والإخراج cout وcin بتعمق أكبر.

نسخة using namespace std;

تكتب دروس كثيرة برنامج Hello World بهذا الشكل:

يُخبر using namespace std; المترجم بأن يبحث في مساحة الأسماء std عن الأسماء التي لا يجدها في غيرها، فيعمل cout وendl دون البادئة. هذا مقبول في البرامج الصغيرة والتمارين. أما في الكود الأكبر وفي ملفات الترويسة فيُتجنَّب عادةً، لأنه يُدخل مئات الأسماء القياسية إلى النطاق، وقد تتعارض مع أسمائك (دالة لك اسمها count أو distance مثلًا). كتابة std::cout تكلّف خمسة أحرف وتزيل هذا الخطر.

ترجمة Hello World وتشغيله على حاسوبك

محرر المتصفح يترجم البرنامج نيابة عنك. أما على جهازك فتنفّذ الخطوتين نفسيهما بنفسك: ترجمة الملف المصدري إلى ملف تنفيذي، ثم تشغيل الملف التنفيذي. تحتاج أولًا إلى تثبيت مترجم C++، ويشرح دليل التثبيت إعداده على Windows وmacOS وLinux.

احفظ البرنامج باسم hello.cpp، وافتح طرفية في المجلد نفسه، ثم ترجمه:

g++ hello.cpp -o hello

إذا لم يُطبع شيء، فقد نجحت العملية، وأصبح لديك ملف تنفيذي اسمه hello (hello.exe على Windows) بجوار الملف المصدري. شغّله:

./hello

على Windows شغّل hello.exe أو hello فقط بدلًا من ذلك. وعلى macOS يعمل clang++ hello.cpp -o hello بالطريقة نفسها، وg++ هناك عادةً هو Clang باسم آخر.

يستحق خياران أن تضيفهما من البداية: -std=c++17 (أو -std=c++20) يختار معيار اللغة، و-Wall -Wextra يُفعّلان تحذيرات تكشف أخطاء حقيقية:

g++ -std=c++17 -Wall -Wextra hello.cpp -o hello

تشرح صفحة تصريف C++ ما تفعله هذه الخيارات، وما معنى -o، ولماذا تحصل على ملف اسمه a.out بدونه.

أول الأخطاء الشائعة

نص الأخطاء أدناه من GCC (g++). يصوغ Clang رسائله بشكل مختلف، لكنه يشير إلى السطر نفسه.

فاصلة منقوطة ناقصة.

hello.cpp:5:5: error: expected ';' before 'return'

لا يلاحظ المترجم غياب ; إلا عندما يصل إلى الرمز التالي، لذا يشير رقم السطر عادةً إلى السطر الذي يلي الخطأ. تحقق من نهاية السطر السابق.

#include <iostream> ناقص.

error: 'cout' is not a member of 'std'

يُصرَّح عن std::cout في <iostream>. أضف التضمين في أعلى الملف.

std:: ناقصة.

error: 'cout' was not declared in this scope; did you mean 'std::cout'?

إما أن تكتب std::cout وstd::endl، وإما أن تضيف using namespace std; بعد التضمين.

Main بدلًا من main. لغة C++ حساسة لحالة الأحرف. البرنامج الذي يحتوي على int Main() يُترجَم، ثم يفشل في مرحلة الربط بالخطأ undefined reference to 'main'، لأن الرابط لا يجد الدالة التي يُفترض أن يبدأ منها البرنامج.

الترجمة بـgcc بدلًا من g++. يترجم gcc hello.cpp كود C++ لكنه لا يربط مكتبة C++ القياسية، فتحصل على قائمة طويلة من أخطاء undefined reference to std::.... استخدم g++ (أو clang++) لملفات C++.

علامات التنصيص المنحنية. الكود المنسوخ من معالج نصوص أو من صفحة ويب قد يحتوي على علامات تنصيص طباعية (“Hello”) بدلًا من المستقيمة ("Hello"). يُبلغ GCC عن stray '\342' in program. أعد كتابة علامات التنصيص في محررك.

الترويسات القديمة وvoid main. تستخدم بعض الدروس القديمة جدًا #include <iostream.h> أو void main(). لا شيء منهما من C++ القياسية: الترويسة هي <iostream> دون .h، ويجب أن تُرجع main قيمة int. والمترجمات الحديثة ترفض الاثنين.

الطباعة باستخدام std::println في C++23

أضافت C++23 طريقة أقصر لطباعة سطر، وهي std::println من الترويسة <print>:

#include <print>

int main() {
    std::println("Hello, World!");
}

تضيف السطر الجديد نيابة عنك، وتدعم العناصر النائبة {} للقيم. وصل دعمها في GCC 14، وClang 18 مع libc++، والإصدارات الحديثة من Visual Studio، وتحتاج إلى -std=c++23. معظم الكود والدروس الموجودة ما زالت تستخدم std::cout، لذا يستحق أن تتقن الاثنين.

الأسئلة الشائعة

كيف تكتب برنامج Hello World في C++؟

ابدأ بـ#include <iostream>، ثم عرّف int main() وضع داخلها std::cout << "Hello, World!" << std::endl; ثم return 0;. احفظ الملف باسم hello.cpp، وترجمه باستخدام g++ hello.cpp -o hello، ثم شغّل ./hello.

لماذا يحتاج برنامج Hello World في C++ إلى #include <iostream>؟

std::cout وstd::endl مُعرَّفان في الترويسة <iostream>، وليسا جزءًا مدمجًا في اللغة. بدون هذا التضمين لا يعرف المترجم هذه الأسماء ويتوقف بخطأ مثل 'cout' is not a member of 'std'.

ما الفرق بين std::endl و'\n'؟

كلاهما ينهي السطر. لكن std::endl يُفرغ أيضًا مخزن الإخراج المؤقت، فيُجبر النص على الظهور فورًا. أما '\n' فيكتب السطر الجديد فقط ويترك التدفق يُفرغ نفسه حين يكون جاهزًا، وهذا أسرع عندما تطبع أسطرًا كثيرة. في سطر Hello World واحد لا يوجد فرق ظاهر.

هل أحتاج إلى return 0 في نهاية main في C++؟

لا. الدالة main هي الدالة الوحيدة التي تسمح لك C++ بحذف return منها، فالوصول إلى القوس المعقوف الختامي يُعامل كأنه return 0;، وهذا يُخبر نظام التشغيل بأن البرنامج نجح. ومع ذلك يكتبها كثيرون لجعل حالة الخروج صريحة.

رسم توضيحي للغات البرمجة في Coddy

تعلّم البرمجة مع Coddy

ابدأ الآن