OberonCore
https://forum.oberoncore.ru/

Ещё немного о контекстной связи
https://forum.oberoncore.ru/viewtopic.php?f=27&t=2575
Страница 1 из 5

Автор:  AVC [ Вторник, 20 Апрель, 2010 02:13 ]
Заголовок сообщения:  Ещё немного о контекстной связи

Сегодня на работе товарищ показал маленький кусок кода на Си и спросил, какое значение должна вернуть функция _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 в произвольном месте) в пользу синтаксической?
Что вы думаете по этому поводу?

Автор:  Geniepro [ Вторник, 20 Апрель, 2010 07:52 ]
Заголовок сообщения:  Re: Ещё немного о контекстной связи

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 ]
Заголовок сообщения:  Re: Ещё немного о контекстной связи

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

Автор:  Валерий Лаптев [ Вторник, 20 Апрель, 2010 09:21 ]
Заголовок сообщения:  Re: Ещё немного о контекстной связи

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

Автор:  Info21 [ Вторник, 20 Апрель, 2010 09:46 ]
Заголовок сообщения:  Re: Ещё немного о контекстной связи

AVC писал(а):
Смысл этого поста -- вовсе не критика языка Си.
Смысл он такой ... самоорганизовывающийся.

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

Автор:  Alexey Veselovsky [ Вторник, 20 Апрель, 2010 10:00 ]
Заголовок сообщения:  Re: Ещё немного о контекстной связи

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

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

Автор:  Alexey Veselovsky [ Вторник, 20 Апрель, 2010 10:05 ]
Заголовок сообщения:  Re: Ещё немного о контекстной связи

На самом деле тут ещё отступы в заблуждение вводят.
Вот так то оно было бы думаю понятней (заодно отрезал лишние скобочки фигурные):

Код:
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:

Автор:  Geniepro [ Вторник, 20 Апрель, 2010 10:15 ]
Заголовок сообщения:  Re: Ещё немного о контекстной связи

Александр Ильин писал(а):
Я с Си плохо знаком, но ошибок в коде не вижу. Результат = 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

Автор:  Geniepro [ Вторник, 20 Апрель, 2010 10:19 ]
Заголовок сообщения:  Re: Ещё немного о контекстной связи

Alexey Veselovsky писал(а):
Не знаю кому как, а мне эта структура была видна сразу :roll:
А я всегда считал, что у switch должен быть составной statement, потому что как-то не заморачивался тонкостями описания этой конструкции, а все примеры видел только с составным statement'ом...

Автор:  Валерий Лаптев [ Вторник, 20 Апрель, 2010 10:28 ]
Заголовок сообщения:  Re: Ещё немного о контекстной связи

Это к вопросу о том, что полезнее для правильного написания: скобочки {}, которые запросто можно и пропустить, или завершающее конструкцию слово end.

Автор:  Евгений Темиргалеев [ Вторник, 20 Апрель, 2010 10:30 ]
Заголовок сообщения:  Re: Ещё немного о контекстной связи

По-моему, тут дело не в скобочках, а в структурности операторов...

Автор:  Валерий Лаптев [ Вторник, 20 Апрель, 2010 10:54 ]
Заголовок сообщения:  Re: Ещё немного о контекстной связи

Ве же ИМХО обязательное завершение операторов - оно до некоторой степени "принуждает" к структурности, а необязательные скобочки - не принуждают, а обеспечивают средство...

Автор:  Geniepro [ Вторник, 20 Апрель, 2010 11:43 ]
Заголовок сообщения:  Re: Ещё немного о контекстной связи

Валерий Лаптев писал(а):
Это к вопросу о том, что полезнее для правильного написания: скобочки {}, которые запросто можно и пропустить, или завершающее конструкцию слово end.

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

Автор:  Валерий Лаптев [ Вторник, 20 Апрель, 2010 12:10 ]
Заголовок сообщения:  Re: Ещё немного о контекстной связи

Geniepro писал(а):
Валерий Лаптев писал(а):
Это к вопросу о том, что полезнее для правильного написания: скобочки {}, которые запросто можно и пропустить, или завершающее конструкцию слово end.

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

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

Автор:  Илья Ермаков [ Вторник, 20 Апрель, 2010 12:20 ]
Заголовок сообщения:  Re: Ещё немного о контекстной связи

Ещё раз: значимые отступы не должны отменять необходимость END.

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

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

Автор:  Alexey Veselovsky [ Вторник, 20 Апрель, 2010 12:26 ]
Заголовок сообщения:  Re: Ещё немного о контекстной связи

Илья Ермаков писал(а):
Ещё раз: значимые отступы не должны отменять необходимость END.
Введение дополнительного (хорошего) ограничения не провоцирует ни к каким либеральностям.
А то получается торговля: вот, одно строже, а на другое забьём.

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

Автор:  Евгений Темиргалеев [ Вторник, 20 Апрель, 2010 12:48 ]
Заголовок сообщения:  Re: Ещё немного о контекстной связи

Alexey Veselovsky писал(а):
Илья Ермаков писал(а):
Ещё раз: значимые отступы не должны отменять необходимость END.

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

Автор:  Geniepro [ Вторник, 20 Апрель, 2010 12:50 ]
Заголовок сообщения:  Re: Ещё немного о контекстной связи

Илья Ермаков писал(а):
Ещё раз: значимые отступы не должны отменять необходимость END.
С завершающим END теряется смысл в значимых отступах. Они перестают быть семантически значимыми.

Автор:  Илья Ермаков [ Вторник, 20 Апрель, 2010 13:26 ]
Заголовок сообщения:  Re: Ещё немного о контекстной связи

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

Автор:  AVC [ Вторник, 20 Апрель, 2010 13:27 ]
Заголовок сообщения:  Re: Ещё немного о контекстной связи

Alexey Veselovsky писал(а):
На самом деле тут ещё отступы в заблуждение вводят.

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

Страница 1 из 5 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/