سؤال

لنفترض لدي هذا (C ++ أو ربما C) رمز:

vector<int> my_vector;
for (int i = 0; i < my_vector.size(); i++) {
    my_vector[i] = 0;
}

وأنا لا يهمني إذا انها فعلت الصحيح. الجزء المهم هو في الإعلان عن حلقة. المترجم يعطي موقعة / عدم تطابق غير الموقعة لهذا، لأن حجم () بإرجاع عدد صحيح بدون إشارة، وليس وقعت واحدة. ما هي أهمية تغيير i إلى غير موقعة؟ أعلن عدادات حلقة كما [إينتس] من هذه العادة، ولكن إذا كان هذا هو الخطأ المحتمل سوف يجبر نفسي للخروج من هذه العادة.

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

المحلول

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

في هذه الحالة، لهذا الخطأ المحدد، هو على الأرجح ليس صفقة كبيرة - على منصة 32 بت عليك أن يكون لديك أكثر من 2 مليار الإدخالات في ناقلات قبل غير موقعة من شأنه أن التفاف إلى قيمة قعت السلبية. للحصول على ناقلات مثل هذا من شأنه أن يستنفد كل من الذاكرة الخاصة بك، لذلك ربما لا يمكن أن يحصل في حالة حيث وقع / عدم تطابق غير موقعة من شأنه أن يهم.

نصائح أخرى

ومن الناحية الفنية، ينبغي أن يكون i على vector<int>::size_type. يجب أن تحصل في العادة من استخدام typedefs في التعليمات البرمجية:

typedef vector<int> VectorType;
VectorType my_vector;
for (VectorType::size_type i = 0; i < my_vector.size(); i++) {
    my_vector[i] = 0;
}

والآن، إذا كان لنا تغييره إلى deque، ونحن فقط تغيير سطر واحد. حتى لو كان بعض الحاويات المخصصة التي لديها size_type أحمق، يمكنك الحصول على الحارة، شعور غامض بأن كل شيء سيكون على ما يرام. وهذا يستحق الكثير. حتى مع عادل غير موقعة / وقعت، وهناك بعض القضايا الترويج صعبة مع استخدام قعت / تحويل غير الموقعة التي ستأتي لا محالة إلى لدغة لك.

وهذا قد يكون مهما في الحادث بعيد احتمال أن حجم ناقلات يتجاوز INT_MAX. إذا كان حجم ناقلات أكبر من القيمة القصوى التي يمكن أن تكون ممثلة في int وقعت، ثم حلقة الخاص بك وسوف تنتهي أبدا.

حسنا، من المهم بسبب الأعداد الصحيحة وقعت لها علامة، حتى أتمكن من الذهاب على طول الطريق حتى تصبح قيمة سالبة، ثم لا يهم كيف انها كبيرة، فإنه لا يزال أقل من حجم ()، الذي لا يتلقى أي علامة.

<اقتباس فقرة>   

11111111 <10000000

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

وتأكد من وجود عدد قليل كما تحذيرات وقت ممكن.

وكما ذكر أعلاه، واستخدام ناقلات :: size_type. أو استخدام مكرر لحلقة من خلال ناقلات الخاص بك. تأكد من التعامل مع جميع التحذيرات الخاصة بك على أنها أخطاء.

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