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

Базовые бинарные арифметические операторы

Используются для вычислений между двумя числами, всего 7 видов, включая стандартные четыре действия, целочисленное деление, остаток от деления, унарный минус

ОператорОписание действия
+Сложение
-Вычитание
-выражениеУнарный минус (инверсия знака числа)
*Умножение
/Обычное деление, результат всегда имеет тип double (дробное число)
~/Целочисленное деление, отбрасывает дробную часть, возвращает int
%Остаток от деления (остаток целочисленного деления)

Особенность деления по сравнению с другими языками: оператор / всегда возвращает дробное число. Если нужно целое число — используйте ~/, это важный момент для разработчиков с опытом программирования.

Пример кода:

void main() {
        // Проверка сложения, вычитания, умножения, деления, целочисленного деления и остатка
	print(2 + 3 == 5);
	print(2 - 3 == -1);
	print(2 * 3 == 6);
	print(5 / 2 == 2.5);  // Обычное деление даёт double
	print(5 ~/ 2 == 2);   // Целочисленное деление возвращает только целую часть int
	print(5 % 2 == 1);    // % возвращает остаток от целочисленного деления

	// Пример конкатенации строк с результатом деления и остатка
	print('5/2 = ${5 ~/ 2} r ${5 % 2}' == '5/2 = 2 r 1');
}Code language: Dart (dart)

Результат выполнения кода

Операторы инкремента / декремента

Dart поддерживает префиксные и постфиксные варианты инкремента ++ и декремента --. Основное различие: сначала изменить переменную или сначала взять её значение

ОператорЛогика выполненияЗначение, возвращаемое выражением
++varСначала увеличить переменную на 1, затем использовать новое значение в вычисленияхНовое значение после инкремента
var++Сначала взять исходное значение переменной для вычислений, затем увеличить переменную на 1Исходное значение до инкремента
--varСначала уменьшить переменную на 1, затем использовать новое значение в вычисленияхНовое значение после декремента
var--Сначала взять исходное значение переменной для вычислений, затем уменьшить переменную на 1Исходное значение до декремента
void main() {
	int a;
	int b;

	// 1. Префиксный инкремент ++a: сначала увеличить, затем присвоить
	a = 0;
	b = ++a;
	print(a == b); // a=1, b=1, условие истинно

	// 2. Постфиксный инкремент a++: сначала присвоить старое значение, затем увеличить
	a = 0;
	b = a++;
	print(a != b); // a=1, b=0, условие истинно

	// 3. Префиксный декремент --a: сначала уменьшить, затем присвоить
	a = 0;
	b = --a;
	print(a == b); // a=-1, b=-1, условие истинно

	// 4. Постфиксный декремент a--: сначала присвоить старое значение, затем уменьшить
	a = 0;
	b = a--;
	print(a != b); // a=-1, b=0, условие истинно
}
Code language: PHP (php)

Все выводы в примере будут true (истина)

Важно: префиксная и постфиксная запись ++ / — ведут себя по-разному внутри выражений.

Если оператор используется отдельно:

int a = 1;
++a;

int b  = 1;
b++;

print(a);
print(b);Code language: PHP (php)

В данном случае обе переменные будут равны 2 на выходе

D:\dartdemo\firstdart>dart run
Building package executable...
Built firstdart:firstdart.
2
2
Code language: CSS (css)

То же самое касается —: переменная в любом случае изменится на +1 или -1.

Но если ++ / — входят в состав сложного выражения:

void main() {
  int a = 5;
  // Постфикс: сначала использовать 5 для умножения, потом a станет 6
  int res1 = a++ * 2;
  print(res1); // 10
  print(a);  // 6

  int b= 5;
  // Префикс: сначала b станет 6, потом умножить на 2
  int res2 = ++b * 2;
  print(res2); // 12
  print(b); // 6
}Code language: PHP (php)

Итоговые значения a и b одинаковые (6), но результаты res1 и res2 разные, несмотря на небольшую разницу в записи оператора.

Объяснение постфикса a++: сначала выполняется a*2 =10 (a всё ещё равен 5), результат записывается в res1, затем a увеличивается на единицу до 6.

При префиксной записи ++b сначала b увеличивается до 6, потом выполняется умножение 6*2=12, которое попадает в res2.

Запись int res1 = a++ * 2; эквивалентна последовательности:

int res1 = a * 2;
a = a +1;

Запись int res2 = ++b * 2; эквивалентна последовательности:

b = b+1;
int res2 = b * 2;

Простое мнемоника:

Префикс — сначала изменить, постфикс — сначала использовать;

Префикс возвращает новое значение, постфикс — исходное.

Итог

Префикс ++a / --a: сначала изменить переменную, затем использовать новое значение для вычислений или присваивания

Постфикс a++ / a--: сначала взять исходное значение переменной для вычислений или присваивания, после завершения операции изменить переменную

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

void main() {
  int a = 0;
  int b = ++a; 
  // Шаг1: a = a + 1 → a = 1
  // Шаг2: присвоить новое значение a (1) в b
  print(a); // 1
  print(b); // 1
}
void main() {
  int a = 0;
  int b = a++;
  // Шаг1: присвоить старое значение a (0) в b
  // Шаг2: выполнить a = a + 1 → a = 1
  print(a); // 1
  print(b); // 0
}
void main() {
  int a = 0;
  int b = --a;
  // Шаг1: a = a - 1 → a = -1
  // Шаг2: присвоить новое значение a (-1) в b
  print(a); // -1
  print(b); // -1
}
void main() {
  int a = 0;
  int b = a--;
  // Шаг1: присвоить старое значение a (0) в b
  // Шаг2: выполнить a = a - 1 → a = -1
  print(a); // -1
  print(b); // 0
}

Это простейшие примеры префиксных и постфиксных инкремента/декремента. Скомпилируйте и запустите код самостоятельно, чтобы увидеть разницу в работе.

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

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