Синтаксис ветвления и выбора варианта¶
"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 если_ложно;" для случаев, когда смысл результата одинаков — например, когда нужно присвоить значение определённой переменной. Синтаксис: "выражение? если_истинно : если_ложно".
К примеру: