سؤال

هذا السؤال لديه بالفعل إجابة هنا:

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

خطأ:التعبير المتوقع قبل "int"

شفرة:

switch (i) {
    case 0:
        int j = 1;
        break;
}

لماذا إجراء مكالمة ل NSLog() قبل أن يؤدي إلى أية أخطاء؟

switch (i) {
    case 0:
        NSLog(@"wtf");
        int j = 1;
        break;
}
هل كانت مفيدة؟

المحلول

أنت في الواقع يستطيع قم بإعلان المتغيرات داخل المحول إذا قمت بذلك وفقًا لبناء جملة اللغة.لقد حصلت على خطأ بسبب "case 0:" هي علامة، وفي لغة C من غير القانوني أن يكون لديك علامة تصريح كالبيان الأول بعد التسمية - لاحظ أن المترجم يتوقع تعبير, ، مثل استدعاء الأسلوب، والمهمة العادية، وما إلى ذلك.(على الرغم من غرابتها، هذه هي القاعدة).

عندما تضع NSLog() أولاً، فإنك تتجنب هذا القيد.يمكنك إحاطة محتويات الحالة بأقواس { } لتقديم كتلة تحديد النطاق، أو يمكنك نقل تعريف المتغير خارج المحول.الذي تختاره هو مسألة تفضيل شخصي.فقط انتبه إلى أن المتغير المُعلن بين الأقواس { } يكون صالحًا فقط ضمن هذا النطاق، لذا فإن أي كود آخر يستخدمه يجب أن يظهر أيضًا ضمن تلك الأقواس.


يحرر:

بالمناسبة، هذه الغرابة ليست غير شائعة كما قد تظن.في C وJava، من غير القانوني أيضًا استخدام إعلان متغير محلي كعبارة وحيدة (بمعنى "غير محاط بأقواس") في ل, بينما, ، أو يفعل حلقة، أو حتى في لو و آخر شروط.(في الواقع، هذا ما تم تناوله في اللغز رقم 55 من "ألغاز جافا", ، وهو ما أوصي به بشدة.) أعتقد أننا عمومًا لا نكتب مثل هذه الأخطاء في البداية لأنه ليس من المنطقي الإعلان عن متغير باعتباره البيان الوحيد في مثل هذه السياقات.مع يُحوّل / قضية ومع ذلك، فإن بعض الناس يحذفون الأقواس منذ ذلك الحين استراحة البيان هو البيان الحاسم للتحكم في التدفق.

لرؤية تناسب رمي المترجم، انسخ هذا المقتطف المروع وغير المجدي في كود (الهدف-)C الخاص بك:

if (1)
    int i;
else
    int i;
for (int answer = 1; answer <= 42; answer ++)
    int i;
while (1)
    int i;
do
    int i;
while (1);

هناك سبب آخر لاستخدام الأقواس { } دائمًا لتحديد جسم هذه التركيبات.:-)

نصائح أخرى

لقد واجهت هذه المشكلة من قبل، وكان الاستنتاج هو أنك قمت للتو بوضع الكود داخل كتلة.

switch (i) {
case 0:
    {
        int j = 1;
        break;
    }
}

الحل البسيط الآخر الذي أستخدمه هو إضافة تعبير فارغ (فاصلة منقوطة) قبل الإعلان.يؤدي هذا إلى تجنب قصر نطاق المتغير على كتلة التعليمات البرمجية (أو وجود بعض عبارات الحالة مع كتل التعليمات البرمجية وبعضها بدونها).

switch (i) {
    case 0:;
        int j = 1;
        break;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top