Какой оператор из этих выполняет не только математические операции
Перейти к содержимому

Какой оператор из этих выполняет не только математические операции

  • автор:

Какие из этих операторов выполняет не только арифметические операции?

Cо 2 и 3 вариантом понятно. Оператор «-» выполняет приведение типов string в number, что не является арифметической операцией. Оператор «+» выполняет арифметическую операцию сложения и выполняет конкатенацию строк. А остальные?

Отслеживать

задан 1 дек 2019 в 20:27

195 1 1 золотой знак 3 3 серебряных знака 19 19 бронзовых знаков

и где интересно сказано, что — выполняет такое приведение? прям вот такими словами, и почему тогда + не делает того же?

Арифметические операторы в универсальных типах

.NET 7 представляет новые универсальные интерфейсы, связанные с математикой, в библиотеке базовых классов. Доступность этих интерфейсов означает, что параметр типа универсального типа или метода может быть «числовым». Кроме того, C# 11 и более поздних версий позволяет определять static virtual элементы интерфейса. Так как операторы должны быть объявлены как static , эта новая функция C# позволяет объявлять операторы в новых интерфейсах для типов, таких как число.

Вместе эти инновации позволяют выполнять математические операции универсально, т. е. не зная точного типа, с которым вы работаете. Например, если вы хотите написать метод, добавляющий два числа, ранее пришлось добавить перегрузку метода для каждого типа (например, static int Add(int first, int second) и static float Add(float first, float second) ). Теперь можно написать один универсальный метод, где параметр типа ограничен числом типа. Например:

static T Add(T left, T right) where T : INumber

В этом методе параметр T типа ограничен типом, реализующим новый INumber интерфейс. INumber IAdditionOperators реализует интерфейс, содержащий оператор +. Это позволяет методу универсально добавлять два числа. Этот метод можно использовать с любым из. Встроенные числовые типы NET, так как они были обновлены для реализации INumber в .NET 7.

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

Интерфейсы

Интерфейсы были разработаны достаточно точно, чтобы пользователи могли определять собственные интерфейсы поверх, а также быть достаточно детализированными, чтобы они легко потребляли. В этой степени существует несколько основных числовых интерфейсов, с которыми большинство пользователей будут взаимодействовать, например INumber и IBinaryInteger . Более подробные интерфейсы, такие как IAdditionOperators и ITrigonometricFunctions , поддерживают эти типы и доступны разработчикам, которые определяют собственные числовые интерфейсы, относящиеся к домену.

  • Числовые интерфейсы
  • Интерфейсы операторов
  • Интерфейсы функций
  • Анализ и форматирование интерфейсов

Числовые интерфейсы

В этом разделе описываются интерфейсы, описывающие System.Numerics типы числа и доступные для них функциональные возможности.

Имя интерфейса Description
IBinaryFloatingPointIeee754 Предоставляет ИНТЕРФЕЙСы API, общие для типов с плавающей запятой 1 , реализующих стандарт IEEE 754.
IBinaryInteger Предоставляет ИНТЕРФЕЙСы API, общие для двоичных целых чисел 2 .
IBinaryNumber Предоставляет API-интерфейсы, общие для двоичных чисел.
IFloatingPoint Предоставляет ИНТЕРФЕЙСы API, общие для типов с плавающей запятой.
IFloatingPointIeee754 Предоставляет ИНТЕРФЕЙСы API, общие для типов с плавающей запятой, реализующих стандарт IEEE 754.
INumber Предоставляет ИНТЕРФЕЙСы API, общие для сопоставимых типов чисел (фактически «реальный» домен чисел).
INumberBase Предоставляет ИНТЕРФЕЙСы API, общие для всех типов чисел (фактически «сложный» домен номеров).
ISignedNumber Предоставляет ИНТЕРФЕЙСы API, общие для всех подписанных типов чисел (например, концепции NegativeOne ).
IUnsignedNumber Предоставляет ИНТЕРФЕЙСы API, общие для всех типов незначенных чисел.
IAdditiveIdentity Предоставляет концепцию (x + T.AdditiveIdentity) == x .
IMinMaxValue Предоставляет концепцию T.MinValue и T.MaxValue .
IMultiplicativeIdentity Предоставляет концепцию (x * T.MultiplicativeIdentity) == x .

1 Двоичные типы с плавающей запятой ( double Double), Halfи Single ( float ).

Некоторые интерфейсы также реализуются различными другими типами, включая Char, , DateOnly, DateTime, DateTimeOffset, GuidDecimalTimeOnlyи .TimeSpan

В следующей таблице показаны некоторые основные API, предоставляемые каждым интерфейсом.

Интерфейс Имя API Description
IBinaryInteger DivRem Вычисляет цитент и оставшуюся часть одновременно.
LeadingZeroCount Подсчитывает число начальных нулевых битов в двоичном представлении.
PopCount Подсчитывает количество битов набора в двоичном представлении.
RotateLeft Поворот битов влево, иногда также называется циклическим сдвигом влево.
RotateRight Поворот битов вправо, иногда также называется циклическим сдвигом вправо.
TrailingZeroCount Подсчитывает число конечных нулей в двоичном представлении.
IFloatingPoint Ceiling Округляет значение в сторону положительной бесконечности. +4,5 становится +5, а -4,5 становится -4.
Floor Округляет значение в сторону отрицательной бесконечности. +4,5 становится +4, а -4,5 становится -5.
Round Округляет значение с помощью указанного режима округления.
Truncate Округляет значение к нулю. +4,5 становится +4, а -4,5 становится -4.
IFloatingPointIeee754 E Возвращает значение, представляющее число Эйлера для типа.
Epsilon Возвращает наименьшее представляющее значение, которое больше нуля для типа.
NaN Возвращает значение, представляющее NaN тип.
NegativeInfinity Возвращает значение, представляющее -Infinity тип.
NegativeZero Возвращает значение, представляющее -Zero тип.
Pi Возвращает значение, представляющее Pi тип.
PositiveInfinity Возвращает значение, представляющее +Infinity тип.
Tau Возвращает значение, представляющее Tau ( 2 * Pi ) для типа.
(Другое) (Реализует полный набор интерфейсов, перечисленных в разделе Интерфейсы функций.)
INumber Clamp Ограничивает значение не более и не меньше указанного минимального и максимального значения.
CopySign Задает знак указанного значения таким же, как и другое указанное значение.
Max Возвращает больше двух значений, возвращая NaN при наличии входных данных NaN .
MaxNumber Возвращает больше двух значений, возвращая число, если один входной NaN .
Min Возвращает меньшее из двух значений, возвращая NaN при наличии входных данных NaN .
MinNumber Возвращает меньшее из двух значений, возвращая число, если одно входное значение NaN .
Sign Возвращает значение -1 для отрицательных значений, от 0 до нуля и +1 для положительных значений.
INumberBase One Возвращает значение 1 для типа.
Radix Возвращает радикс или базу для типа. Int32 возвращает 2. Decimal возвращает 10.
Zero Возвращает значение 0 для типа.
CreateChecked Создает значение, вызывая OverflowException исключение, если входные данные не могут соответствовать. 1
CreateSaturating Создает значение, зажимая или T.MinValue T.MaxValue если входные данные не могут соответствовать. 1
CreateTruncating Создает значение из другого значения, обтекая вокруг, если входные данные не могут соответствовать. 1
IsComplexNumber Возвращает значение true, если значение имеет ненульную реальную часть и ненульную мнимую часть.
IsEvenInteger Возвращает значение true, если значение является даже целым числом. 2.0 возвращает true и возвращает false 2.2.
IsFinite Возвращает значение true, если значение не бесконечно, а не NaN .
IsImaginaryNumber Возвращает значение true, если значение имеет нулю реальную часть. Это означает 0 , что это мнимый и 1 + 1i не является.
IsInfinity Возвращает значение true, если значение представляет бесконечность.
IsInteger Возвращает значение true, если значение является целым числом. Возврат 2.0 и 3.0 true , а также возврат 2.2 и 3.1 false .
IsNaN Возвращает значение true, если значение представляет NaN .
IsNegative Возвращает значение true, если значение отрицательное. Это включает в себя -0.0.
IsPositive Возвращает значение true, если значение является положительным. Это включает 0 и +0,0.
IsRealNumber Возвращает значение true, если значение имеет нулевая мнимая часть. Это означает, что 0 является реальным, как и все INumber типы.
IsZero Возвращает значение true, если значение представляет ноль. Это включает 0, +0.0 и -0.0.
MaxMagnitude Возвращает значение с большим абсолютным значением, возвращая NaN , если входные данные имеют значение NaN .
MaxMagnitudeNumber Возвращает значение с большим абсолютным значением, возвращая число, если один входной. NaN
MinMagnitude Возвращает значение с меньшим абсолютным значением, возвращая NaN , если входные данные имеют значение NaN .
MinMagnitudeNumber Возвращает значение с меньшим абсолютным значением, возвращая число, если одно входное значение NaN .
ISignedNumber NegativeOne Возвращает значение -1 для типа.

1 . Чтобы понять поведение трех Create* методов, рассмотрим следующие примеры.

Пример, если задано слишком большое значение:

  • byte.CreateChecked(384) вызовет OverflowExceptionисключение .
  • byte.CreateSaturating(384) возвращает значение 255, так как 384 больше Byte.MaxValue (что составляет 255).
  • byte.CreateTruncating(384) возвращает 128, так как он принимает наименьшее 8 бит (384 имеет шестнадцатеричное представление 0x0180 , а наименьшее 8 битов — 0x80 128).

Пример, если задано слишком небольшое значение:

  • byte.CreateChecked(-384) вызовет OverflowExceptionисключение .
  • byte.CreateSaturating(-384) возвращает значение 0, так как -384 меньше Byte.MinValue (что равно 0).
  • byte.CreateTruncating(-384) возвращает 128, так как он принимает наименьшее 8 бит (384 имеет шестнадцатеричное представление 0xFE80 , а наименьшее 8 битов — 0x80 128).

Методы Create* также имеют некоторые особые аспекты для типов с плавающей запятой IEEE 754, например float и , так как они имеют специальные значения PositiveInfinity , NegativeInfinity и double NaN . Все три Create* API ведут себя как CreateSaturating . Кроме того, в то время как MinValue и MaxValue представляет наибольшее отрицательное или положительное «нормальное» число, фактические и максимальные значения, NegativeInfinity PositiveInfinity поэтому они зажимаются с этими значениями.

Интерфейсы операторов

Интерфейсы операторов соответствуют различным операторам, доступным для языка C#.

  • Они явно не объединяют такие операции, как умножение и деление, так как это не правильно для всех типов. Например, допустимо, Matrix4x4 * Matrix4x4 но Matrix4x4 / Matrix4x4 не является допустимым.
  • Обычно они позволяют типам входных и результирующих данных отличаться для сценариев поддержки, таких как деление двух целых чисел для получения double , например, 3 / 2 = 1.5 или вычисления среднего значения набора целых чисел.
Имя интерфейса Определенные операторы
IAdditionOperators x + y
IBitwiseOperators x & y , ‘x | y’, x ^ y и ~x
IComparisonOperators x < y , x >y , x = y
IDecrementOperators —x и x—
IDivisionOperators x / y
IEqualityOperators x == y и x != y
IIncrementOperators ++x и x++
IModulusOperators x % y
IMultiplyOperators x * y
IShiftOperators x > y
ISubtractionOperators x — y
IUnaryNegationOperators -x
IUnaryPlusOperators +x

Некоторые интерфейсы определяют оператор проверка в дополнение к обычному оператору un проверка ed. Проверенные операторы вызываются в проверка контекстах и позволяют определяемого пользователем типа определять поведение переполнения. Если вы реализуете оператор проверка, например, CheckedSubtraction(TSelf, TOther)необходимо также реализовать оператор un проверка ed, напримерSubtraction(TSelf, TOther).

Интерфейсы функций

Интерфейсы функций определяют общие математические API, которые применяются более широко, чем к определенному числового интерфейса. Эти интерфейсы реализуются всеми и могут быть реализованы IFloatingPointIeee754 другими соответствующими типами в будущем.

