سؤال

لدي هذا السؤال، الذي فكرت فيه سابقًا، لكنني وجدت أنه ليس من السهل الإجابة عليه

int x = x + 1;
int main() {
  return x;
}

سؤالي هو ما إذا كان سلوك البرنامج محددًا أم غير محدد إذا كان صالحًا على الإطلاق.إذا تم تعريفه، هي قيمة x معروف في main?

هل كانت مفيدة؟

المحلول

أنا متأكد من أنه تم تعريفه، ويجب أن يكون لـ x القيمة 1.§3.6.2/1 يقول:"الكائنات ذات مدة التخزين الثابتة (3.7.1) يجب أن تتم تهيئتها صفرًا (8.5) قبل إجراء أي تهيئة أخرى."

بعد ذلك، أعتقد أن الأمر كله واضح ومباشر.

نصائح أخرى

سؤالي هو ما إذا كان سلوك البرنامج محددًا أم غير محدد إذا كان صالحًا على الإطلاق.إذا تم تعريفها، فهل قيمة x معروفة بشكل رئيسي؟

هذا الرمز ليس نظيفًا بالتأكيد، ولكن بالنسبة لي يجب أن يعمل بشكل متوقع.

int x يضع المتغير في مقطع البيانات الذي تم تعريفه على أنه صفر عند بدء البرنامج.قبل main(), ، يتم استدعاء المُهيئات الثابتة.ل x هذا هو الرمز x = x + 1. x = 0 + 1 = 1.وبالتالي فإن main() سيعود 1.

من المؤكد أن الكود سيعمل بطريقة غير متوقعة إذا x هو متغير محلي، مخصص على المكدس.حالة المكدس، على عكس مقطع البيانات، مضمونة إلى حد كبير لاحتواء البيانات المهملة غير المحددة.

المتغير 'x' المخزن في ملف .bss، والذي يتم ملؤه بالصفر عند تحميل البرنامج.وبالتالي، فإن قيمة 'x' هي 0 عندما يتم تحميل البرنامج في الذاكرة.

ثم قبل استدعاء main، يتم تنفيذ "x = x + 1".

لا أعرف إذا كان صحيحا أم لا، ولكن السلوك ليس غير محدد.

قبل الاستدعاء الرئيسي، يجب تهيئة x إلى 0، وبالتالي يجب أن تكون قيمته 1، حيث تقوم بإدخال main، وسوف ترجع 1.إنه سلوك محدد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top