Руководство пользователя для GNU Awk
7. Выражения
7.7 Выражения присваивания
Присваивание есть выражение, которое записывает новое значение в переменную. Например, присвоим значение один переменной z:
z = 1 После вычисления этого выражения переменная z получит значение один. Старое значение z будет забыто.
Присваивание может также передавать значение цепочки. Например, присвоим значение "this food is good" переменной message:
thing = "food"
predicate = "good"
message = "this "
thing " is "
predicate
(Это также иллюстрирует конкатенацию строк.) Знак `=' называется оператором присваивания. Это простейшая форма оператора, потому что значение операнда справа сохраняется неизменным.
Большинство операторов (сложение, конкатенация и др.) не производят никаких действий кроме вычисления значения. Если значение игнорируется, оператор можно не использовать. Оператор присваивания не такой; он выдает значение, и даже если вы его игнорируете, все равно переменная изменяется. Мы называем это побочным эффектом.
Левый операнд присваивания не обязан быть только переменной (см. раздел 7.3 [Переменные], стр. 79); он может быть также полем (см. раздел 5.4 [Изменение содержимого поля], стр. 42) или элементом массива (см. главу 11 [Массивы в awk], стр. 123). Все они называются lvalues, что значит, что они могут стоять в левой части оператора присваивания. Правосторонний операнд может быть любым выражением; он выдает новое значение, которое присваивание передает в указанную переменную, поле или элемент массива. (Такие значения называются rvalues).
Важно отметить, что переменные не имеют определенного типа. Ее тип есть тип того значения, которое она хранит в данный момент. В следующем фрагменте программы переменная foo имеет сначала численное значение и потом значение цепочки:
foo = 1 print foo foo = "bar" print foo
Когда второе присваивание дает foo строковое значение, тот факт, что прежнее значение было числом, забывается. Цепочка, которая не начинается с цифры, имеет численное значение нуля. После исполнения следующего кода значением foo будет пять:
foo = "a string" foo = foo + 5
(Заметим, что использование переменной в качестве номера, а позднее как цепочки представляет плохой стиль программирования. Предшествующие примеры показывают как awk работает, а не то, как надо писать программу!)
Присваивание есть выражение, поэтому оно имеет значение, то же самое, которое присваивается. Так, `z = 1' как выражение имеет значение один. Одно из следствий этого есть то, что можно писать кратные присваивания:
x = y = z = 0 присваивает значение 0 всем трем переменным. Оно делает это, так как значение выражения `z = 0', равное нулю, передается в y и затем значение `y = z = 0', которое есть ноль, передается в x.
Можно использовать присваивание всюду, где появляется выражение. Например, можно написать `x != (y = 1)' чтобы присвоить переменной y единицу, а затем проверить, равен ли х единице. Но такой стиль делает программу трудной для чтения; нигде кроме разовых программ, не следует употреблять таких нагромождений присваиваний.
Кроме `=', имеется несколько других операторов присваивания, которые выполняют арифметические действия с старым значением переменной. Например, оператор `+=' вычисляет новое значение, добавляя правостороннее значение к старому значению переменной. Так, следующее присваивание добавляет пять к значению foo:
foo += 5
Это эквивалентно следующему:
foo = foo + 5
Используйте тот вариант, который делает вашу программу более ясной. Имеются ситуации, когда употребление `+=' (или другого оператора присваивания) есть не то же самое, что повторение левого операнда в выражении справа. например:
# Спасибо Pat Rankin за этот пример
BEGIN -
foo[rand()] += 5 for (x in foo)
print x, foo[x]
bar[rand()] = bar[rand()] + 5 for (x in bar)
print x, bar[x] ""
Индексы при bar будут гарантированно разными , потому что rand будет возвращать разные значения при каждом вызове. (Массивы и функция rand еще не рассматривались. См. главу 11 [Массивы в awk], стр. 123, и см. раздел 2.2 [Встроенные числовые функции], стр. 136). Этот пример иллюстрирует важный факт в отношении операторов присваивания: только выражение слева вычисляется один раз.
То, в каком порядке вычисляются выражения, левое и правое, зависит от реализации. Рассмотрим пример:
i = 1 a[i += 2] = i + 1
Значение a[3] может быть либо 2 либо 4.
Приведем таблицу арифметических операторов присваивания. В каждом случае правый операнд представляет выражение, значение которого превращается в число.
lvalue += increment
Добавляет increment к значению lvalue для изменения lvalue.
lvalue -= decrement
Вычитает decrement из значения lvalue.
lvalue *= coefficient
Умножает значение lvalue на coefficient.
lvalue /= divisor
Делит значение lvalue на divisor.
lvalue %= modulus
Присваивает lvalue значение ее остатка по modulus.
lvalue ^= power или lvalue **= power
Возводит lvalue в степень power. (Только оператор `^=' указан в POSIX.) Для максимальной переносимости не употребляйте оператор `**='.
Назад | Вперед
Содержание (общее) | Содержание раздела
Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
|