Имя интерфейса Description
IExponentialFunctions Предоставляет экспоненциальные функции, поддерживающие e^x , e^x — 1 , , 2^x и 2^x — 1 10^x . 10^x — 1
IHyperbolicFunctions Предоставляет гиперболические функции, поддерживающие acosh(x) , , , atanh(x) и cosh(x) sinh(x) . tanh(x) asinh(x)
ILogarithmicFunctions Предоставляет логарифмические функции, поддерживающие ln(x) , ln(x + 1) , , log2(x) и log2(x + 1) log10(x) . log10(x + 1)
IPowerFunctions Предоставляет вспомогательные x^y функции питания.
IRootFunctions Предоставляет вспомогательные cbrt(x) sqrt(x) и вспомогательные функции корневых функций.
ITrigonometricFunctions Предоставляет функции тригонометрики, поддерживающие acos(x) , asin(x) , , atan(x) , cos(x) sin(x) и tan(x) .

Анализ и форматирование интерфейсов

Анализ и форматирование являются основными понятиями программирования. Они часто используются при преобразовании входных данных пользователя в заданный тип или отображении типа для пользователя. Эти интерфейсы находятся в System пространстве имен.

Имя интерфейса Description
IParsable Предоставляет поддержку T.Parse(string, IFormatProvider) и T.TryParse(string, IFormatProvider, out TSelf) .
ISpanParsable Предоставляет поддержку T.Parse(ReadOnlySpan, IFormatProvider) и T.TryParse(ReadOnlySpan, IFormatProvider, out TSelf) .
IFormattable 1 Предоставляет поддержку value.ToString(string, IFormatProvider) .
ISpanFormattable 1 Предоставляет поддержку value.TryFormat(Span, out int, ReadOnlySpan, IFormatProvider) .

1 Этот интерфейс не является новым, и не является универсальным. Однако он реализуется всеми типами чисел и представляет обратную операцию IParsable .

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

using System.Globalization; using System.Numerics; static TResult Average(T first, T second) where T : INumber where TResult : INumber  < return TResult.CreateChecked( (first + second) / T.CreateChecked(2) ); >static T ParseInvariant(string s) where T : IParsable  < return T.Parse(s, CultureInfo.InvariantCulture); >Console.Write("First number: "); var left = ParseInvariant(Console.ReadLine()); Console.Write("Second number: "); var right = ParseInvariant(Console.ReadLine()); Console.WriteLine($"Result: (left, right)>"); /* This code displays output similar to: First number: 5.0 Second number: 6 Result: 5.5 */ 

См. также

Совместная работа с нами на GitHub

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

Проверьте правильность

Антон П.

Здравствуйте все. Я участвую в школьной олимпиаде, JavaScript стал изучать недавно. Я ответил на все вопросы конкурса, но только сомневаюсь в правильности некоторых своих ответов, в связи с чем вопрос: кто из Вас точно знает ответ, подскажите, пожалуйста. Ниже я привожу сам тест, то, что я подчеркнул, я посчитал правильным ответом на вышепоставленный вопрос.
«Язык JavaScript»

Раздел 2 «Язык JavaScript»
1. Можно ли через javascript подключить
внешний js-файл, отсутствующий на
странице?

а) да, но только один раз;
б) да, но только до загрузки страницы;
в) да, сколько угодно файлов когда угодно.

2. В каком случае из перечисленных
событие не попадет на обработку javascript

а) если в момент его наступления обрабатывается другое событие;
б) если страничка просматривается локально, т.е. offline;
в) только если javascript отключен.

3. Какой оператор из этих выполняет не
только математические операции?

а) *
б) /
в) +
г) —
д) >>>

4. Какие варианты правильно объявляют
переменную f для функции,
возвращающей сумму двух аргументов?

а) var f = function(a,b)
б) var f = new Function(‘a,b’, ‘return a+b&#039
в) var f = new Function(‘a’, ‘b’, ‘return a+b&#039
г) никакие

5. Какие конструкции для циклов есть в
javascript?

а) только две: for и while;
б) только одна: for;
в) три: for, while и do. while.

6. Какие из этих вариантов задают массив
из элементов «a», «b»?

а) var a = new Array(«a»,»b&quot
б) var a = < "a", "b" >
в) var a = ( «a», «b» )
г) var a =
д) var a = «a,b».split(‘,&#039

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

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

В этой главе мы начнём с простых операторов, а потом сконцентрируемся на специфических для 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, обе строки сделали одно и то же

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

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