Войти
Юридический сайт - Spravka01
  • Власти раскрыли расходы на первое за шесть лет повышение выплат военным
  • Десктопные CRM: дегустация бесплатного сыра Общие и личные отчеты
  • Бизнес-стратегия, примеры планирования, определение вариантов, как разработать стратегию бизнеса, как она вияет на лидерство и на конкурентов, как проводить ее аудит, как воплощать планы Стратегия развития компании пример
  • Как принять правильное решение?
  • Консультация как одна из форм работы с педагогами Как правильно вести консультации психолога
  • Как сдать экзамен в техникуме и колледже: рекомендации экспертов Как сдать физику если тупой
  • Приоритет выполнения математических операций. Приоритет выполнения операций. Перегрузка операций и методов

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

    Под арифметическим выражением (или просто выражением) понимается совокупность объектов языка, соединенных знаками операций. Как частный случай это может быть просто одиночный объект.

    Операцией будем называть действие, которое требуется совершить. Объекты, над которыми производится действие, именуют операндами.

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

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

    char < int < long < float < double

    По числу операндов, участвующих в конкретной операции, различают три группы операций:

    Унарные (один операнд);

    Бинарные (два операнда);

    Тернарная (три операнда).

    По типу выполняемой операций различают арифметические, логические, поразрядные, операции отношения, присваивания и ряд других.

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

    Язык Си поддерживает стандартный набор бинарных арифмети-

    ческих операций:

    Сложение (+);

    Вычитание (-);

    Умножение (*);

    Деление (/);

    Взятие остатка от деления целых операндов (%).

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

    double pow(double x, double y);

    вычисляющую значение x в степени y.

    Следует помнить, что результатом деления целых чисел является также целое число, у которого нет дробной части: 7/4 дает в результате единицу! Если же нужно получить остаток от целочисленного деления, то используется операция взятия по модулю, обозначаемая символом % :

    7%4 дает в результате 3,

    21%2 дает в результате 1,

    10%5 дает в результате 0.

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

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

    Операция присваивания

    В языке Си присваивание обозначается одним знаком равенства (=). Численное значение правой части присваивается переменной,указанной слева, причем перед этим всегда автоматически выполняется преобразование заносимого числа к типу этой переменной:

    В результате будет получено значение a = 19.0 .

    Строго говоря, слева может стоять даже выражение (!), прав-

    да, имеющее смысл адреса. Так, вполне корректно писать:

    Си допускает многократное присваивание, например:

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

    значение z будет присвоено переменной w и затем переменной sum.

    В результате все три переменные получат одно и то же значение.

    Си допускает также многосимвольные знаки присваивания. К

    ним следует отнести += , -= , *= , %= и ряд аналогичных знаков,

    а также знаки префиксных и постфиксных операций инкремента ++ и

    декремента --.

    ┌─────────────────────────────────────────────┐

    │ Внутри многосимвольных знаков операций не │

    │ должно быть пробелов!! │

    └─────────────────────────────────────────────┘

    Приведем примеры сокращенной записи присваивания с помощью

    знаков многосимвольных операций:

    i += 1; означает i = i+1;

    i -= k; означает i = i-k;

    i *= k; означает i = i*k;

    i /= k; означает i = i/k;

    Префиксные и постфиксные операции ++ и -- означают соответ-

    ственно инкремент и декремент переменной (не обязательно целой):

    K - увеличивает значение переменной k на единицу

    п е р е д его использованием в выражении;

    k++ - то же п о с л е использования;

    K - уменьшает значение переменной k на единицу

    п е р е д использованием;

    k-- - то же п о с л е использования.

    Подчеркнем, что язык Си не усматривает существенного различия между арифметическим выражением и оператором. Любое выражение языка, заканчивающееся точкой с запятой, является правильным оператором Си, например:

    Разумеется, результат деления не присвоен никакой переменной и, значит, будет потерян, однако следующая запись вполне разумна:

    что в данном случае равносильно записи

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

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

    Если подразумевалось справа вычисление выражения вида a+(++b), то компилятор на самом деле воспримет выражение как (a++)+b. Для уяснения этой ситуации напомним существующее в языках программирования понятие лексемы.

    Лексема - это единица текста программы, воспринимаемая компилятором как единая опознаваемая конструкция, которая не может быть разделена на более мелкие опознаваемые компилятором части. В языке Си лексемами являются:

    Служебные слова;

    Идентификаторы;

    Знаки операций и пунктуации;

    Константы.

    Границы лексем определяются компилятором либо по наличию другой лексемы (знаки пунктуации и операций), либо по наличию пробела. Если лексемы не отделены пробельными символами, то компилятор, выделяя отдельную лексему, объединяет в нее м а к с и м а л ь н о возможное число последовательно идущих символов.

    Вывод: чтобы избежать возможной неоднозначности рекомендуется

    использовать пробелы или круглые скобки для явного раз-

    деления лексем в сомнительных местах.

    Лекция 4 Кафедра Прикладной математики М-703, тел. 362-79-62 К.т.н., профессор Глаголев Виктор Борисович, комн. Ж-405б, тел. 362-73-28 http://glagvik.narod2.ru/index.htm Арифметические операции Приоритет арифметических операций Математические функции Массивы Логические операции Приоритет операций


    Операции и функции VB располагает большим набором встроенных функций. Их можно разделить на несколько категорий: Финансово-математические функции Математические функции Функции обработки строк Функции преобразования типов Прочие функции


    Ознакомиться с подробным описанием функций можно в справочной системе VB. Далее мы рассмотрим лишь математические функции VB. В расположенной на следующем слайде таблице дан полный перечень операций, которые могут быть применены к числовым данным.


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

    Операции отношения


    Приоритет операций Если в выражении использовано несколько операций, то в первую очередь выполняются операции, имеющие наивысший приоритет. Если приоритет операций одинаковый, то они выполняются слева направо. a + b/c + d (a + b)/(c + d) Примеры Выражение Код


    Математические функции

    Углы выражаются в радианах. В проекте необходимо выполнить импорт пространства имен System.Math, добавив в начало исходного кода (до объявления первого модуля или класса) строку Imports System.Math. Иначе перед именем каждой функции будет необходимо добавлять название класса, например: Math.Sin(x)


    Импорт в проект пространства имен System.Math


    Функции Int и Fix возвращают значение, равное целой части числа, тип которого совпадает с типом аргумента. Синтаксис: Int(число) и Fix(число) Обязательный аргумент число – это любое допустимое числовое выражение.


    Различие между функциями Int и Fix состоит в том, что для отрицательного значения аргумента функция Int возвращает ближайшее отрицательное целое число, меньшее либо равное указанному, а Fix ближайшее отрицательное целое число, большее либо равное указанному. Например, функция Int преобразует -8.4 в -9, а функция Fix преобразует -8,4 в -8.


    Функция Rnd возвращает значение типа Single, содержащее случайное число, меньшее 1 и большее или равное 0. Перед первым вызовом функции Rnd надо использовать инструкцию Randomize () без аргумента для инициализации генератора случайных чисел.


    Пример. Игра «Угадай число» Условие игры Компьютер загадывает некоторое случайное целое число k из диапазона 0 – 100. Следует угадать загаданное число, сделав как можно меньше попыток. После каждой попытки компьютер сообщает, загаданное число больше или меньше предложенного числа.


    Таблица данных


    Блок-схема алгоритма Генерация случайного числа k от 0 до 100 Ввод k1 a



    Интерфейс


    Значения свойств


    Программный код

    Массивы Массив - это группа переменных, содержащих элементы данных одного типа и с одним именем. Под каждый элемент массива отводится отдельная ячейка памяти. Все элементы массива имеют один и тот же тип. Возможны ссылки на отдельные элементы массива. Каждый отдельный элемент массива определяется именем массива и значениями индексов.


    Например, ссылки a(7) или a1(2, 9) означают, что: а – это имя одномерного массива (вектора) с одним индексом, элемент массива имеет значение индекса равное 7. а1- это имя двумерного массива (матрицы). Об этом говорит применение двух индексов для определения элемента массива.


    Первый индекс двумерного массива трактуется как номер строки, в которой находится элемент массива, а второй индекс, как номер столбца. Индексом может быть выражение целого типа с неотрицательным значением. Нижняя граница индекса всегда равна 0. Верхняя граница каждого индекса массива задается при его объявлении.


    Имя массива Индекс (номер позиции) элемента массива km Пример массива c именем km типа Integer показаний счетчика километров на спидометре автомобиля в начале каждого месяца в течении года:


    Как и простые переменные, массивы объявляются с помощью инструкций Dim, Static, Private или Public. Примеры объявления массивов: Dim x() As Single Dim y(,) As Single


    Объявлен одномерный массив с именем x и двумерный массив y. Об этом говорят скобки в объявлении после имени каждого массива. При объявлении двумерного массива между скобок должна стоять запятая. Объявление верхних границ индексов в этих примерах отложено на потом (такие массивы называют динамическими). Одномерный массив называют вектором. Двумерный массив называют матрицей.


    Для объявления верхней границы индекса и размещения в памяти массивов следует поместить инструкцию: Redim x(10), y(4,5) Здесь заданы значения верхних границ каждого индекса массивов.


    Индекс массива x может принимать значение в диапазоне от 0 до 10. Массив x имеет 11 элементов. Первый индекс массива y может принимать значение в диапазоне от 0 до 4. Второй индекс массива y может принимать значение в диапазоне от 0 до 5. Массив y имеет 30 элементов (произведение числа строк на число столбцов).


    При объявлении массива можно выполнить его инициализацию: Dim z() As Single = {1.3, -2.7, _ 14.6, -5} В этом примере объявлен одномерный массив z, имеющий 4 элемента, значения которых заданы списком инициализации. Массив, при объявлении которого верхние границы индексов не были указаны (динамический массив), можно неоднократно переобъявлять с помощью инструкции ReDim.


    Среди инструкций внутри процедуры можно записать: ReDim y(5, 10) Далее этот массив может быть переобъявлен: ReDim y(5, 20)


    С помощью инструкции ReDim можно изменять только верхние границы индексов. Размерность массива (количество индексов) можно задать один раз. Изменять ее нельзя. Инструкцию ReDim можно применять для изменения динамического массива столько раз, сколько потребуется. Однако при каждом ее применении данные, содержащиеся в массиве, теряются.


    Инструкция ReDim Preserve может увеличить размер массива, сохраняя при этом его содержимое. В следующем примере показывается, как можно увеличить размер массива a4 на 10 элементов без уничтожения текущих значений элементов массива. Пусть был объявлен массив: Dim a4 () As Integer Затем в программе установлен размер этого массива: ReDim a4 (n)



    Если при объявлении массива задаются верхние границы индексов, то такой массив называется фиксированным. Пример Dim s(10) As Single Dim b(4, 5) As Integer К фиксированным массивам инструкция ReDim неприменима.


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


    Если же в левой части оператора присвоения стоит динамический массив, то совпадение числа элементов не обязательно. Число элементов массива в левой части оператора присвоения при необходимости изменится.


    Пример. Dim a() As Integer = {1, 2, 3, 4}, _ b(), i As Integer b = a For i = 0 To 3 MsgBox(b(i)) Next Последовательно на экране в окне функции MsgBox будет выведено: 1, 2, 3, 4.


    Пример 1 Вычислить среднее арифметическое k заданных чисел.


    Применяемые данные Исходные данные: k – переменная целого типа, число заданных величин; a() – массив типа Single, значения заданных величин. Результаты: s – переменная типа Single, значение среднего арифметического.


    Промежуточные: Сумма – переменная типа Single, значение суммы первых k элементов массива a; i – переменная целого типа, значение индекса элемента массива a.


    Блок-схема алгоритма (1) (2) 1


    (3) (4) (5) (6) (7) (8) 1 2 Нет



    Посмотрим на эту блок-схему с точки зрения базовых структур, которые в нее входят. Блоки 1 – 2 составляют последовательную структуру (следование), которую мы назовем Структура 1. Блоки 3 – 8 относятся к циклу. Эту структуру мы назовем Структура 2. Блоки 9 и 10 – это опять последовательная структура, которую мы назовем Структура 3.


    Структура 1, Структура 2 и Структура 3, рассматриваемые в совокупности также являются структурой следования. В блок-схеме любого структурированного алгоритма всегда можно ясно увидеть базовые структуры, из которых строится алгоритм.


    Интерфейс проекта Текстовое поле предназначено для вывода результатов вычислений. Нажатие на кнопку приведет к запуску вычислений.


    Интерфейс проекта


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


    Выполнение проекта должно начаться с щелчка на кнопке BtnПуск. Следовательно в код проекта должна входить подпрограмма BtnПуск_Click, выполнение которой запускается событием Click, происшедшим с кнопкой BtnПуск (щелчком на этой кнопке).


    Следующим шагом по созданию кода проекта должно быть включение в код проекта заготовки подпрограммы BtnПуск_Click, которая создается системой, если сделать, например, двойной щелчок на кнопке BtnПуск.


    Ниже показан код, который получится после создания заготовки подпрограммы BtnПуск_Click.

    После запуска проекта на выполнение программный код начнет выполняться только после нажатия на кнопки BtnПуск. В этом случае для этой кнопки происходит событие Click, что и приводит к выполнению событийной процедуры BtnПуск_Click. Результаты решения

    В строках с 1 по 5 тела этой процедуры объявляются данные. В строке 6 выполняется очистка текстового поля. Для этого применяется метод Clear. Если этого не сделать, то при многократных запусках проекта информация, выводимая в текстовом поле при очередном запуске, будет добавляться к информации, выведенной в нем при предыдущих запусках.


    В строке 7 обеспечивается ввод значения переменной k. Правильность выполнения ввода данных рекомендуется всегда контролировать. Именно с этой целью в строке 8 значение переменной k выводится в текстовом поле. В строке 9 выполняется размещение массива a в памяти.


    В строках с 10 по 12 выполняется ввод значений элементов массива a. Значение элемента a(0) при этом не вводится. Наличие этого элемента мы будем игнорировать. Он ни где не будет применяться. В строках с 13 по 16 значения введенных элементов массива a выводятся для контроля в текстовом поле.


    В строках с 17 по 20 выполняется вычисление значения переменной s. И, наконец, в строке 21 обеспечивается вывод значения переменной s в текстовом поле.


    Обратите внимание на то, что в программе нет инструкции i = 1, а также инструкции i = i + 1, несмотря на то, что эти инструкции есть в блок-схеме. Нет также проверки условия i <= k. Выполнение всех этих действий обеспечивает инструкция цикла For … Next.


    Обратите внимание на то, что в программе также нет инструкции sum = 0. Значение 0 переменная sum получила в результате ее объявления. Можно удалить инструкцию Dim i As Integer. Инструкция цикла For … Next является блоком. Переменная i внутри блока получит тип Integer автоматически (по типу начального и конечного значений параметра), но действовать будет только внутри блока.


    Логические операции В VB.NET определены логические операции: And (логическое умножение), Or (логическое сложение), Not (логическое отрицание), а также Xor (логическое исключительное сложение). Операция Not имеет следующий синтаксис: Not Операнд


    Операнд, имеющий логический тип, – это отношение, переменная или функция логического типа или результат логической операции. Результат логического отрицания имеет значение противоположное значению ее операнда, что показывает приведенная далее таблица.


    Операция Not Not Операнд


    Операция And имеет два операнда:Операнд 1 And Операнд 2 Результат операции And определяет таблица:


    Операция And имеет значение True только тогда, когда оба операнда имеют значение True. Пример Неравенство a ? x ? b следует записать: a <= x And x <= b Неправильно написать: a <= x <= b


    Операция Or также имеет два операнда: Операнд 1 Or Операнд 2 Результат операции Or дан в таблице:


    Операция Or имеет значение True, если хотя бы один операнд (и даже оба вместе) имеют значение True. Пример: Условие «х не принадлежит отрезку » следует записать: x < a Or x > b или Not(a <= x And x <= b)


    Xor (логическое исключительное сложение) Результат операции Xor дан в таблице: Операция Xor имеет значение True, если один из операндов (но не оба вместе) имеют значение True.


    В VB.NET определены также логические операции: AndAlso и OrElse. Операция AndAlso очень похожа на операцию And. Она также выполняет логическое умножение для двух логических операндов (Boolean).


    Основным различием между AndAlso и And является то, что AndAlso допускает сокращенное, неполное вычисление операндов. Если для первого операнда в AndAlso вычисляется значение False, второй операнд не вычисляется и возвращается значение False операции AndAlso.


    Аналогично операция OrElse очень похожа на операцию Or. Она выполняет сокращенное логическое сложение двух логических операндов. Если первый операнд в выражении OrElse равен True, второй операнд не вычисляется и возвращается True для операции OrElse.

    Порядок выполнения операций при вычислении значения выражения определяется расположением знаков операций , круглых скобок и приоритетом операций . Операции с наивысшим приоритетом выполняются в первую очередь. Если в выражении содержится несколько операций одного приоритета на одном и том же уровне, то их обработка производится в соответствии с порядком выполнения – справа налево или слева направо. Если необходимо изменить порядок выполнения операций в выражении, то следует использовать круглые скобки, например (x + y) * z.

    Приоритет операции запятая ниже, чем у всех остальных операций.

    В приведенной ниже таблице операции языка C++ приведены в порядке убывания приоритета. Операции с разными приоритетами разделены чертой.

    Таблица приоритетов операций

    Знаки операций

    Названия операций

    Порядок выполнения

    повышение приоритета

    постфиксный инкремент

    постфиксный декремент

    слева направо

    sizeof

    (тип) выражение и

    тип (выражение)

    размер операнда в байтах

    префиксный инкремент

    префиксный декремент

    поразрядное Н Е

    логическое НЕ

    унарные минус, плюс

    преобразование типа

    справа налево

    умножение

    остаток от деления целых

    слева направо

    сложение

    вычитание

    слева направо

    сдвиг влево

    сдвиг вправо

    слева направо

    меньше или равно

    больше или равно

    слева направо

    слева направо

    поразрядное И

    слева направо

    поразрядное исключающее ИЛИ

    слева направо

    поразрядное ИЛИ

    слева направо

    логическое И

    слева направо

    логическое ИЛИ

    слева направо

    ? :

    условная

    справа налево

    *= , /= , %=

    += , - =

    <<= , >>=

    &= , |= , ^=

    присваивание (простое и

    составное)

    справа налево

    операция запятая

    слева направо

    Приведение (преобразование) типа

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

    Автоматически производятся лишь преобразования, которые преобразуют операнды с меньшим диапазоном значений в операнды с большим диапазоном значений, поскольку это происходит без какой-либо потери информации. Например, если в выражении ival + f v al переменная ival типа int , а переменная f v al – типа float , то при выполнении операции (+ ) значение переменной iv al будет приведено к типу float .

    Выражения, в которых могла бы теряться информация, например, при присваивании длинных целых более коротким или вещественным целым, могут вызвать предупреждения (Warning), но они допустимы (см. операцию присваивания).

    Для любого выражения можно явно указать преобразование его типа, используя унарную операцию, называемую приведением (преобразованием) типа . Операция может быть записана в двух форматах:

    (тип ) выражение

    тип (выражение)

    Операндом операции приведения типа является преобразуемое выражение. Приоритет операции приведения типа такой же, как и у других унарных операций. Например: (long double ) 5; (int ) f; (double) a/2.

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

    (int ) x + b * c

    (int ) (x + b * c )

    В первом случае преобразование относится к переменной x , во втором – ко всему выражению x + b * c .

    Приоритет операций — очерёдность выполнения операций в выражении, при условии, что в выражении нет явного указания порядка следования выполнения операций (с помощью круглых скобок).

    Если операции имеют одинаковый приоритет, то очерёдность выполнения таких операций определяется согласно свойству ассоциативности.

    Ассоциативность — направление выполнения операций в случае, если операции имеют одинаковый приоритет.

    В таблице 1 показаны основные операции в С++, их приоритет выполнения и ассоциативность.

    Таблица 1 — Приоритет операций в С++
    Приоритет Операция Ассоциативность Описание
    1 :: слева направо унарная операция разрешения области действия
    операция индексирования
    () круглые скобки
    . обращение к члену структуры или класса
    -> обращение к члену структуры или класса через указатель
    2 ++ слева направо постфиксный инкремент
    постфиксный декремент
    3 ++ справа налево префиксный инкремент
    префиксный декремент
    4 * слева направо умножение
    / деление
    % остаток от деления
    5 + слева направо сложение
    вычитание
    6 >> слева направо сдвиг вправо
    << сдвиг влево
    7 < слева направо меньше
    <= меньше либо равно
    > больше
    >= больше либо равно
    8 == слева направо равно
    != не равно
    9 && слева направо логическое И
    10 || слева направо логическое ИЛИ
    11 ?: справа налево условная операция (тернарная операция)
    12 = справа налево присваивание
    *= умножение с присваиванием
    /= деление с присваиванием
    %= остаток от деления с присваиванием
    += сложение с присваиванием
    -= вычитание с присваиванием
    13 , слева направо запятая

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

    // не правильное выражение int value = 5; cout << value += 3; //(ОШИБКА) передаем в поток вывода значение переменной value + 3

    Компилятор не поймет выражения в строке 3, так как операция сдвига влево имеет больший приоритет нежели операция суммирования с присваиванием. В итоге программу с таким выражением даже нельзя будет запустить. Суть в том, что компилятор понимает это выражение не так как мы, а совсем по-другому. Как будет рассуждать компилятор: «В выражении две операции, причём первая операция << имеет больший приоритет, чем вторая += , значит передам сначала в поток вывода значение переменной value , а потом прибавлю 3 к?????? А не к чему прибавить 3, так как переменная value передаётся в поток вывода.» Вот в этом и заключается ошибка, а чтобы её не было необходимо просто поставить круглые скобки.

    // правильное выражение int value = 5; cout << (value += 3); // передаем в поток вывода значение переменной value + 3

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

    Приветствую вас, уважаемые читатели блога сайт! В прошлый раз мы рассматривали вопрос о во встроенном языке 1С:Предприятие 8. Сегодня мы поговорим о о приоритетах арифметических операций примитивных типов данных , а также рассмотрим несколько подряд идущих арифметические операций. Давайте, посмотрим!

    Из программы школы, вы знакомы с тем, что наивысшими приоритетом в арифметических операциях являются круглые скобки «()».
    Если выражение находится в круглых скобках, то прежде всего будет исполняться именно оно. Следующим по приоритету идут унарные операции «+» и «-», унарная операция означает, что указывается операция и одно значение, например «-5». Третьими выполняются операции умножения и деления и в самую последнюю очередь сложение и вычитание. Давайте рассмотрим как это работает:

    99+15/5*8

    В этом случае вначале 15 будет разделено на 5, полученное число умножено на 6 и третья операция: 99 прибавиться к полученному числу. Далее следующее простое выражение 10+5/2+1. Понятно, что первым будет исполнятся операция деления, дальше будет исполнятся операция сложения. Если использовать скобки:

    (90+30)/(7+5)

    В этом случае в начале мы сложим 90 и 30 и поделим все это на 7+5 и в этом случае выражение будет равно 10. Рассмотрим другие операции, которые возможны в программном коде 1С:Предприятие 8. Возможно, вы работали в PHP, где возможен такой оператор i++; или i—; . Это инкремент или декремент на одну единицу. Исполнение таких операторов в 1С невозможно, но возможен оператор i++1; и j—1; . Давайте разберём их подробнее. Это вполне нормальный оператор. Откроем модуль любого справочника в Конфигураторе:

    Конфигурация -> Справочники -> Номенклатура, правой кнопкой мыши вызовем пункт Открыть модуль объекта .

    Чтобы не было ошибки объявим переменную в этом программном коде:

    A=0; b=a++1;

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

    A=0; b=a+ +1;

    Вообще, переводы строк не оказывают влияния на выполнение операторов. Как будет работать подобный оператор? Компилятор языка 1С вначале выполнит унарную операцию плюса, то есть +1 даст 1 и потом к a прибавит единицу. Это то же самое что сложить a с единицей. Точно так же можно написать:

    A=0; b=a+-1;

    Сначала выполняется унарная операция минуса, получается -1, затем складывается минус и плюс и получается -1. Соответственно это тоже самое, что и i-1 . Нужно знать о таких специфических операциях и понимать, как они будут выполнятся. Это поможет правильно расставлять приоритеты арифметических операциях в соответствии с тем порядком, о котором мы говорим.

    Итак, мы выяснили, что система спокойно отрабатывает операцию где встречается две подряд арифметические операции например ++ , +-, -+, а что будет если мы напишем несколько арифметических операций подряд? Это можно проверить. Для этого откроем 1С:Предприятие из Конфигуратора в режиме отладки, клавиша «F5». Поставим точку останова, клавиша «F9», в конце нашего выражения и введём простое выражение в табло. В Конфигураторе откроем пункт меню Отладка -> Табло.

    Запишем в табло выражение 3+++5 , обратите внимание, на выходе у нас получается ошибка в выражении. Платформа такого преобразования сделать не может. Выражение 3++5 срабатывает, а вот с тремя плюсами система уже не понимает, чего конкретно от неё хотят. Но если поставить скобки 1++(+2) , то всё это будет выполнено корректно. Как видим, чтобы правильно организовать работу арифметических операций, необходимо хорошо понимать приоритеты их выполнения. В следующей статье мы рассмотрим .