Короче, здорова, пользователи павно.ру. С вами [A]Le[X]and[R].
В общем начнем с того, что урок про операторы уже был на форуме. Но его автор, который являлся модератором раздела (за что ему только давали модерку - он все поудалял о_О), попросил удалить ее. Вот решил написать свой урок!
Приступаем к самому уроку!
Что же такое оператор?
Оператор - это литерал, который заставляет компилятор выполнять некоторое действие. Операторы воздействуют на операнды (аргументы операции). Операндами в PAWN могут быть как отдельные литералы, так и целые выражения. Мы рассмотрим 5 видов операторов:
*операторы присваивания
*математические операторы
*операторы отношений
*логические операторы
*условный оператор
[color=DarkOrange]Оператор присваивания
Оператор присваивания ( = ) позволяет заменить значение операнда, расположенного с левой стороны от знака равенства, значением, вычисляемым с правой стороны от него. Так, выражение:
x = a + b;
присваивает операнду x значение, которое является результатом сложения значений переменных a и b.
Операнд, который может находиться с левой стороны от оператора присваивания, называется адресным операндом, или l-значением (от англ. "left" - левый). Операнд, который может находиться справа от оператора присваивания называется операционным операндом, или r-значением (от англ. "right" - правый).
Константы/числа могут быть только r-значениями и никогда не бывают адресными операндами, поскольку значения констант изменять нельзя! То есть:
x = 35; // Верно 35 = x; // Ошибка
Обратите внимание, что все l-значения могут быть r-значениями, но не все r-значения могут быть l-значениями
Математические операторы
В PAWN используется 5 математических операторов: сложения ( + ), вычитания ( - ), умножения ( * ), деления( / ) и деления по модулю ( % ).
В операциях сложения, вычитания и умножения разобраться не сложно. Мы подробно разберем операторы деления
Целочисленное деление и деление по модулю
Целочисленное деление отличается от обычного. При делении числа 21 на число 4 (24 / 4) в результате целочисленного деления в ответе получается 5 и остаток 1.
Чтобы получить остаток, нужно число 21 разделить по модулю 4 (21 % 4), в результате получим остаток 1.
Совместное использование математических операторов и операторов присваивания
Нет ничего необычного в том, чтобы к переменной прибавить некоторое значение, а потом присвоить результат той же переменной. Если у вас есть переменная a и вы хотите увеличить ее значение на 2 можно записать следующее:
new a = 5, temp; temp = a + 2; a = temp
Однако этот метод грозит излишествами. В языке PAWN можно поместить одну и ту же переменную по обе стороны о оператора присваивания, и тогда предыдущий блок сведется лишь к одному выражению:
a = a + 2;
В алгебре это выражение рассматривалось бы как бессмысленное, но в PAWN оно читается следующим образом: добавить 2 к значению переменной a и присвоить результат переменной a.
Но существует еще более простой вариант предыдущей записи:
a += 2;
Оператор присваивания с суммой ( += ) добавляет r-значение к l-значению, а затем снова записывает результат в l-значение. Если бы до начала выполнения выражения переменная a была бы равна 4,то после ее выполнения значение переменной стало бы 6.
Помимо оператора присваивания с суммой существуют также операторы присваивания с вычитанием ( -= ), делением ( /= ), умножением ( *= ), делением по модулю ( %= ).
Инкремент и декремент
Очень часто требуется к переменной прибавить/вычесть единицу. В языке PAWN увеличение значения на 1 называется инкрементом, а уменьшение на 1 - декрементом. Для этих действий предусмотрены специальные операторы.
Оператор инкремента ( ++ ) увеличивает значение переменной на 1, а оператор декремента ( -- ) - уменьшает на 1. Так, если у вас есть переменная a и вы хотите увеличить ее на единицу, то вы можете записать:
a++;
Такой же результат можно получить и другими способами:
a = a + 1;
или
a += 1;
Префикс и постфикс
Как оператор инкремента, так и оператор декремента могут работать в 2 вариантах: префиксном и постфиксном. Префиксный вариант записывается перед переменной ( ++a ), а постфиксный - после него ( a++ ).
В простом выражении вариант использования не имеет большого значения, но в сложном при выполнении инкремента одной переменной с последующим присваиванием результата другой переменной это вполне существенно. Префиксный оператор вычисляется до присваивания, постфиксный - после.
Семантика префиксного оператора:
*Инкрементируем значение
*Считываем его
Семантика постфиксного оператора:
*Считываем значение
*Инкрементируем оригинал
Для тех, кто не совсем понял, покажу на примере:
new a, b, c, d;
a = ++b;
c = d++;
printf("A = %d, C = %d", a, c);
printf("B = %d, D = %d", b, d);Выведет:
[center]Приоритеты операторов[/center]
Хочу сказать, что в PAWN у операторов такие же приоритеты, как и в алгебре: действия в скобках; умножение, деление; сложение, вычитание
Истина / ложь
В языке PAWN существует особый тип переменных - bool. Объявление:
new bool:a;
Отличие этой переменной от переменных целочисленного типа в том, что она может вернуть только 2 значение: true (истину) или false (ложь).
Любое выражение можно рассмотреть с точки зрения - истинно или ложно. Математические выражения, возвращающие 0, можно расценивать как ложные. Все остальные - как истинные.
P.S. Это нам пригодится в следующем разделе.
Операторы отношений
Операторы отношений используются для выяснения равенства или неравенства двух значений. Выражения сравнения всегда возвращают значения true или false.
Всего в языке PAWN существует 6 операторов отношений. Они все представлены ниже:
*[b]Равно ( == )[/b]
100 == 50 (false)
50 == 50 (true)
*[b]Не равно ( != )[/b]
100 != 50 (true)
50 != 50 (false)
*[b]Больше ( > )[/b]
100 > 50 (true)
50 > 50 (false)
*[b]Больше или равно ( >= )[/b]
100 >= 50 (true)
50 >= 50 (true)
*[b]Меньше ( < )[/b]
100 < 50 (false)
50 < 50 (false)
*[b]Меньше или равно ( <= )[/b]
100 <= 50 (false)
50 <50>= 5) // Если a больше или равно 5
{
// Ваш код
}
else // иначе
{
// Ваш код
}Логические операторы
Довольно часто возникает необходимость проверять не одно условное выражение, а несколько. Например, правда ли что x > y и y != z. Для этого используются логические операторы.
Логическое И ( && )
Логический оператор И вычисляет 2 выражения, и, если оба выражения возвращают true, то и оператор И вернет true. А если хотя бы одно выражение возвращает false, то и оператор И вернет false. Пример:
if(x == 5 && y == 5)
если x и y равны 5, то все выражение вернет true. Если хотя бы один из них не равен 5, то все выражение вернет false. Обратите внимание, что выражение возвращает true только в том случае, если истинны обе его части.
Логическое ИЛИ ( || )
Логический оператор ИЛИ также вычисляет 2 выражения, и, если любое из них истинно, также вернет true. При использования ИЛИ нет необходимости соблюдения двух условий сразу. Вам достаточно выполнения одного из них. Пример:
if(x == 5 || y == 5)
Выражение возвратит true, если либо x, либо y, либо они оба равны 5.
Логическое НЕТ ( ! )
Логический оператор НЕТ возвращает true, если тестируемое выражение является ложным (возвращает false). И наоборот, если тестируемое выражение является истинным, то оператор НЕТ вернет false. Пример:
if(!(x == 5))
вернет true, только если x не равно 5. Это выражение можно записать и по-другому:
if(x != 5)
Условный оператор
Условный оператор ( ?: ) - единственный оператор в PAWN, который работает сразу с тремя операндами. Синтаксис условного оператора:
(выражение1) ? (выражение2) : (выражение3)
Это читается следующим образом: если выражение1 возвращает true, то выполняется выражение2, в противном случае выполняется выражение3. Обычно возвращаемое значение присваивается некоторой переменной. Пример:
z = (x > y) ? x : y;
Это выражение присвоит переменной z большее значение (если больше x - присвоит значение x, если больше y - присвоит значение y)
Вот впринципи и все
Будут какие-то замечания или дополнения, прошу отписываться
Копирайты:
Основано на уроке Джесса Либерти
Примеры для префиксного и постфиксного инкрементов - Romanius