Строка 273: |
Строка 273: |
| | | |
| Кроме описанных выше операторов, в ДМ встроены несколько полезных математических функций (например функция эмитирующая бросок игральных костей). Более подробно они будут рассмативаться в [[DM_Guide_16|главе 16]]. | | Кроме описанных выше операторов, в ДМ встроены несколько полезных математических функций (например функция эмитирующая бросок игральных костей). Более подробно они будут рассмативаться в [[DM_Guide_16|главе 16]]. |
| + | |
| + | == Арифметические операторы == |
| + | |
| + | Арифметические операторы - это +, -, * и /. Они выполняют сложение, вычитание, умножение и деление. Оператор "-" также может использоваться (в префиксной форме) для отрицания. |
| + | |
| + | |
| + | expression1 + expression2 20pt (addition) |
| + | expression1 - expression2 (subtraction) |
| + | expression1 * expression2 (multiplication) |
| + | expression1 / expression2 (division) |
| + | - expression (negation) |
| + | |
| + | Программисты на языке С должны обратить внимание на то, что деление дает полный результат с плавающей точкой, а не только целочисленную часть. Например, 3/2 дает ожидаемый результат 1,5. |
| + | |
| + | == ** оператор возведения == |
| + | |
| + | Оператор ** возводит левое значение в степень правой части. Не используйте по ошибке для этой цели оператор ^, так как он имеет совершенно другое значение (описано ниже). |
| + | |
| + | |
| + | expression1 ** expression2 |
| + | |
| + | == % оператор остатка == |
| + | |
| + | Оператор % используется для нахождения остатка от деления. Выражение "A % B" читается как «A по модулю B» и равно остатку от деления A на B. Этот оператор работает только с целочисленными аргументами. |
| + | |
| + | expression1 % expression2 |
| + | |
| + | Этот оператор часто используется в циклических событиях. Например, вы можете определить процедуру, которая заставляет солнце вставать, предупреждая людей об особенно неблагоприятных днях. |
| + | |
| + | var |
| + | day_count |
| + | day_of_week //0 is Sunday |
| + | |
| + | proc/NewDay() |
| + | day_count = day_count + 1 |
| + | day_of_week = day_count % 7 //0 through 6 |
| + | |
| + | if(day_of_week == 1) |
| + | world << "It's Monday!" |
| + | else |
| + | world << "A new day dawns." |
| + | |
| + | == Увеличение и уменьшение == |
| + | |
| + | Сложение и вычитание 1 из переменной - настолько распространенные операции, что для них существуют специальные операторы. Увеличение(increment) ++ прибавляет 1 к переменной. Уменьшение(decrement) -- вычитает 1 из переменной. |
| + | |
| + | Каждый из этих операторов имеет префиксную и постфиксную форму. От того, какая из них используется, зависит, будет ли значение выражения в целом взято из переменной до или после изменения ее значения. Префиксная форма изменяет переменную и возвращает результат. Постфиксная форма изменяет переменную, но при этом возвращает ее первоначальное значение. |
| + | |
| + | ++expression |
| + | --expression |
| + | expression++ |
| + | expression-- |
| + | |
| + | В предыдущем примере с восходом солнца можно использовать оператор увеличения(increment). |
| + | |
| + | day_count = day_count + 1 //long-hand |
| + | day_count++ //short-hand |
| + | ++day_count //or even this |
| + | |
| + | В данном случае неважно, какую версию мы использовали - префиксную или постфиксную, потому что мы не использовали значение результирующего выражения. Важен только побочный эффект увеличения переменной day_count, а он одинаков в любом случае. |
| + | |
| + | Мы даже можем объединить увеличение(increment) day_count со следующей строкой, использующей его, следующим образом: |
| + | |
| + | day_count = day_count + 1 //increment |
| + | day_of_week = day_count % 7 //use incremented value |
| + | |
| + | day_of_week = ++day_count % 7 //increment and use it |
| + | |
| + | Обратите внимание, что мы использовали префикс увелечения(increment). Это потому, что мы хотели сначала увеличить значение day_count, а затем использовать его для вычисления дня недели. Постфиксный вариант увелечения(increment) использовал бы существующее значение day_count для вычисления дня недели, а затем увеличил бы его. Таким образом, оба результата оказались бы рассинхронизированы на один день. Конечно, в данном примере это не имеет большого значения, но в некоторых ситуациях это может быть важно. |
| + | |
| + | == Порядок выполнения математических операций == |
| + | |
| + | Как и булевы операторы, математические символы обрабатываются в определенном порядке. Если порядок по умолчанию не подходит, можно использовать круглые скобки для формирования меньших выражений, которые оцениваются первыми. |
| + | |
| + | На рисунке 6.10 представлен порядок операций с математическими символами от высшего к низшему. Операторы, расположенные в одной строке, имеют одинаковый приоритет и поэтому оцениваются по мере их появления в выражении слева направо. |
| + | |
| + | Рисунок 6.10: Порядок выполнения математических операций |
| + | |
| + | ( ) ++ -- -(negation) |
| + | ** |
| + | * / % |
| + | + - |
| | | |
| = Битовые операции = | | = Битовые операции = |