2014-01-29 3 views
1

Мой друг только что пошутил, что это возможно в C, на что я ответил: невозможно. Оказалось, что это возможно и компилируется без ЛЮБЫХ предупреждений.Корпус выключателя внутри петли внутри корпуса коммутатора

#include "stdio.h" 

int main(){ 

    int x = 1; 

    switch(x) { 
     case 1: 
      printf("1\n"); 

      while(1) { 
       case 2: 
        printf("bad 2\n");   
      } 
      break; 

     default: 
      printf("default\n"); 
      break;   
    } 

} 

Установка x 1 или 2 результатов в бесконечном цикле печати bad 2 все время.

Почему? Что происходит, как это даже законно ???

Я использую GCC 4.8.2, Windows, -std=c99 ...


Edit: Этот вопрос о том, почему это законно, если оно является законным, и с тех пор, когда. Примеры хороши, но не цель моего вопроса. Я хотел бы знать, что если все это размещение меток case - это сознательный дизайн C или авария или утечка абстрагирования/детализации реализации?

+3

О Дафф, где ты для тебя? –

ответ

0

Стандартный пример/объяснение этого устройство Дафф: http://en.wikipedia.org/wiki/Duff's_device

Я предлагаю вам прочитать статью, а затем задать утонченный вопрос, если есть еще неясные области.

2

Это законно. Зависимая часть switch фактически представляет собой просто произвольный оператор или блок, а метки case и default должны выполнять только правила других меток, а именно префикс инструкции.

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

+0

Да, я сейчас буду читать о Даффе, но это будет только пример. Я прошу, вообще говоря, если это было законно C (с каких это пор?) И, возможно, почему это законно? Java никогда не позволил бы написать такой код. Switch/case - отдельная конструкция, тогда как здесь, на C, кажется (пожалуйста, подтвердите), что это всего лишь ярлык? – Parobay

+0

@Parobay, я ответил, что нет? Он соответствует стандарту C, и это с любой его версией. На ваш вопрос «почему?», Я предполагаю, что C считается простым языком, синтаксически. Зависимая конструкция - это оператор или блок, как для любой из других структур управления. –

+0

http://en.wikipedia.org/wiki/Duff%27s_device#Mechanism это довольно приятно – Parobay

0

Это законный? Да, это потому, что синтаксически вы можете вложить столько раз столько уровней, сколько хотите внутри коммутатора. Это совершенно законно:

switch(a) 
{ 
case 1: break; 
{ 
    { 
     case 2: break; 
    } 
} 
} 

И какое-то время() можно использовать вместо любого заявления. Компилятор не потрудился проверить, что внутри, если все они действительны для операторов С.

Смежные вопросы