1. Си / Говнокод #5990

    +127

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    [code=Си]
    switch(n)
    case 1:
    {
      /* code1 */
      /* fallthrough */
      case 2:
      /* code 2 */
    }
    [/code]

    Все имена и явки изменены!
    Сцуко, работает. Щас в стандарт полезу, интересно же! Обвиняют меня, я киваю на издержки мержа. Но смешно.

    Запостил: nil, 15 Марта 2011

    Комментарии (17) RSS

    • А, шит. Уже забыл, как тут оформлять код:)
      Ответить
    • показать все, что скрытоНу скажем так, компилировуаться это не будет, не надо сказки рассказывать: под `switch` должен располагаться compound statement, т.е. statement, заключенный в `{}`. А уж внутри него могут сидет метки `case`. А вот так как выше, т.е. `case 1` за пределами compound statement - никаких шансов.

      А то, что отдельные `case`-метки могут сидеть на разных уровнях вложения compound statement - так это не фокус. Так называемый "duff's device" в детском саду С/C++ изучают, там этого навалом.
      Ответить
      • Это вы gcc4.4.4 рассказывайте, про то, что будет, а что не будет компилироваться.
        А про то, что должно быть в switch — пункту 6.8.1 стандарта.
        Ответить
        • ОК, беру свои слова обратно. Да, действительно в том, что `case 1` оказалось за пределами свитчевого compound statement ничего нелегального нет. Ничего, бывает...
          Ответить
          • А как же "Вряд ли кто-то здесь в состянии хотя бы отдаленно сравниться со мной в знании стандарта языка С" ?
            Ответить
          • Даже я, хоть больше 20 лет с Си знаком, но в стандарте иногда интересные вещи откапываю:)
            Ответить
        • И кстати, 4.5.0 не кушает из-за отсутствия `;` после case 2:
          Ответить
          • Кстати, да. Компилироваться - не будет. Но причину я указал неправильно. `case` - это метки. А метки могут быть прилеплены только к statement. В данном примере `case 2` - не относится ни к какому statement.
            Ответить
            • Это как раз тот пункт стандарта - labelled statement.
              Ответить
          • Блин, ну что вы придираетесь:) Это же макет кода! Я просто не стал писать оригинал, потому что он рояли не играет. В оригинале, конечно, все запяточия были.
            Ответить
            • В таком случае, это скорее псевдокод, чем код на си. В приведенном виде код не компилируется. А ясновидением тут мало кто наделен.
              Ответить
              • Не знаю, я вместо комментов про код подставил бы любой statement и ништяк. Но замечание учту!
                Сегодня вообще день приколов был. Один очень тонкий глюк, связанный, кажется, с тем, что у нас какие-то функции для округления double-а химичат с его представлением в памяти. Там такие фееричные глюки сегодня видел! Правда, на hpux-е каком-то мрачном. Если время будет, то раскопаю, в чем дело…
                Ответить

    Добавить комментарий