Deklaracja z inicjalizacją zmiennej w switchu

0

Hey, czy może mi ktoś powiedzieć jak to jest, że kompilator wywala mi błąd, gdy chcę stworzyć i od razu zainicjować zmienną w switch-u w C++?
Wywala mi błąd:

error C2360: initialization of 'nazwa_zmiennej' is skipped by 'case' label

Natomiast jak zrobić if-a i w nim zrobię identyczną definicję zmiennej to jest wszystko ok...
Czy to jest kwestia standardu, czy komuś z VS2013 się to nie podobało i zabronił?
Z góry dzięki za odpowiedzi.

4

Case'y w switchu to zwykłe labele, musisz wprowadzić nowy scope (i tak się z tym ifem działo), czyli np.

case abc:
{
   int a;
}
0

Czyli:

case 0:
int a = 5; //error

jest niedozwolone?...
a

case 0:
if(cos_tam)
{
   int a = 5; //jest ok
}

już tak?

1

Źle porównujesz.

case 0:
{
 int a = 5;
}

if (x == y)
{
 int a = 5;
}

Są poprawne.

case 0:
 int a = 5;

if (x == y)
 int a = 5;

Już nie są.

Dostrzegasz różnicę?

0

Aaa, rzeczywiście! Dzięki za wyjaśnienie ;-).
A tak dla pewności jeszcze zapytam:

return lub break powinien być przed klamrą zamykającą czy w taki przypadku w ogóle nie trzeba stosować break-a?

Tzn. czy powinno to być tak:

case 0:
{

break; //or return;
}

czy inaczej?

0

Ok, sprawdziłem :P. Break musi być!
Tak się tylko zastanawiam czy lepiej wewnątrz bloku czy poza klamrami?
tzn.

case 0: //obstawiam, że ta opcja jest bardziej prawidłowa :P
{
break;

}
czy

case 0:
{
//...
}
break;
0

Nie ma znaczenia. { } to po prosu blok kodu, po kończącej klamrze kończy się zakres zdefiniowanych wewnątrz zmiennych i wykonywana jest kolejna linijka. Ja tam zawsze break daje w środku.

1

problem polega na tym, że case może ci wskoczyć za definicję zmiennej i miałbyś UB. Oto porządny przykład pokazujący problem:

switch(x) {
case 0:
    int a = 3;
    jakasFunkcja(a);
    break;

case 1:
    a++; // UB
    jakasFunkcja(a);
}

Zakres pozwala na korzystanie zmiennej a dla case 1 ale wartość nie jest dobrze zdefiniowana.
Najlepiej to naprawić tak jak ktoś napisał wyżej, ograniczając ważność zmiennej do jednego case'a (zamykając kod między klamrami).

1

Należy pamiętać że switch nie jest prymitywną konstrukcją jak w Javie bądź C#, może być przeplatany z while lub do while (mniejsza o przydatność takich konstrukcji), np:

#include <stdio.h>

void duff(int count)
  {
   int n=(count+7)/8;
   printf("n=%d  count =%d\n",n,count%8);
   switch(count%8)
     {
      case 0: 
          do
             { 
                 printf("case 0\n");
      case 7: printf("case 7\n");
      case 6: printf("case 6\n");
      case 5: printf("case 5\n");
      case 4: printf("case 4\n");
      case 3: printf("case 3\n");
      case 2: printf("case 2\n");
      case 1: printf("case 1\n");
             }while( --n >0);
     }
  }

int main()
  {
   duff(33);
   return 0;
  }

http://ideone.com/YumLJh

1 użytkowników online, w tym zalogowanych: 0, gości: 1