Приоритет выполнения операций в выражениях. Приоритеты операций

Приветствую вас, уважаемые читатели блога сайт! В прошлый раз мы рассматривали вопрос о во встроенном языке 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) , то всё это будет выполнено корректно. Как видим, чтобы правильно организовать работу арифметических операций, необходимо хорошо понимать приоритеты их выполнения. В следующей статье мы рассмотрим .

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

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

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

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

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. Для уяснения этой ситуации напомним существующее в языках программирования понятие лексемы.

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

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

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

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

Константы.

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

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

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

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

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

Приоритет и порядок выполнения операций

Большинство операций в языке C#, их приоритет и порядок наследованы из языка C++. Однако имеются и различия: например, нет операции " , " , позволяющей вычислять список выражений; добавлены операции checked и unchecked , применимые к выражениям.

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

Таблица 3.1. Приоритеты операций языка C#
Приоритет Категория Операции Порядок
0 Первичные (expr), x.y, x->y, f(x), a[x], x++, x--, new, typeof(t), checked(expr), unchecked(expr) Слева направо
1 Унарные +, -, !, ~, ++x, --x, (T)x, sizeof(t) Слева направо
2 Мультипликативные (Умножение) *, /, % Слева направо
3 Аддитивные (Сложение) +, - Слева направо
4 Сдвиг << ,>> Слева направо
5 Отношения, проверка типов <, >, <=, >=, is, as Слева направо
6 Эквивалентность ==, != Слева направо
7 Логическое И (AND) & Слева направо
8 Логическое исключающее ИЛИ (XOR) ^ Слева направо
9 Логическое ИЛИ (OR) | Слева направо
10 Условное логическое И && Слева направо
11 Условное логическое ИЛИ || Слева направо
12 Условное выражение ? : Справа налево
13 Присваивание

Склеивание с null

=, *=, /=, %=, +=, -=, <<=, >>=, &=, ^=, |= Справа налево
14 Лямбда-оператор => Справа налево

Перегрузка операций и методов

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

Нужно понимать, что операции - это частный случай записи методов класса. Методы класса, так же как и операции, могут быть перегружены. Метод класса называется перегруженным , если существует несколько реализаций этого метода. Перегруженные методы имеют одно и то же имя, но должны отличаться своей сигнатурой . Сигнатуру метода составляет список типов формальных аргументов метода. Так что два метода класса с одним именем, но отличающиеся, например, числом параметров, имеют разную сигнатуру и удовлетворяют требованиям, предъявляемым к перегруженным методам.

Большинство операций языка C# перегружены - одна и та же операция может применяться к операндам различных типов. Поэтому прежде чем выполнять операцию, проводится поиск реализации, подходящей для данных типов операндов. Замечу, что операции, как правило, выполняются над операндами одного типа. Если же операнды разных типов, то предварительно происходит неявное преобразование типа одного из операндов. Оба операнда могут быть одного типа, но преобразование типов может все равно происходить - по той причине, что для заданных типов нет соответствующей перегруженной операции. Такая ситуация достаточно часто возникает на практике, поскольку, например, операция сложения не определена для младших подтипов арифметического типа. Если для данных типов операндов нет подходящей реализации операции и невозможно неявное приведение типов операндов, то, как правило, эта ошибка обнаруживается еще на этапе компиляции.

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

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

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

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

Преобразование, для которого не выполняется хотя бы одно из этих условий, называется опасным. Достаточным условием существования безопасного преобразования является, например, условие того, что тип является подтипом типа . Действительно, в этом случае любое значение источника является одновременно и допустимым значением цели. Так, преобразование от типа int к типу double является безопасным. Обратное преобразование, естественно, будет опасным.

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

Существуют разные способы выполнения явных преобразований - операция кастинга (приведение к типу), методы специального класса Convert , специальные методы ToString , Parse . Все эти способы будут рассмотрены в данной лекции.

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

Организация программного проекта ConsoleExpressions

Как обычно, все примеры программного кода, появляющиеся в тексте, являются частью программного проекта. Опишу структуру используемого в этой лекции консольного проекта, названного ConsoleExpressions. Помимо созданного по умолчанию класса Program , в проект добавлены два класса с именами TestingExpressions и Scales . Каждый из методов класса TestingExpressions представляет тест, который позволяет анализировать особенности операций, используемых при построении выражений, так что этот класс представляет собой сборник тестов. Класс Scale носит содержательный характер, демонстрируя работу со шкалами, о которых пойдет речь в этой лекции. Чтобы иметь возможность вызывать методы этих классов, в процедуре Main класса Program объявляются и создаются объекты этих классов. Затем эти объекты используются в качестве цели вызова соответствующих методов. Общая схема процедуры Main и вызова методов класса такова:

static void Main(string args) { string answer = "Да"; do { try { TestingExpressions test = new TestingExpressions(); test.Casting(); //Вызов других методов … } catch (Exception e) { Console.WriteLine("Невозможно нормально продолжить работу!"); Console.WriteLine(e.Message); } Console.WriteLine("Продолжим работу? (Да/нет)"); answer = Console.ReadLine(); } while (answer == "Да" || answer == "да" || answer == "yes"); }

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

Лекция 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 .

Loading...Loading...