Изменения

Перевод части оригинального гайда по DM "Математические операторы". Не претендую на полную точность перевода.
Строка 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)
 +
**
 +
* / %
 +
+ -
    
= Битовые операции =
 
= Битовые операции =
33

правки