الارتباك حول حذف الأقواس الخارجية في قوائم المهيمنة للركام وهياكل الجراب
في عالم البرمجة C ، ينشأ سؤال شائع فيما يتعلق باستخدام أقواس الأبعاد. على وجه التحديد ، قد يواجه المبرمجون سيناريوهات حيث يبدو أن الأقواس الخارجية مطلوبة لأنواع إجمالية معينة ولكن ليس للآخرين. تهدف هذه المقالة إلى التعمق أكثر في الموضوع وتقديم توضيح حول متى يمكن حذف الأقواس الخارجية.
المشكلة
{ int foo شريط مزدوج } ؛ Std :: Array A1 = // خطأ C2078: الكثير من المهيئات { {0 ، 0.1} ، {2 ، 3.4} } ؛ // نعم std :: Arrayيشير الخطأ إلى أن هناك الكثير من المهيئات لـ A1 ، مما يشير إلى أن الأقواس الإضافية مطلوبة. ومع ذلك ، فإن حذف الأقواس الخارجية لـ A2 لا يؤدي إلى خطأ. يثير هذا التناقض السؤال عن سبب حاجة إلى أقواس خارجية لـ A1 ولكن ليس لـ A2. تم تصنيف std :: Array على أنها مجموعة بيانات قديمة (POD) ، في حين أن حاويات المكتبة القياسية الأخرى ليست كذلك. على عكس الحاويات التي تحتوي على مُنشئين من المعرفة من قبل المستخدم ، لا تحتوي Array على الحاويات. أول عضو في البيانات هو مجموعة من الحجم n ، محددة كوسيطة قالب. يتم تهيئة عضو البيانات هذا مباشرة باستخدام قائمة المهيمنة. الأقواس الإضافية ضرورية لأنها ترفع الصفيف الداخلي الذي يتم تهيئته.
struct A { int foo; double bar; }; std::array a1 = // error C2078: too many initializers { {0, 0.1}, {2, 3.4} }; // OK std::arrayلتوضيح هذا المفهوم بشكل أكبر ، فكر بنية Aarray { بيانات [2] ؛ // صفيف داخلي } ؛a2 = {0.1, 2.3};
يتطلب تهيئة هذا الهيكل استخدام الأقواس للدلالة على بداية ونهاية الصفيف الداخلي الذي يتم تهيئته: { {// يبدأ تهيئة الصفيف الداخلي {// تهيئة العنصر الأول من الصفيف الداخلي 0 ، 0.1 } ، // ينتهي تهيئة العنصر الأول {2 ، 3.4} // تهيئة العنصر الثاني من الصفيف الداخلي } // ينتهي تهيئة الصفيف الداخلي } ؛ // خطأ: عدد كبير جدًا من عمليات التهيئة إذا لم تستخدم الأقواس Aarray B1 = { 0 ، 0.1 ، 2 ، 3.4 } ؛
حالة Double
في حالة std :: array
std :: array
struct A { int foo; double bar; }; std::array a1 = // error C2078: too many initializers { {0, 0.1}, {2, 3.4} }; // OK std::arrayينص القسم §8.5.1/11 من مواصفات C 11 على أنه إذا بدأت قائمة التهيئة مع دعامة يسارية ، فإن كل قائمة مفصولة في الفاصلة اللاحقة لسلالات التهيئة تهيئة أعضاء مجموعة فرعية. من ناحية أخرى ، إذا لم تبدأ قائمة التهيئة للفرع الفرعي مع الدعامة اليسرى ، فسيتم أخذ ما يكفي من سلالات التهيئة فقط لتهيئة الأعضاء الفرعية ، مع أي خلايا تهيئة متبقيةa2 = {0.1, 2.3};
المجاميع وهياكل POD ، مثل STD :: Array ، لأن هذه الأنواع لا تحتوي على منشآت محددة من قبل المستخدم ويتم تهيئة الصفيف الداخلي مباشرة. بالنسبة للأنواع البدائية ، من ناحية أخرى ، يمكن حذف الأقواس الخارجية حيث يتم تهيئة القيم البدائية مباشرة داخل الإجمالي. من خلال فهم الفرق بين هذه الحالات ، يمكن للمبرمجين ضمان التهيئة الصحيحة وتجنب أخطاء التحويل البرمجي.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3