Mohssen A Mohssen نشر 23 نوفمبر 2021 أرسل تقرير نشر 23 نوفمبر 2021 أتسأل لماذا يظهر خطأ عندما أحاول إنشاء متغير من داخل جملة 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 ما هو سبب هذه المشكلة؟ وكيف يمكنني حلها؟ 1 اقتباس
1 سامح أشرف نشر 23 نوفمبر 2021 أرسل تقرير نشر 23 نوفمبر 2021 جمل 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 بالتفصيل: 1 اقتباس
السؤال
Mohssen A Mohssen
أتسأل لماذا يظهر خطأ عندما أحاول إنشاء متغير من داخل جملة Switch كالتالي:
تظهر لي رسالة الخطأ:
initialization of 'x' is skipped by 'case' label
ما هو سبب هذه المشكلة؟ وكيف يمكنني حلها؟
1 جواب على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.