اذهب إلى المحتوى

السؤال

نشر

أتسأل لماذا يظهر خطأ عندما أحاول إنشاء متغير من داخل جملة Switch كالتالي:

#include <iostream>

int main()
{
    int val = 1;
    switch (val) {
    case 1:
        int x = 123;	// initialization of 'x' is skipped by 'case' label
        break;

    case 2:
        int x = 456;
        break;
    }

    return 0;
}

تظهر لي رسالة الخطأ:
 

initialization of 'x' is skipped by 'case' label

ما هو سبب هذه المشكلة؟ وكيف يمكنني حلها؟

Recommended Posts

  • 1
نشر

جمل case عبارة عن وسوم حالة case label وهذا يعني أن المصرِّف سوف يفهم هذا الجزء على أنه قفز jump (إنتقال مباشر) إلى وسم حالة case label الذي يساوي القيمة val مباشرة، وسبب المشكلة هنا متعلق بالأقواس المعقوفة Curly Brackets، حيث أن الأقواس الخاصة بجملة Switch نفسها تحدد المجال scope بأنه كل شيء داخل جملة Switch، وهذا يعني أن عملية الإنتقال ستتجاهل تعريف متغير x في داخل أي وسم حالة case label لكي لا يحدث خطأ redefined variable، حيث يتم إعتبار أن كل الحالات cases تتبع نفس مجال switch مما يؤدي إلى إعادة تعريف المتغير أكثر من مرة (حسب الحالات cases).

لحل هذه المشكلة يمكن ببساطة إضافة أقواس لكل حالة case، على النحو التالي:

int main()
{
    int val = 1;
    switch (val) {
        case 1:
        {   
            std::cout << "done";
            int x = 123;
            break;
        }
        case 2:
        {
            int x = 456;
            break;
        }
    }

    return 0;
}

أو يمكن أيضًا تعريف المتغير نفسه خارج جملة Switch وتغير قيمته في كل حالة case:

int main()
{
    int val = 1;
    int x;
    switch (val) {
    case 1:
        std::cout << "done";
        x= 123;
        break;

    case 2:
        x = 456;
        break;
    }

    std::cout << x;	// 123

    return 0;
}

يفضل أن تستعمل كلا الطريقتين السابقتين (إستعمال الأقواس وتعريف المتغير خارج switch)، ليكون الكود في النهاية على هذا الشكل:
 

int main()
{
    int val = 1;
    int x;
    switch (val) {
        case 1:
        {
            std::cout << "done";
            x = 123;
            break;
        }
        case 2:
        {
            x = 456;
            break;
        }
    }
    std::cout << x;	// 123
    return 0;
}

يوجد حل آخر أقل شيوعًا وهو تعريف المتغير داخل جملة Switch نفسها، ولكن هذا الأمر سوف يؤدي إلى أن يكون المتغير تابع إلى مجال scope جملة switch وبالتالي لا يمكنك أن تستعمل هذا المتغير  خارج Switch:
 

int main()
{
    int val = 1;
    switch (val) {
    int x;	// تعريف المتغير داخل switch نفسها
        case 1:
        {
            std::cout << "done";
            x = 123;
            break;
        }
        case 2:
        {
            x = 456;
            break;
        }
    }
    std::cout << x;	// Error: 'x': undeclared identifier

    return 0;
}

يمكنك أن تستعمل الكود السابق في حالة أردت أن تستعمل المتغير x داخل Switch فقط، وليس خارجها.

يمكنك أن تقرأ أكثر حول وسوم الحالة case labels من خلال هذه المقالة:

أو من خلال هذه المقالة التي تشرح جملة Switch بالتفصيل:

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...