"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > لماذا يبدو تعديل المتغير "const" من خلال مؤشر غير ثابت ناجحًا، لكنه لا يغير قيمته فعليًا؟

لماذا يبدو تعديل المتغير "const" من خلال مؤشر غير ثابت ناجحًا، لكنه لا يغير قيمته فعليًا؟

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

Why Does Modifying a `const` Variable Through a Non-Const Pointer Seem to Work, but Doesn\'t Actually Change Its Value?

تعديل ثابت من خلال مؤشر غير ثابت

في لغة C، لا يمكن تعديل متغير const بمجرد تهيئته. ومع ذلك، في بعض السيناريوهات، قد يبدو أنه تم تغيير متغير const. خذ بعين الاعتبار الكود التالي:

const int e = 2;

int* w = (int*)&e;        // (1)
*w = 5;                   // (2)

cout 

إذا قمت بتشغيل هذا الكود، ستلاحظ سلوكًا غير متوقع:

5
2

على الرغم من تغيير *w إلى 5 في (2)، إلا أن e لا يزال يحتفظ بقيمته الأصلية وهي 2. وينبع هذا السلوك المتناقض ظاهريًا من العوامل التالية:

  • (1 ) إلغاء الإشارة إلى مؤشر const (w) يسمح بالتعديل.
  • (2) يتم تخزين القيمة المعدلة في موقع الذاكرة المشار إليه بواسطة w، والذي في هذه الحالة هو موقع الذاكرة حيث يتم تخزين e.
  • ومع ذلك، يقوم المترجم بتحسين الكود، والتعامل مع e كثابت في وقت الترجمة وعدم تقييمه في وقت التشغيل.

ونتيجة لذلك، عندما يتم تقييم *w في وقت التشغيل، فإنه يُرجع القيمة المعدلة (5). ومع ذلك، عندما يتم تقييم e في وقت الترجمة، يتم استخدام قيمته الأصلية (2).

يُعرف هذا السلوك بالسلوك غير المحدد في لغة C. تعديل متغير ثابت بشكل مباشر أو غير مباشر يؤدي إلى عواقب لا يمكن التنبؤ بها، ويجب توخي الحذر في مثل هذه المواقف.

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

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

Copyright© 2022 湘ICP备2022001581号-3