Перейти к содержанию

Синтаксис ветвления и выбора варианта

"if" (условный оператор)

Простейший оператор условия "Если, то". Если указанное условие (выражение) выполняется, то заходим в его блок действий, иначе — пропускаем.

  • "Если вижу лост-соула — то выбираю пулемёт"; или
  • "Если сейчас вечер, то включаю Doom".

Синтаксис:

if ( выражение ) {
    действие;
    [...]
}

// Если действие одно, операторные скобки допустимо не ставить:
if ( выражение )
    действие;

"if..else"

Расширение предыдущего варианта. Добавление блока действий, если исходное условие не выполняется:

if ( выражение ) {
    действие_если_выражение_истинно;
    [...]
} else {
    действие_если_выражение_ложно;
    [...]
}

// Оба блока можно записывать без операторных скобок, но обычно считается, что 
//лучше не смешивать в одном "if..else" одновременно два варианта написания. Либо 
//всё с операторными скобками, либо всё без них...
if ( выражение )
    действие_если_выражение_истинно;
else
    действие_если_выражение_ложно;

"switch..case" (оператор выбора)

Конструкция switch..case (в свободном переводе "Переключиться на вариант") позволяет перейти к части кода по условию сравнения какого-либо целочисленного выражения ("выражение") с предзаготовленными вариантами ("вариант1", ...).

Синтаксис приведён ниже. Переносы строк и отступы, как обычно, не учитываются:

switch ( выражение ) {
    case вариант1:
        // <...>
        break;
    case вариант2:
        // <...>
        break;
    // <...>
    default:
        // <...>
        break;
}

switch..case умеет сравнивать следующие типы данных:

1. Целочисленные (int, uint, ...).

switch ( a % 4 ) {
    case 0:
        console.printf( "Four is an integer divisioner of the variable" );
        break;
    case 1:
        console.printf( "Variable modulo 3 is a 1." );
        break;
    case 2:
        console.printf( "Two" );
        break;
    default:
        console.printf( "Not 0, 1 or 2, so three." );
        break;
}


2. Перечисляемый тип (enum).

enum EColors {
    Color_Black = 0,
    Color_Blue,
    Color_Green,
    Color_Red,
    Color_Yellow,
    Color_White
};

EColors currentColor;

// <...>

switch ( currentColor ) {
    case Color_Black:
    case Color_Blue:
        console.printf( "Dark color." );
        break;
    case Color_Red:
    case Color_Green:
        console.printf( "Balanced." );
        break;
    default:
        console.printf( "Light color." );
        break;
}


3. Названия классов (Name). Хоть этот тип и выглядит как строка, но внутри движка преобразуется в целое беззнаковое.

switch ( thing.GetClass() ) {
    case 'Zombieman':
    case 'Shotgunguy':
    case 'Chaingunguy':
        console.printf( "Some kind of zombie. Killing." );
        thing.A_Die();
        break;

    case 'DoomImp':
    case 'Demon':
    case 'Spectre':
    case 'Cacodemon':
        console.printf( "Lesser demon. Taking half of the health." );
        thing.DamageMobj( NULL, NULL, health / 2, 'None' );
        break;

    case 'LostSoul':
        console.printf( "Lost soul. Extinguish!" );
        thing.bBRIGHT = false;
        break;

    default:
        console.printf( "Actor " .. thing.GetClassName() .. " is not a zombie, a lost soul or a lesser demon." );
        break;
}


Обычные строки (заключённые в двойные кавычки) оператор switch-case не сравнивает!

Тернарный оператор

Является коротким вариантом записи "if ( выражение ) если_истинно; else если_ложно;" для случаев, когда смысл результата одинаков — например, когда нужно присвоить значение определённой переменной. Синтаксис: "выражение? если_истинно : если_ложно".

К примеру:

// Такой код:
if ( b > a )
    outvar = 60;
else
    outvar = 111;

// Может быть записан иначе:
outvar = ( b > a? 60 : 111 );

// Аналогично, эта конструкция:
if ( fatal )
    console.printf( "Fatal error!" );
else
    console.printf( "Just logger string." );

// Может быть преобразована в:
console.printf( fatal? "Fatal error!" : "Just logger string." );