Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Где порыть чтобы понимать работу парсера кода поглубже  (Прочитано 9110 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Boriska
Помогающий

us
Offline Offline

« : 30-03-2015 08:43 » 

Привет команда и форумчане.
Постоянно всплывает код работу которого трудно себе объяснить при помощи
широкодоступной документации по С и С++ (для чайников). Где можно порыть
чтобы понимать работу парсера кода. Например после прочтения скажем Шилдта
или Липмана понять как работает этот switch не удается.

Код: (C++)
#include "stdafx.h"

int main(int argc, char* argv[])
{
        printf("Hello World!\n");
        int mode = 0;
        int result = 0;
        int a = 1;

        switch(mode){
                case 0: if(a) {
                case 1: result = 1;
                           break;
                           } else {
                case 2:     result = 2;
                               break;
                           }
        }
        return 0;
}

Вот пример в виде картинки (первоисточник). http://img0.joyreactor.cc/pics/post/geek-%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D1%84%D0%B8%D1%87%D0%B0-%D1%81%D0%B8-1989249.jpeg
« Последнее редактирование: 30-03-2015 08:45 от Boriska » Записан
darkelf
Молодой специалист

se
Offline Offline

« Ответ #1 : 30-03-2015 11:29 » 

имхо, если переписать в switch в виде if/else + goto (чем он в принципе и является), всё станет понятно:
Код: (C)
#include <stdio.h>

int main(int argc, char* argv[])
{
        int mode = 0;
        int result = 0;
        int a = 0;

        if (mode == 0) goto case_0;
        else if (mode == 1) goto case_1;
        else if (mode == 2) goto case_2;
        else goto end;

case_0: if (a) {
case_1:   result = 1;
          goto end;
        } else {
case_2:   result = 2;
          goto end;
        }
end:
        return 0;
}
Другое дело, что несмотря на то, что так писать можно, имхо, так писать ненужно.
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #2 : 30-03-2015 20:39 » 

А что понимать? Это очень плохой код. В серьезных компаниях за такое увольняют. Ибо поддерживать такой код очень проблематично.

А так, код после case выполняется до конца switch или до break. И не важно, если дальше еше будут case стоять. Нырнули в один case и дальше уже на другие не реагируем, их можно смело изымать из кода, при трассировке онного.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Boriska
Помогающий

us
Offline Offline

« Ответ #3 : 01-04-2015 12:33 » 

Это понятно что код плохой, и так не надо.
Хотелось бы понимать почему можно записать (if в той же строке что и case) так и не будет ругаться
Код: (C++)
switch(mode){
                case 0: if(a) {
                case 1: result = 1;
                           break;                  
когда везде пишеться что надо

Код: (C++)
switch(mode){
                case 0:
                case 1:
                         if(a) { result = 1;  break; }
Однако если тебя научат ходить в дверь, можно и не узнать, что можно вылезти через окно. Соотсветственно кирдык настанет, если при пожаре
двери заблокированы.
Получается что огромное количество народа до конца не понимают как рабтает свич. Вот к примеру ответ моего знакомого сертифицированного С++
программиста
Код: (C++)
Честно не знаю, в С switch это самый неадекватный оператор, как по мне. В том же C# его намного модифицировали
Записан
darkelf
Молодой специалист

se
Offline Offline

« Ответ #4 : 01-04-2015 12:47 » 

Хотелось бы понимать почему можно записать (if в той же строке что и case) так и не будет ругаться
Потому-что в своё время в стандарте на язык не сказали, что компилятор должен ругаться, вот он и не ругается. Плюс ко всему, в погоне за оптимизацией, уже появились вещи, подобные этой, и запрещать так делать уже было поздно.
« Последнее редактирование: 01-04-2015 12:53 от darkelf » Записан
Dale
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 02-04-2015 11:44 » new

Получается что огромное количество народа до конца не понимают как рабтает свич.

Сомневаюсь, что так уж огромное. Упомянутая darkelf'ом "Машина Даффа" и подобные конструкции - довольно распространенные идиомы, при правильном использовании они могут оказаться полезны. Например, на их использовании основан весьма годный механизм организации сопрограмм Саймона Тетхема, а также многочисленные реализации протопотоков, без которых очень тяжко было бы реализовать распараллеливание задач на встроенных системах со скромными ресурсами. Данный пример использования switch - лишь напоминание о том, что язык C - более тонкий инструмент, чем кажется после прочтения букварей.
Записан

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

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines