Что такое бинарный оператор
Перейти к содержимому

Что такое бинарный оператор

Унарные и бинарные операторы

Чем отличается унарные и бинарные операторы друг от друга? Почему приоритет бинарного оператора + и — ниже унарного + и -?

ban ★
03.05.05 15:09:47 MSD

Re: Унарные и бинарные операторы

первые работают с одним аргуметом, вторые с двумя, неужели нельзя было догадаться из названия?

anonymous
( 03.05.05 15:14:48 MSD )
Ответ на: Re: Унарные и бинарные операторы от anonymous 03.05.05 15:14:48 MSD

Re: Унарные и бинарные операторы

извени но я латинского не знаю, так что догадаться не смог. Можешь привести примеры первого и второго?

ban ★
( 03.05.05 15:18:21 MSD ) автор топика

Re: Унарные и бинарные операторы

ban ★
( 03.05.05 15:20:31 MSD ) автор топика

Re: Унарные и бинарные операторы

Бинарные:
a — b
a + b
a * b
if(a && b)

Selecter ★★★★
( 03.05.05 16:00:37 MSD )
Ответ на: Re: Унарные и бинарные операторы от Selecter 03.05.05 16:00:37 MSD

Re: Унарные и бинарные операторы

Унарные операции выполняются справа налево.
В отличие от унарных, бинарные операции выполняются слева направо.

Selecter ★★★★
( 03.05.05 16:03:17 MSD )
Ответ на: Re: Унарные и бинарные операторы от Selecter 03.05.05 16:03:17 MSD

Re: Унарные и бинарные операторы

ban ★
( 03.05.05 17:22:22 MSD ) автор топика
Ответ на: Re: Унарные и бинарные операторы от Selecter 03.05.05 16:03:17 MSD

Re: Унарные и бинарные операторы

> В отличие от унарных, бинарные операции выполняются слева направо.

dilmah ★★★★★
( 03.05.05 19:03:56 MSD )
Ответ на: Re: Унарные и бинарные операторы от dilmah 03.05.05 19:03:56 MSD

Re: Унарные и бинарные операторы

a = b = c;
Здесь просто 2 унарных операции

По той ссылке есть таблица
1.3.16.

Selecter ★★★★
( 03.05.05 19:51:47 MSD )
Ответ на: Re: Унарные и бинарные операторы от dilmah 03.05.05 19:03:56 MSD

Re: Унарные и бинарные операторы

Опеартор присваивания — бинарный. Это для него характерно =)

ukez
( 03.05.05 19:56:03 MSD )
Ответ на: Re: Унарные и бинарные операторы от Selecter 03.05.05 19:51:47 MSD

Re: Унарные и бинарные операторы

> Здесь просто 2 унарных операции

anonymous
( 03.05.05 20:16:24 MSD )
Ответ на: Re: Унарные и бинарные операторы от ukez 03.05.05 19:56:03 MSD

Re: Унарные и бинарные операторы

Как он может быть бинарным?
Сравнения бинарный ==
или такие +=, -=, *=, /=

Selecter ★★★★
( 03.05.05 20:38:00 MSD )
Ответ на: Re: Унарные и бинарные операторы от Selecter 03.05.05 20:38:00 MSD

Re: Унарные и бинарные операторы

Ты просто поверь (тебе так будет проще), что оператор присваивания — бинарный.

anonymous
( 03.05.05 20:40:53 MSD )
Ответ на: Re: Унарные и бинарные операторы от Selecter 03.05.05 20:38:00 MSD

Re: Унарные и бинарные операторы

Если честно, мне не понятно как он может быть унарным ? При присваивании _всегда_ есть значение и символ/ячейка памяти/переменная/етц которому это значение присваивается.

Унарный оператор присваивания это какой-то программерский постмодернизм .

ukez
( 03.05.05 20:50:07 MSD )
Ответ на: Re: Унарные и бинарные операторы от Selecter 03.05.05 20:38:00 MSD

Re: Унарные и бинарные операторы

селектор, переставай людей смешить, да? чем _синтаксически_ отличается конструкция «op1 + op2» от конструкции «op1 = op2»? ничем.

тем более что в цпп оператор присвоения может быть переопределен, но тем не менее он всё равно останется _бинарным_.

anonymous
( 03.05.05 21:00:43 MSD )
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.

Похожие темы

  • Форум PHP: операторы сравнения и назначения (2012)
  • Форум Уведомление оператора (2006)
  • Форум Проблема. Доступ к перегруженному оператору объекта через указатель объекта. Откликнитесь знатоки С++ (2001)
  • Форум Классификация операторов в Lisp (2015)
  • Форум Оператор ввода (2014)
  • Форум Правила переопределения операторов (2014)
  • Форум Задержка для vip оператора (2013)
  • Форум порядок обработки операторов new и . (2014)
  • Форум Перегрузка оператора (2015)
  • Форум Ожидается унарный оператор (Работа с календарем) (2019)

Базовые операторы, математика

Многие операторы знакомы нам ещё со школы: сложение + , умножение * , вычитание — и так далее.

В этой главе мы начнём с простых операторов, а потом сконцентрируемся на специфических для JavaScript аспектах, которые не проходят в школьном курсе арифметики.

Термины: «унарный», «бинарный», «операнд»

Прежде, чем мы двинемся дальше, давайте разберёмся с терминологией.

  • Операнд – то, к чему применяется оператор. Например, в умножении 5 * 2 есть два операнда: левый операнд равен 5 , а правый операнд равен 2 . Иногда их называют «аргументами» вместо «операндов».
  • Унарным называется оператор, который применяется к одному операнду. Например, оператор унарный минус «-» меняет знак числа на противоположный:

let x = 1; x = -x; alert( x ); // -1, применили унарный минус
let x = 1, y = 3; alert( y - x ); // 2, бинарный минус вычитает значения

Математика

Поддерживаются следующие математические операторы:

  • Сложение + ,
  • Вычитание — ,
  • Умножение * ,
  • Деление / ,
  • Взятие остатка от деления % ,
  • Возведение в степень ** .

Первые четыре оператора очевидны, а про % и ** стоит сказать несколько слов.

Взятие остатка %

Оператор взятия остатка % , несмотря на обозначение, никакого отношения к процентам не имеет.

Результат a % b – это остаток от целочисленного деления a на b .

alert( 5 % 2 ); // 1, остаток от деления 5 на 2 alert( 8 % 3 ); // 2, остаток от деления 8 на 3 alert( 8 % 4 ); // 0, остаток от деления 8 на 4

Возведение в степень **

Оператор возведения в степень a ** b возводит a в степень b .

В школьной математике мы записываем это как a b .

alert( 2 ** 2 ); // 2² = 4 alert( 2 ** 3 ); // 2³ = 8 alert( 2 ** 4 ); // 2⁴ = 16

Математически, оператор работает и для нецелых чисел. Например, квадратный корень является возведением в степень ½:

alert( 4 ** (1/2) ); // 2 (степень 1/2 эквивалентна взятию квадратного корня)

Сложение строк при помощи бинарного +

Давайте рассмотрим специальные возможности операторов JavaScript, которые выходят за рамки школьной арифметики.

Обычно при помощи плюса ‘+’ складывают числа.

Но если бинарный оператор ‘+’ применить к строкам, то он их объединяет в одну:

let s = "моя" + "строка"; alert(s); // моястрока

Обратите внимание, если хотя бы один операнд является строкой, то второй будет также преобразован в строку.

alert( '1' + 2 ); // "12" alert( 2 + '1' ); // "21"

Как видите, не важно, первый или второй операнд является строкой.

Вот пример посложнее:

alert(2 + 2 + '1' ); // будет "41", а не "221"

Здесь операторы работают один за другим. Первый + складывает два числа и возвращает 4 , затем следующий + объединяет результат со строкой, производя действие 4 + ‘1’ = ’41’ .

Сложение и преобразование строк — это особенность бинарного плюса + . Другие арифметические операторы работают только с числами и всегда преобразуют операнды в числа.

Например, вычитание и деление:

alert( 6 - '2' ); // 4, '2' приводится к числу alert( '6' / '2' ); // 3, оба операнда приводятся к числам

Приведение к числу, унарный +

Плюс + существует в двух формах: бинарной, которую мы использовали выше, и унарной.

Унарный, то есть применённый к одному значению, плюс + ничего не делает с числами. Но если операнд не число, унарный плюс преобразует его в число.

// Не влияет на числа let x = 1; alert( +x ); // 1 let y = -2; alert( +y ); // -2 // Преобразует не числа в числа alert( +true ); // 1 alert( +"" ); // 0

На самом деле это то же самое, что и Number(. ) , только короче.

Необходимость преобразовывать строки в числа возникает очень часто. Например, обычно значения полей HTML-формы — это строки. А что, если их нужно, к примеру, сложить?

Бинарный плюс сложит их как строки:

let apples = "2"; let oranges = "3"; alert( apples + oranges ); // "23", так как бинарный плюс объединяет строки

Поэтому используем унарный плюс, чтобы преобразовать к числу:

let apples = "2"; let oranges = "3"; // оба операнда предварительно преобразованы в числа alert( +apples + +oranges ); // 5 // более длинный вариант // alert( Number(apples) + Number(oranges) ); // 5

С точки зрения математика, такое изобилие плюсов выглядит странным. Но с точки зрения программиста тут нет ничего особенного: сначала выполнятся унарные плюсы, которые приведут строки к числам, а затем бинарный ‘+’ их сложит.

Почему унарные плюсы выполнились до бинарного сложения? Как мы сейчас увидим, дело в их приоритете.

Приоритет операторов

В том случае, если в выражении есть несколько операторов – порядок их выполнения определяется приоритетом, или, другими словами, существует определённый порядок выполнения операторов.

Из школы мы знаем, что умножение в выражении 1 + 2 * 2 выполнится раньше сложения. Это как раз и есть «приоритет». Говорят, что умножение имеет более высокий приоритет, чем сложение.

Скобки важнее, чем приоритет, так что, если мы не удовлетворены порядком по умолчанию, мы можем использовать их, чтобы изменить приоритет. Например, написать (1 + 2) * 2 .

В JavaScript много операторов. Каждый оператор имеет соответствующий номер приоритета. Тот, у кого это число больше, – выполнится раньше. Если приоритет одинаковый, то порядок выполнения – слева направо.

Отрывок из таблицы приоритетов (нет необходимости всё запоминать, обратите внимание, что приоритет унарных операторов выше, чем соответствующих бинарных):

Приоритет Название Обозначение
15 унарный плюс +
15 унарный минус
14 возведение в степень **
13 умножение *
13 деление /
12 сложение +
12 вычитание
2 присваивание =

Так как «унарный плюс» имеет приоритет 15 , который выше, чем 12 у «сложения» (бинарный плюс), то в выражении «+apples + +oranges» сначала выполнятся унарные плюсы, а затем сложение.

Присваивание

Давайте отметим, что в таблице приоритетов также есть оператор присваивания = . У него один из самых низких приоритетов: 2 .

Именно поэтому, когда переменной что-либо присваивают, например, x = 2 * 2 + 1 , то сначала выполнится арифметика, а уже затем произойдёт присваивание = с сохранением результата в x .

let x = 2 * 2 + 1; alert( x ); // 5

Присваивание = возвращает значение

Тот факт, что = является оператором, а не «магической» конструкцией языка, имеет интересные последствия.

Большинство операторов в JavaScript возвращают значение. Для некоторых это очевидно, например сложение + или умножение * . Но и оператор присваивания не является исключением.

Вызов x = value записывает value в x и возвращает его.

Благодаря этому присваивание можно использовать как часть более сложного выражения:

let a = 1; let b = 2; let c = 3 - (a = b + 1); alert( a ); // 3 alert( c ); // 0

В примере выше результатом (a = b + 1) будет значение, которое присваивается переменной a (то есть 3 ). Потом оно используется для дальнейших вычислений.

Забавное применение присваивания, не так ли? Нам нужно понимать, как это работает, потому что иногда это можно увидеть в JavaScript-библиотеках.

Однако писать самим в таком стиле не рекомендуется. Такие трюки не сделают ваш код более понятным или читабельным.

Присваивание по цепочке

Рассмотрим ещё одну интересную возможность: цепочку присваиваний.

let a, b, c; a = b = c = 2 + 2; alert( a ); // 4 alert( b ); // 4 alert( c ); // 4

Такое присваивание работает справа налево. Сначала вычисляется самое правое выражение 2 + 2 , и затем результат присваивается переменным слева: c , b и a . В конце у всех переменных будет одно значение.

Опять-таки, чтобы код читался легче, лучше разделять подобные конструкции на несколько строчек:

c = 2 + 2; b = c; a = c;

Польза от такого стиля особенно ощущается при быстром просмотре кода.

Сокращённая арифметика с присваиванием

Часто нужно применить оператор к переменной и сохранить результат в ней же.

let n = 2; n = n + 5; n = n * 2;

Эту запись можно укоротить при помощи совмещённых операторов += и *= :

let n = 2; n += 5; // теперь n = 7 (работает как n = n + 5) n *= 2; // теперь n = 14 (работает как n = n * 2) alert( n ); // 14

Подобные краткие формы записи существуют для всех арифметических и побитовых операторов: /= , -= , **= и так далее.

Вызов с присваиванием имеет в точности такой же приоритет, как обычное присваивание, то есть выполнится после большинства других операций:

let n = 2; n *= 3 + 5; alert( n ); // 16 (сначала выполнится правая часть, выражение идентично n *= 8)

Инкремент/декремент

Одной из наиболее частых числовых операций является увеличение или уменьшение на единицу.

Для этого существуют даже специальные операторы:

    Инкремент ++ увеличивает переменную на 1:

let counter = 2; counter++; // работает как counter = counter + 1, просто запись короче alert( counter ); // 3
let counter = 2; counter--; // работает как counter = counter - 1, просто запись короче alert( counter ); // 1

Инкремент/декремент можно применить только к переменной. Попытка использовать его на значении, типа 5++, приведёт к ошибке.

Операторы ++ и — могут быть расположены не только после, но и до переменной.

  • Когда оператор идёт после переменной — это «постфиксная форма»: counter++ .
  • «Префиксная форма» — это когда оператор идёт перед переменной: ++counter .

Обе эти инструкции делают одно и то же: увеличивают counter на 1 .

Есть ли разница между ними? Да, но увидеть её мы сможем, только если будем использовать значение, которое возвращают ++/— .

Давайте проясним этот момент. Как мы знаем, все операторы возвращают значение. Операторы инкремента/декремента не исключение. Префиксная форма возвращает новое значение, в то время как постфиксная форма возвращает старое (до увеличения/уменьшения числа).

Чтобы увидеть разницу, вот небольшой пример:

let counter = 1; let a = ++counter; // (*) alert(a); // 2

В строке (*) префиксная форма ++counter увеличивает counter и возвращает новое значение 2 . Так что alert покажет 2 .

Теперь посмотрим на постфиксную форму:

let counter = 1; let a = counter++; // (*) меняем ++counter на counter++ alert(a); // 1

В строке (*) постфиксная форма counter++ также увеличивает counter , но возвращает старое значение (которое было до увеличения). Так что alert покажет 1 .

    Если результат оператора не используется, а нужно только увеличить/уменьшить переменную, тогда без разницы, какую форму использовать:

let counter = 0; counter++; ++counter; alert( counter ); // 2, обе строки сделали одно и то же

Бинарные операторы в Java

В OTUS скоро стартует новая профессиональная программа по подготовке к сертификации Oracle Java Programmer (OCAJP). Приглашаем вас на бесплатный Demo-урок «Типы данных Java: Идентификаторы и примитивы» и публикуем статью Владислава Родина — руководителя группы разработки, преподавателя в МФТИ и foxminded.

Введение

Сертификация OCA (Oracle Certified Associate Java SE8 Programmer) предлагает ряд необычных заданий, проверяющих глубокое понимание принципов работы языка программирования Java. Целый блок посвящен выражениям, циклам и оператором. Про последние мы сегодня и поговорим.

Приоритет операторов

Оператор принимает на вход аргументы и возвращает некоторые значения. Выделяют унарные, бинарные и тернарные операторы. Например, !false — унарный, a + b — бинарный, а? : — является единственным оператором, принимающим на вход три аргумента.

