На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> Switch , Инициализация переменных
    Почему в Switche так можно,

    int g;
    g = 1;

    а так нельзя

    int g = 1;

    smile.gif
      Поточнее вопрос попробуй задать smile.gif
      Где именно инициализация нельзя?
      int a=1;
       switch(a){
         case 1:
         {
           int b=2;
         }
       }


       int a=1;
       int b;
       switch(a){
         case 1:
         {
           b=2;
         }
       }


        case что то:
          int g = 1;
        break;


        Так ругается


        case что то:
          int g;
          g = 1;
        break;


        а так нет dry.gif
        Сообщение отредактировано: -=Маббус=- -
          По-моему в стандарте говориться, что переменную можно объявлять в любом месте, куда можно запихать эту инструкцию. И по поводу switch тоже нет исключения.
          Лично у меня компиляться нормально оба варианта от Lavrik'а.
            Цитата (-=Маббус=- @ 23.11.03, 14:56)

            case что то:
              int g = 1;
            break;


            Так ругается

            Нужно поставить скобки { }...
              а почему без них нельзя rolleyes.gif в чем ограничения dry.gif
                Цитата (-=Маббус=- @ 23.11.03, 15:06)
                а почему без них нельзя rolleyes.gif в чем ограничения dry.gif

                Ограничения в компиляторе! Читай C2360.
                  Цитата (-=Маббус=- @ 23.11.03, 16:06)
                  а почему без них нельзя rolleyes.gif в чем ограничения dry.gif

                  Скобки нужны для создания области действия переменной.
                    Ещё из этой же серии приколы с for(int i=0;...) и когда область видимости до конца блока, в котором объявлен for, хотя чисто принципиалино for'ом она(область видимости, в смысле) должна и ограничиться
                    ЗЫ
                    Ликвидно для MSVisualC++
                      почему только внутри for? smile.gif
                      объявление же вне фигурных скобок, обозначающих тело цикла сделано, так что как есть -- правильнее smile.gif Тем более, что иногда удобнее анализировать значение счетчика, а не какое-то сложное условие после выхода из цикла smile.gif
                        2Visitor: Насколько я помню, значение переменной-счетчика после выхода из for неопределено - не факт, что там будет именно то, что было на последнем шаге цикла. Только я не помню, верно ли это для VC++.
                          Ну... мне еще ни разу не попадался компилятор, имеющий такой еффект... Хотя не не могу исключить его существование, например, при использовании каких-то особенных (профильных и т.п.) библиотек и режимов компиляции smile.gif
                          ---
                          Да и вообще, C -- не [ctrl_Y smile.gif], нормальные компиляторы ведут себя _естественно_, даже если при етом приходится нарушать какие-то стандарты. smile.gif
                          Сообщение отредактировано: Visitor -
                            Цитата
                            нормальные компиляторы ведут себя _естественно_, даже если при етом приходится нарушать какие-то стандарты.
                            Вот с этим солгасен smile.gif
                            Кстати, я залез в MSDN и нашел, что по стандарту C++, действительно, переменная, объявленная в операторе for, должна иметь в качестве области видимости только тело цикла. Но в MSVC++, by default, областью видимости считается та, в которой объявили for. Причем:
                            Цитата
                            By default, under /Ze, a variable declared in a for loop remains in scope until the for loop's enclosing scope ends.
                            /Zc:forScope enables standard behavior of variables declared in for loops.
                            Сообщение отредактировано: reporter -
                              Что и требовалось доказатьЖ)))))
                              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                              0 пользователей:


                              Рейтинг@Mail.ru
                              [ Script execution time: 0,0302 ]   [ 16 queries used ]   [ Generated: 11.05.25, 16:37 GMT ]