понедельник, 30 декабря 2019 г.

Операторы ветвления

    Операторы ветвления - операторы выполняющие код в зависимости от каких либо условий. В этой статье будет рассмотрено три оператора: if, mif, case. Все три оператора используются в коде функции.
    Оператор if:


    В начале идёт ключевое слово if, затем опционально идут объявления переменных и констант или выражения, каждое такое объявление заканчивается точкой с запятой, все созданные переменные и константы доступны только внутри if. Далее идёт выражение возвращающее тип Bool. С новой строки и на 4 пробела правее идёт ключевое слово then, если выражение в if возвращает true, то выполняется код принадлежащий then. Если код в then умещается в одну строку, то код можно писать сразу после then. После then с новой строки опционально идёт ключевое слово else являющееся аналогом then, но код из else выполняется только если выражение в if вернуло false. Примеры if:


if a == 10
    then exit() //выполнится если a равно 10
if b := a + 12; b:foo(); b == 37 //создаст переменную b
    then
        a -= 12 //выполнится если b равно 37
        print(a)//и это тоже
    else print(b)//выполнится если b не равно 37
//здесь b уже не существует
if b .= allOk?(); b //это другое b
    then print("Ok.") //выполнится если b равен true
    else print("Something is wrong.")//выполнится если b равен false

    Оператор mif:

    В начале идёт ключевое слово mif, затем с новой строки и на 4 пробела правее одно или несколько выражений разделенных точкой с запятой, каждое выражение должно возвращать значение типа Bool. Выражения вычисляются по очереди и если какое либо выражение возвращает true, то остальные выражения прекращают выполнятся, а начинает выполняться код принадлежащий выражениям. С новых строк таких выражений и кода может быть сколько угодно, если в одной строке все выражения оказались ложными, то выполнение переходит к новым выражениям. Если нужно что бы последнее выражение выполнилось если все остальные оказались не верными, то можно вместо последнего выражения написать default. Если в конце кода идёт ключевое слово fallthrough, то начнётся выполнение кода из следующего выражений, игнорируя само выражение. Примеры mif:


mif
    a == 10      //если a равно 10
        print(1) //то выполнится этот код
        b = 12   //и этот тоже, после чего будет выполнятся код после всего mif 
    c; a == 12      // если c равен true или a равно 12
        a = 0       //то выполнится этот код
        fallthrough // а затем выполняется вот этот |
    false           //                              |
        c = false   // код <------------------------|
        k = 10      //и этот тоже, после чего будет выполнятся код после всего mif 
    a.inRange?(45, 72) //если a находится в диапазоне от 45 до 72
        exit();        //то выполнится этот код
    default             //если ни одно из выше указанных условий не верно
        print("Hello;") //то выполнится этот код
mif
    a == 3         //если a равно 3
        print("3") //то выполнится этот код, после чего будет выполнятся код после всего mif 
    d == 3         //если d равно 3
        print("10")//то выполнится этот код

    Оператор case:

    В начале идёт ключевое слово case, затем выражение возвращающее значение имеющее один из следующих типов: UInt8, UInt16, UInt32, UInt64, Int8, Int16, Int32, Int64, [UInt8]. После чего идёт ключевое слово of. С новой  строки всё устроенно точно так же как и в mif, включая разделение через точку с запятой, default и fallthrough, но вместо выражений возвращающих Bool, возможные варианты значения выражения расположенного в case.  Если в case выражение возвращает [UInt8], то варианты могут быть только строками, иначе в качестве вариантов могут служить числа(константы), тип(в этом случае используется уникальный номер типа), символ заключённый в одинарные кавычки(в этом случае возвращается код символа), либо один из вариантов перечисления(в этом случае все остальные варианты то же должны быть вариантами перечисления).  Все варианты должны быть уникальны. Примеры case:

case a of
    "Вадим"                                           //если a равно "Вадим"
        print("Здравствуйте Вадим Александрович!\n")  //то выполняется этот код
    "Сергей"                                          //если a равно "Сергей"
        print("Здаров Серёга!\n")                     //то выполняется этот код
    "Максим"; "Павел"; "Алексей"                      //и тд
        print("Вы вошли как ", a, ".\n")
    default
        print("Мы здесь таких как ты не любим!")
        reportProblem(rp_wrongUser, a)

case b.getTypeNumber() of
    UInt8; UInt16; UInt32; UInt64
        exit();
    Int8; Int16; Int32; Int64
        panic();

case c of
    'a'; 'b'; 'c'; 'd'; 'e'; 'f'
        c -= 'a' - 10
    '0'; '1'; '2'; '3'; '4'; '5'; '6'; '7'; '8'; '9'
        c -= '0'

case d of
    some_variant1 //some_variant* это варианты перечисления
        k = 13
        l = 7
    some_variant2; some_variant3
        l = 9
        fallthrough
    some_variant4
        k = 92

case e of
    12
        l = 7
    13; 14
        l = 700
    15
        exit();

    Разумеется case можно реализовать через mif, но case удобнее и работает быстрее.

Комментариев нет:

Отправить комментарий

Пожалуйста без мата и оскорблений. Если хотите сообщить об ошибках, для этого есть форма обратной связи.