Первое, что необходимо помнить, это приоритет выполнения операторов:

  1. Пост-унарные операторы: exception++ и exception—
  2. Пре-унарные операторы: ++exception и —exception
  3. Остальные унарные операторы: +, -, !
  4. Умножение, деление, взятие остатка: *, /, %
  5. Сложение и вычитание: +, —
  6. Операторы битового сдвига: >, >>>
  7. Операторы сравнения: , =, instanceof
  8. Операторы равенства-неравенства: ==, !=
  9. Логические операторы: &, |, ^
  10. Short-circuit логические операторы: &&, ||
  11. Тернарный оператор: boolean expression? expression1: expres-
    sion2
  12. Операторы присваивания: =, +=, -=, *=, /=, %=, &=, ^=, !=, <>=, >>>=

Работа с бинарными арифметическими операторами

Начнем с бинарных операторов, они наиболее часто встречаются в Java. На экзамене могут предлагать достаточно сложные выражения для вычисления которых необходимо помнить порядок их выполнения.

Арифметические операторы

К арифметическим операторам относятся операторы сложения, вычитания, умножения и взятия остатка. Как я уже сказал, при вычислении необходимо помнить приоритет операторов:

int x = 2 * 5 + 3 * 4 — 8 = 10 + 12 — 8 = 14;

Также надо помнить, что приоритет выполнения может изменяться скобками (вначале вычисляется выражение в скобках):

int x = 2 * ((5 + 3) * 4 – 8) = 2 * (8 * 4 – 8) = 2 * (32 – 8) = 2 * 24 = 48;

Новички могут путать операторы целочисленного деления (/) и взятия модуля (%):

System.out.print(9 / 3); // Outputs 3 System.out.print(9 % 3); // Outputs 0 System.out.print(10 / 3); // Outputs 3 System.out.print(10 % 3); // Outputs 1 System.out.print(11 / 3); // Outputs 3 System.out.print(11 % 3); // Outputs 2 System.out.print(12 / 3); // Outputs 4 System.out.print(12 % 3); // Outputs 0 

Преобразование чисел

Если аргументы бинарного оператора числовые и разные, Java применяет преобразования типов по следующим правилам:

  1. Если два аргумента относятся к разным типам данных, то Java преобразует аргумент менее вместительного типа к аргументу более вместительного типа
  2. Если один аргумент относится к целочисленному типу, а другой к вещественному, то Java преобразует значение целочисленного типа к вещественному типу
  3. Независимо от типов аргументов, Java вначале преобразует менее вместительные целочисленные типы (byte, short, char) к типу int
  4. После приведения аргументов к одному типу, Java вернет результат того же типа, которым обладают аргументы после приведения

Какого типа будет результат выполнения умножения x * y?

int x = 1; long y = 33; 

Согласно первому правилу, x будет преобразован к типу long, а затем будет возвращен результат того же типа.

Какого типа будет результат выполнения сложения x + y?

double x = 39.21; float y = 2.1; 

Здесь в лучших традициях сертификации нас подстерегает ловушка: 2.1 — это double, а 2.1f — это float. Попытка записать значение типа double в переменную типа float без явного преобразования приводит к ошибке компиляции в Java.

Какого типа будет результат выполнения сложения x + y?

double x = 39.21; float y = 2.1f; 

По аналогии с примером 1, float будет преобразован к double, а затем будет возвращен результат типа double.

Какого типа будет результат выполнения деления x / y?

short x = 10; short y = 3; 

Согласно правилу 3 оба аргумента перед выполнением деления будут приведены к int, а потом по правилу 4 будет возвращен int. Ответ вовсе не short!

Какого типа будет результат выполнения операции x * y / z?

short x = 14; float y = 13; double z = 30; 

Согласно всем правилам выше вначале x будет преобразован к int’у. Затем выполняется операция умножения x (int) и y (float): x будет преобразован ко float, и результат будет принадлежать типу float. Потом выполняется float / double, поэтому float будет преобразован к double, и будет возвращен double.

Интересно развиваться в данном направлении? Посмотрите программу курса «Подготовка к сертификации Oracle Java Programmer (OCAJP)»!

  • Блог компании OTUS
  • Oracle
  • Программирование
  • Java
  • Промышленное программирование

Основные операторы

Для работы с переменными, со значениями, JavaScript поддерживает все стандартные операторы, большинство которых есть и в других языках программирования.

Несколько операторов мы знаем со школы – это обычные сложение + , умножение * , вычитание и так далее.

В этой главе мы сконцентрируемся на операторах, которые в курсе математики не проходят, и на их особенностях в JavaScript.

Термины: «унарный», «бинарный», «операнд»

У операторов есть своя терминология, которая используется во всех языках программирования.

Прежде, чем мы двинемся дальше – несколько терминов, чтобы понимать, о чём речь.

  • Операнд – то, к чему применяется оператор. Например: 5 * 2 – оператор умножения с левым и правым операндами. Другое название: «аргумент оператора».
  • Унарным называется оператор, который применяется к одному операнду. Например, оператор унарный минус «-» меняет знак числа на противоположный:

Унарный оператор

Бинарный оператор

Сложение строк, бинарный +

Обычно при помощи плюса ‘+’ складывают числа.

Но если бинарный оператор ‘+’ применить к строкам, то он их объединяет в одну:

Бинарный оператор

Иначе говорят, что «плюс производит конкатенацию (сложение) строк».

Если хотя бы один аргумент является строкой, то второй будет также преобразован к строке!

Причем не важно, справа или слева находится операнд-строка, в любом случае нестроковый аргумент будет преобразован. Например:

Бинарный оператор

Это приведение к строке – особенность исключительно бинарного оператора «+» .

Остальные арифметические операторы работают только с числами и всегда приводят аргументы к числу.

арифметические операторы

Преобразование к числу, унарный плюс +

Унарный, то есть применённый к одному значению, плюс ничего не делает с числами:

унарный плюс +

Как видно, плюс ничего не изменил в выражениях. Результат – такой же, как и без него.

Тем не менее, он широко применяется, так как его «побочный эффект» – преобразование значения в число.

Например, когда мы получаем значения из HTML-полей или от пользователя, то они обычно в форме строк.

А что, если их нужно, к примеру, сложить? Бинарный плюс сложит их как строки:

унарный плюс +

Поэтому используем унарный плюс, чтобы преобразовать к числу:

унарный плюс +

С точки зрения математики такое изобилие плюсов может показаться странным. С точки зрения программирования – никаких разночтений: сначала выполнятся унарные плюсы, приведут строки к числам, а затем – бинарный ‘+’ их сложит.

Почему унарные плюсы выполнились до бинарного сложения? Как мы сейчас увидим, дело в их приоритете.

Приоритет

В том случае, если в выражении есть несколько операторов – порядок их выполнения определяется приоритетом.

Из школы мы знаем, что умножение в выражении 2 * 2 + 1 выполнится раньше сложения, т.к. его приоритет выше, а скобки явно задают порядок выполнения. Но в JavaScript – гораздо больше операторов, поэтому существует целая таблица приоритетов.

Она содержит как уже пройденные операторы, так и те, которые мы еще не проходили. В ней каждому оператору задан числовой приоритет. Тот, у кого число больше – выполнится раньше. Если приоритет одинаковый, то порядок выполнения – слева направо.

Отрывок из таблицы:

Приоритет Название Обозначение
15 унарный плюс +
15 унарный минус
14 умножение *
14 деление /
13 сложение +
13 вычитание
3 присваивание =

Так как «унарный плюс» имеет приоритет 15 , выше, чем 13 у обычного «сложения», то в выражении +apples + +oranges сначала сработали плюсы у apples и oranges , а затем уже обычное сложение.

Присваивание

Обратим внимание, в таблице приоритетов также есть оператор присваивания = .

У него – один из самых низких приоритетов: 3 .

Именно поэтому, когда переменную чему-либо присваивают, например, x = 2 * 2 + 1 сначала выполнится арифметика, а уже затем – произойдёт присваивание = .

присваивание

Возможно присваивание по цепочке:

присваивание по цепочке

Такое присваивание работает справа-налево, то есть сначала вычислятся самое правое выражение 2+2 , присвоится в c , затем выполнится b = c и, наконец, a = b .

Оператор «=» возвращает значение

Все операторы возвращают значение. Вызов x = выражение не является исключением.

Он записывает выражение в x , а затем возвращает его. Благодаря этому присваивание можно использовать как часть более сложного выражения:

присваивание

В примере выше результатом (a = b + 1) является значение, которое записывается в a (т.е. 3 ). Оно используется для вычисления c .

Забавное применение присваивания, не так ли?

Знать, как это работает – стоит обязательно, а вот писать самому – только если вы уверены, что это сделает код более читаемым и понятным.

Взятие остатка %

Оператор взятия остатка % интересен тем, что, несмотря на обозначение, никакого отношения к процентам не имеет.

Его результат a % b – это остаток от деления a на b .

остаток

Инкремент/декремент: ++ , —

Одной из наиболее частых операций в JavaScript, как и во многих других языках программирования, является увеличение или уменьшение переменной на единицу.

Для этого существуют даже специальные операторы:

    Инкремент ++ увеличивает на 1:

инкремент

декремент

Инкремент/декремент можно применить только к переменной. Код 5++ даст ошибку.

Вызывать эти операторы можно не только после, но и перед переменной: i++ (называется «постфиксная форма») или ++i («префиксная форма»).

Обе эти формы записи делают одно и то же: увеличивают на 1 .

Тем не менее, между ними существует разница. Она видна только в том случае, когда мы хотим не только увеличить/уменьшить переменную, но и использовать результат в том же выражении.

декремент инкремент

В строке (*) вызов ++i увеличит переменную, а затем вернёт ее значение в a . Так что в a попадёт значение i после увеличения.

Постфиксная форма i++ отличается от префиксной ++i тем, что возвращает старое значение, бывшее до увеличения.

В примере ниже в a попадёт старое значение i , равное 1 :

присваивание

  • Если результат оператора не используется, а нужно только увеличить/уменьшить переменную – без разницы, какую форму использовать:

форма

присваивание

постфиксная форма

Инкремент/декремент можно использовать в любых выражениях

При этом он имеет более высокий приоритет и выполняется раньше, чем арифметические операции:

арифметические операции

арифметические операции

При этом, нужно с осторожностью использовать такую запись, потому что в более длинной строке при быстром «вертикальном» чтении кода легко пропустить такой i++ , и будет неочевидно, что переменая увеличивается.

Три строки, по одному действию в каждой – длиннее, зато нагляднее:

арифметические операции

Побитовые операторы

Побитовые операторы рассматривают аргументы как 32-разрядные целые числа и работают на уровне их внутреннего двоичного представления.

Эти операторы не являются чем-то специфичным для JavaScript, они поддерживаются в большинстве языков программирования.

Поддерживаются следующие побитовые операторы:

  • AND(и) ( & )
  • OR(или) ( | )
  • XOR(побитовое исключающее или) ( ^ )
  • NOT(не) ( ~ )
  • LEFT SHIFT(левый сдвиг) (
  • RIGHT SHIFT(правый сдвиг) ( >> )
  • ZERO-FILL RIGHT SHIFT(правый сдвиг с заполнением нулями) ( >>> )

Сокращённая арифметика с присваиванием

Часто нужно применить оператор к переменной и сохранить результат в ней же, например:

сокращённая-арифметика-с-присваиванием

Эту запись можно укоротить при помощи совмещённых операторов, вот так:

совмещённые операторы

Так можно сделать для операторов +,-,*,/,% и бинарных >,>>>,&,|,^ .

Вызов с присваиванием имеет в точности такой же приоритет, как обычное присваивание, то есть выполнится после большинства других операций:

совмещённые операторы

Оператор запятая

Один из самых необычных операторов – запятая ‘,’ .

Его можно вызвать явным образом, например:

вызов оператора

Запятая позволяет перечислять выражения, разделяя их запятой ‘,’ . Каждое из них – вычисляется и отбрасывается, за исключением последнего, которое возвращается.

Запятая – единственный оператор, приоритет которого ниже присваивания. В выражении a = (5,6) для явного задания приоритета использованы скобки, иначе оператор ‘=’ выполнился бы до запятой ‘,’ , получилось бы (a=5), 6 .

Зачем же нужен такой странный оператор, который отбрасывает значения всех перечисленных выражений, кроме последнего?

Обычно он используется в составе более сложных конструкций, чтобы сделать несколько действий в одной строке. Например:

совмещённые операторы

Такие трюки используются во многих JavaScript-фреймворках для укорачивания кода.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *