"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > هل الاتصال المتكرر بـ `main()` مسموح به في لغة C++؟

هل الاتصال المتكرر بـ `main()` مسموح به في لغة C++؟

تم النشر بتاريخ 2024-11-04
تصفح:952

Is Recursively Calling `main()` Allowed in C  ?

استدعاء الوظيفة الرئيسية بشكل متكرر في لغة C

يوفر مقتطف الكود محاولات لاستدعاء الوظيفة الرئيسية () بشكل متكرر داخل نفسها في لغة C. ومع ذلك، من المهم ملاحظة أن هذا السلوك غير مسموح به في الامتثال الصارم للغة C.

هل الاتصال المتكرر بـ main() مسموح به في لغة C؟

وفقًا لمعيار C ، لا يمكن للوظيفة استدعاء نفسها مباشرة، بما في ذلك الوظيفة main(). يهدف هذا التقييد إلى منع التكرار اللانهائي وضمان إنهاء البرنامج.

التنفيذ العملي باستخدام g

على الرغم من معيار اللغة، فمن الممكن استدعاء main() بشكل متكرر في الممارسة العملية باستخدام مترجم GNU C (g ). لا يفرض g المعيار بشكل صارم في هذا الصدد، مما يسمح بالتجميع والتنفيذ للتعليمات البرمجية ذات استدعاءات main() العودية.

مثال التعليمات البرمجية

مقتطف التعليمات البرمجية المعدل التالي يوضح استدعاءات main() العودية باستخدام g :

#include 
#include 
using namespace std;

int main() {
    int y = rand() % 10; // returns 3, then 6, then 7
    cout 

عند تجميع هذا الكود وتنفيذه، سيولد هذا الكود المخرجات التالية:

y = 3
y = 6
y = 7

تحليل التجميع

يكشف فحص التجميع الذي تم إنشاؤه لهذا الكود أن g يتعامل مع استدعاءات main() العودية مثل أي استدعاء دالة آخر:

main:
        ...
        cmpl    $7, -12(%rbp)
        je      .L7
        call    main
        ...
.L7:
        ...
        leave
        ret

ملاحظة:

على الرغم من أن هذا السلوك ممكن مع g، فمن المهم ملاحظة أنه غير مضمون. قد يلتزم المترجمون الآخرون بشكل صارم بمعيار C، مما يؤدي إلى حدوث أخطاء في الترجمة أو سلوك غير متوقع. ولذلك، فإن استخدام استدعاءات main() العودية ليس ممارسة موصى بها.

أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3