Проблема с оператором switch - PullRequest
2 голосов
/ 19 декабря 2011

Давайте посмотрим на проблему по коду:

code-1

#include <stdio.h>

int main(int argc, char *argv[])
{
    int a =1;
    switch (a)
    {
        printf("This will never print\n");
    case 1: 
        printf(" 1");
        break;
    default:
        break;
    }   
    return 0;
}

Здесь оператор printf() никогда не будет выполнен - ​​см. http://codepad.org/PA1quYX3. Но

код-2

#include <stdio.h>
int main(int argc, char *argv[])
{
    int a = 1;
    switch (a)
    {
        int b;
    case 1:
        b = 34; 
        printf("%d", b);
        break;
    default:
        break;
    }   
    return 0;
}

Здесь int b будет объявлено - см. http://codepad.org/4E9Zuz1e.

Яне понимаю, почему в коде 1 printf() не выполняется, но в коде 2 int b будет выполняться.

Почему?

Редактировать: я понял, что b;является декларацией, и она выделяет память во время компиляции, поэтому, будет ли достигнут поток управления там или нет, эта декларация будет выполнена.

Теперь посмотрим этот кодв пути потока управления все еще это не собирается компилировать ... почему?

Ответы [ 2 ]

7 голосов
/ 19 декабря 2011

Думайте о switch как о goto с ярлыками.Неважно, где вы goto, поскольку объявление переменной находится выше того места, где вы его используете, вы можете его использовать.Это частично связано с тем фактом, что объявление переменной не является исполняемым оператором, который выполняется как выражение.Этот переключатель почти эквивалентен:

int a  = 1;

{
    if (a == 1) goto case1;
    goto defaultcase;

    int b;

case1:
    b = 34;
    printf("%d", b);
    goto end;

defaultcase:
    goto end;

end:
}

return 0;

И goto не имеют ничего общего с областью действия b.

Попробуйте сделать это, хотя:

switch (a)
{
int b = 1;
....

В этом случае, даже если объявлено b, инициализация будет пропущена, поскольку является исполняемым оператором, который может быть выполнен или не выполнен.Ваш компилятор должен предупредить вас, если вы попытаетесь это сделать.

Относительно объявления внутри if (обновленный вопрос): В этом случае a имеет область действия, ограниченную if.Он создается при вводе области и уничтожается при завершении области.

2 голосов
/ 19 декабря 2011

Поскольку int b; является объявлением, и компилятор не будет генерировать для него код.

int a = 1;

switch (a) {

/* Instructions corresponding to the code here will not be executed */
/* printf("hi"); Instructions for such code will never be executed */
/* int b;      It is just a declaration. No executable code is generated for it*/

int b = 34;/*Replaced int b by int b = 34 now b will never be initialized to 34*/
case 1:
   printf("%d",b);      /*you will get garbage value now*/
   break;
default:
   break;
}
...