OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Понедельник, 09 Декабрь, 2019 20:41

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 86 ]  На страницу 1, 2, 3, 4, 5  След.
Автор Сообщение
 Заголовок сообщения: Ещё немного о контекстной связи
СообщениеДобавлено: Вторник, 20 Апрель, 2010 02:13 
Аватара пользователя

Зарегистрирован: Суббота, 19 Ноябрь, 2005 15:59
Сообщения: 803
Откуда: Зеленоград
Сегодня на работе товарищ показал маленький кусок кода на Си и спросил, какое значение должна вернуть функция _tmain.
Я разобрался с некоторым трудом. (Можете попробовать сами. :) )
Код:
int _tmain(int argc, _TCHAR* argv[])
{
    int g = 8;
    int a = 90;
    int d = 1;
    switch (g)
    {
        case 8:
        {
            switch (d)
            case 0:
                a = 4;
                break;
            case 1:
                a = 5;
                break;
        }
    }
    return a;
}
Смысл этого поста -- вовсе не критика языка Си.
Я просто задумался: а вдруг Николай Вальтерович где-то самую малость прав, полностью отказавшись в Обероне-07 от контекстной связи (LOOP/EXIT, RETURN в произвольном месте) в пользу синтаксической?
Что вы думаете по этому поводу?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 20 Апрель, 2010 07:52 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
AVC писал(а):
Я разобрался с некоторым трудом. (Можете попробовать сами. :) )
Попытался разобраться, почему компилятор принимает этот код, а не сообщает об ошибке, и как оно вообще там работает. :shock:

D. Jones, 'The New C Standard. An Economic and Cultural Commentary' писал(а):
1746

If a converted value matches that of the promoted controlling expression, control jumps to the statement
following the matched case label.

Commentary

A case label can appear on any statement in the switch body.
Код:
switch (x)
    default : if (prime(x))
                  case 2: case 3: case 5: case 7:
                      process_prime(x);
              else
                  case 4: case 6: case 8: case 10:
                      process_composite(x);

There can be more practical uses for this functionality.

Coding Guidelines

Experience suggests that developers treat the case label value as being the result of evaluating the expression
appearing in the source (i.e., that no conversion, driven by the type of the controlling expression, takes place).
A conversion that causes a change of value is very suspicious. However, no instances of such an event occur
in the Usage .c files or have been experienced by your author. Given this apparent rarity no guideline
recommendation is made here.

Вапще жестоко. "О сколько нам открытий чудных..." :lol:


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 20 Апрель, 2010 08:03 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2318
Откуда: Россия, Томск
Geniepro писал(а):
Попытался разобраться, почему компилятор принимает этот код, а не сообщает об ошибке, и как оно вообще там работает.
Я с Си плохо знаком, но ошибок в коде не вижу. Результат = 5, да?
С if'ами попроще бы было разобраться, факт.
Geniepro писал(а):
Вапще жестоко. "О сколько нам открытий чудных..." :lol:
Запрыгивание в цикл: http://en.wikipedia.org/wiki/Duff's_device


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 20 Апрель, 2010 09:21 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3124
Откуда: Астрахань
Не, в примере не так все просто. В примере отсутствуют скобки блока во вложенном switch - поэтому не так все просто. Надо хорошенько про switch почитать.
А вообще лично мне извраты с casами просто не нравятся. У страуструпа тоже есть пример, когда цикл do while с casами переплетен - УЖОС!!!!


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 20 Апрель, 2010 09:46 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8211
Откуда: Троицк, Москва
AVC писал(а):
Смысл этого поста -- вовсе не критика языка Си.
Смысл он такой ... самоорганизовывающийся.

"Ceterum censeo Carthaginem esse delendam." (c) Cato Maior.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 20 Апрель, 2010 10:00 

Зарегистрирован: Вторник, 25 Апрель, 2006 16:21
Сообщения: 2180
Откуда: Нижний Новгород
Валерий Лаптев писал(а):
Не, в примере не так все просто. В примере отсутствуют скобки блока во вложенном switch - поэтому не так все просто. Надо хорошенько про switch почитать.
А вообще лично мне извраты с casами просто не нравятся. У страуструпа тоже есть пример, когда цикл do while с casами переплетен - УЖОС!!!!

Замечу что это не Страуструпов пример, а вполне известная реализация известного алгоритма. На этом форуме это даже обсуждали помнится. Пыталить то же самое, но структурно написать на Обероне -- не получилось. Зато на драконе всё получилось.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 20 Апрель, 2010 10:05 

Зарегистрирован: Вторник, 25 Апрель, 2006 16:21
Сообщения: 2180
Откуда: Нижний Новгород
На самом деле тут ещё отступы в заблуждение вводят.
Вот так то оно было бы думаю понятней (заодно отрезал лишние скобочки фигурные):

Код:
int main()
{
    int g = 8;
    int a = 90;
    int d = 1;
    switch (g)
    {
        case 8:
            switch (d)
                case 0:
                    a = 4;
            break;
        case 1:
            a = 5;
            break;       
    }
    return a;
}


Не знаю кому как, а мне эта структура была видна сразу :roll:


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 20 Апрель, 2010 10:15 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
Александр Ильин писал(а):
Я с Си плохо знаком, но ошибок в коде не вижу. Результат = 5, да?

С точки зрения читателя этот кусок:
Код:
        case 8:
        {
            switch (d)
            case 0:
                a = 4;
                break;
            case 1:
                a = 5;
                break;
        }
должен выглядеть так:
Код:
        case 8:
            switch (d)
            {
            case 0:
                a = 4;
                break;
            case 1:
                a = 5;
                break;
            }
Тогда результат будет равен 5.

Однако синтаксис оператора switch таков:
Код:
switch (expression) statement;
где statement вовсе не обязан быть составным оператором с case-метками.
Поэтому ЦПУ следует такому пути:
Код:
    int g = 8;
    int a = 90;
    int d = 1;
    switch (g)
    {
        case 8: // сюда попадаем: g == 8
        {
            switch (d) // d == 1

            case 0:    // поэтому сюда не попадаем
                a = 4; // и этот оператор присваивания не выполняется

            // а тут уже оператор switch (d) заканчивается, так как у него несоставной statement (case 0: a = 4;)

                break; // упс! а этот break уже относится к оператору switch (g), выходим к оператору return a;

            case 1:    // мёртвый код
                a = 5; // мёртвый код
                break; // мёртвый код
        }
    }
    return a; // a нигде не менялся, поэтому равен 90


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 20 Апрель, 2010 10:19 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
Alexey Veselovsky писал(а):
Не знаю кому как, а мне эта структура была видна сразу :roll:
А я всегда считал, что у switch должен быть составной statement, потому что как-то не заморачивался тонкостями описания этой конструкции, а все примеры видел только с составным statement'ом...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 20 Апрель, 2010 10:28 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3124
Откуда: Астрахань
Это к вопросу о том, что полезнее для правильного написания: скобочки {}, которые запросто можно и пропустить, или завершающее конструкцию слово end.


Последний раз редактировалось Валерий Лаптев Вторник, 20 Апрель, 2010 10:41, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 20 Апрель, 2010 10:30 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4539
Откуда: Россия, Орёл
По-моему, тут дело не в скобочках, а в структурности операторов...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 20 Апрель, 2010 10:54 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3124
Откуда: Астрахань
Ве же ИМХО обязательное завершение операторов - оно до некоторой степени "принуждает" к структурности, а необязательные скобочки - не принуждают, а обеспечивают средство...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 20 Апрель, 2010 11:43 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
Валерий Лаптев писал(а):
Это к вопросу о том, что полезнее для правильного написания: скобочки {}, которые запросто можно и пропустить, или завершающее конструкцию слово end.

Полезнее -- значимые отступы, двумерный синтаксис, и не нужны ни скобочки, ни завершающий end.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 20 Апрель, 2010 12:10 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3124
Откуда: Астрахань
Geniepro писал(а):
Валерий Лаптев писал(а):
Это к вопросу о том, что полезнее для правильного написания: скобочки {}, которые запросто можно и пропустить, или завершающее конструкцию слово end.

Полезнее -- значимые отступы, двумерный синтаксис, и не нужны ни скобочки, ни завершающий end.

Со значимыми отступами и двумерном синтаксисом - я согласен. Но завершающий end остается таким же полезным и в этом случае... :)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 20 Апрель, 2010 12:20 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9162
Откуда: Россия, Орёл
Ещё раз: значимые отступы не должны отменять необходимость END.

Введение дополнительного (хорошего) ограничения не провоцирует ни к каким либеральностям.

А то получается торговля: вот, одно строже, а на другое забьём.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 20 Апрель, 2010 12:26 

Зарегистрирован: Вторник, 25 Апрель, 2006 16:21
Сообщения: 2180
Откуда: Нижний Новгород
Илья Ермаков писал(а):
Ещё раз: значимые отступы не должны отменять необходимость END.
Введение дополнительного (хорошего) ограничения не провоцирует ни к каким либеральностям.
А то получается торговля: вот, одно строже, а на другое забьём.

С другой стороны, к чему плодить сущности?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 20 Апрель, 2010 12:48 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4539
Откуда: Россия, Орёл
Alexey Veselovsky писал(а):
Илья Ермаков писал(а):
Ещё раз: значимые отступы не должны отменять необходимость END.

С другой стороны, к чему плодить сущности?
Сущность здесь одна: составной оператор (с "разъёмами" для последовательности операторов). END явно обозначает конец последовательности и самого оператора.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 20 Апрель, 2010 12:50 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
Илья Ермаков писал(а):
Ещё раз: значимые отступы не должны отменять необходимость END.
С завершающим END теряется смысл в значимых отступах. Они перестают быть семантически значимыми.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 20 Апрель, 2010 13:26 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9162
Откуда: Россия, Орёл
Они обязательны в силу требований наглядности структуры. Никакого семантического обоснования для этого не требуется. Сказано - надо, и всё.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 20 Апрель, 2010 13:27 
Аватара пользователя

Зарегистрирован: Суббота, 19 Ноябрь, 2005 15:59
Сообщения: 803
Откуда: Зеленоград
Alexey Veselovsky писал(а):
На самом деле тут ещё отступы в заблуждение вводят.

Мне бы такое зрение: увидеть отсутствие сишных скобок с первого раза. Но, увы... не Султан. :oops:
Тут ещё как дело было. Подходит ко мне мой товарищ Миша и говорит так печально: мол, Лёша, беда, у меня Visual C "сломался". На голубом глазу.
Я и повёлся. Не плачь, говорю, дитя, сейчас мы твою программу хорошим компилятором откомпилируем. Потом 5 минут возни и вот таких раздумий: :shock: .
Позднее Миша уверял, что эта программа у него получилась "случайно, просто скобки забыл", но "что-то не верю я их хитрым рожам" (c). Издевался, гад, -- факт. :)


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 86 ]  На страницу 1, 2, 3, 4, 5  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2019, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB