"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > لماذا تؤدي طباعة مؤشر دالة بدون استدعاء إلى \"1\" في C++؟

لماذا تؤدي طباعة مؤشر دالة بدون استدعاء إلى \"1\" في C++؟

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

Why Does Printing a Function Pointer Without Invocation Yield \

طباعة مؤشر دالة بدون استدعاء: فهم المخرجات الغامضة لـ 1

في مقتطف تعليمات برمجية مثير للاهتمام، يتم "استدعاء" دالة بدون استدعاء الأقواس ("pr؛") ثم طباعتها باستخدام std::cout. ومن المثير للدهشة أن النتيجة تنتج باستمرار 1، متحدية التوقعات.

لغز الثابت 1s

يستدعي الكود الدالة pr بثلاث طرق مختلفة:

cout  يقترح الحدس أنه يجب طباعة مؤشر دالة بدلاً من الرقم 1 المبهم. ومع ذلك، فإن فهم هذا السلوك يتطلب التعمق في آليات تحويل النوع C. 

تحويل النوع والقيم المنطقية

عند تمريرها كوسيطة إلى cout، يكون pr ضمنيًا تم تحويله إلى بول. يحدث هذا التحويل لأن bool هو نوع أساسي، ويتطلب cout نوعًا أساسيًا كمدخل. في لغة C، تكون القيمة المنطقية المحولة صحيحة إذا كانت القيمة الأصلية غير صفرية وخاطئة إذا كانت صفرًا.

نظرًا لأن pr هو مؤشر دالة، فإن قيمته هي عنوان ذاكرة غير صفري. وبالتالي، عند التحويل إلى منطقي، يتم تقييمه إلى صحيح، والذي يتم إخراجه كـ 1 بواسطة cout.

تخصيص طباعة مؤشر الوظيفة (C 11 وما بعده)

يقدم C 11 تحميل زائد قابل للتخصيص يسمح بطباعة أكثر إفادة لمؤشرات الوظائف:

القالب std::ostream &operator

template 
std::ostream & operator

cout

يوفر هذا الأسلوب مخرجات وصفية أكثر، مما يسهل فهم خصائص مؤشر الدالة.

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

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

Copyright© 2022 湘ICP备2022001581号-3