Короче, здорова, пользователи павно.ру. С вами [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