Какое значение примет переменная слева после присваивания результата действия справа
Обновлено: 21.12.2024
Команда присваивания нужна для вычисления значений выражений и присваивания их значений переменным.
Общий вид:
<имя_переменной> := <выражение>
Знак «\(:=\)» читается как присвоить и заменяет предыдущее значение переменной, стоящей в левой части на новое, которое находится в правой части.
Знаки «\(=\)» и «\(:=\)» — это разные знаки. Знак равно обозначает равенство двух величин. А знак «\(:=\)» присваивает новое значение переменной.
Если справа от знака присваивания стоит не конкретное значение, а целое выражение, то сначала вычисляется его значение, а потом оно присваивается переменной, находящейся слева от знака.
\(A := 10\);
\(B := (A + 4)/2\).
Ответ: \(B := 7\).
Свойства присваивания:
1. если переменной не присвоено значение, она является неопределённой;
2. присвоенное значение переменной сохраняется до тех пор, пока не будет выполнятся новая операция присваивания с этой же переменной;
3. при присваивании переменной очередного значения, предыдущее значение из памяти стирается.
Даны две коробки с бусинками. В одной коробке только красные бусинки, а во второй только синие, при этом перепутаны цвета коробочек. Красные бусины лежат в синей коробке, а синие в красной.
Как можно поменять местами бусинки? Напишите алгоритм.
Очевидно, для того чтобы пересыпать бусинки из одной коробки в другую, понадобится какая-то третья коробочка.
Введем обозначения.
\(A := krasnye\)
\(B := sinie\)
\(C := net\)
алг коробочки
лит\(A\), \(B\), \(C\)
нач
\(C := krasnye\)
\(A := sinie\)
\(B := krasnye\)
кон
Если бы мы не использовали третью переменную, а решили сразу поменять местами значение переменных, получили бы следующее:
\(B := krasnye\)
А значение переменное \(B\) теперь \(krasnye\), значение \(sinie\) из памяти компьютера уже стёрлось.
Каждая операция имеет приоритет. Вычисления производятся слева направо в порядке приоритета операций . Порядок действий может быть изменен при помощи скобок.
В следующей таблице операции расположены по старшинству приоритетов.
Оператор присваивания
Процесс установки значения переменной называется присвоением. Оператор присваивания составляет основу всех вычислений. Он состоит из переменной слева, знака равенства и выражения (формулы) справа. Выражение содержит знаки операций и операнды. В качестве операндов могут использоваться переменные, функции и константы. Например, A = B + C * D - 34.5 / ln(B) .
Оператор присваивания вычисляет значение выражения справа и назначает его переменной слева, при этом прежнее значение этой переменной заменяется новым.
Следует отличать оператор присваивания от операции сравнения двух операндов. В первом случае производится изменение значения переменной, указанной слева, а во втором - значения операндов сравниваются.
- В операторе присваивания один и тот же идентификатор переменной может стоять слева и справа. Например, запись x=x+2 с математической точки зрения недопустима, а в качестве оператора присваивания означает, что значение переменной x увеличивается на два.
Оператор присваивания применяется для вычислений с любыми типами данных. В операторе присваивания могут использоваться свойства объектов, например, в результате выполнения оператора ActiveCell.Value=222 в активную ячейку поместится значение 222.
В выражении справа можно смешивать различные типы данных. Необязательно типы переменной слева и результата выражения справа должны совпадать. При несовпадении типов выражение преобразуется к типу переменной слева. Если эта попытка не удается, то возникает ошибка несоответсвия типов - Type mismatch. Рекомендуется контролировать соответствие типов левой и правой частей оператора присваивания .
Операторы присваивания можно записывать в окне Immediate. Например, R=13.5 .
Другая форма записи оператора присваивания - это использование оператора Let. Например, Let R=13.5 . Обычно ключевое слово Let опускается.
Арифметические операции
При выполнении арифметических операций можно смешивать различные типы данных. При этом автоматически производится преобразование целых чисел в более общий формат действительных чисел. Переменные всех числовых типов могут присваиваться друг другу. При присвоении целой переменной значения переменной с фиксированной или плавающей точкой оно округляется до целого.
Если заранее известно, что переменная будет принимать только целые значения, ей следует назначать тип Integer или Long. Если будут использоваться дробные числа, то переменная может иметь тип Currency, Single или Double.
- Если необходима высокая точность вычислений или нельзя заранее определить, какие значения будут у переменной, используйте тип Double.
- Операция деления на нуль порождает ситуацию ошибки Division by zero и приводит к немедленному завершению программы.
- Операции деления нацело "\" и получения остатка от деления Mod запишите в окне Immediate (для перехода в окно нажмите Ctrl+G ). Оператор ? 10 \ 3 возвращает три.
При делении нацело оба числа преобразуются в целые путем округления, затем выполняется операция деления и у результата операции отбрасывается дробная часть.
Операция получения остатка от деления Mod дополняет операцию деления нацело возвращением остатка. Оператор ? 10 MOD 3 возвращает значение 1.
Оператор ?1+100 MOD 7 возвращает значение 3, что соответствует среде.
Указатели широко применяются в С++. Можно сказать, что именно наличие указателей сделало этот язык удобным для программирования. С другой стороны это одна из наиболее сложных для освоения возможностей С++. Идея работы с указателями состоит в том, что пользователь работает с адресом ячейки памяти.
Как правило, при обработке оператора объявления переменной
компилятор автоматически выделяет память под переменную имя_переменной в соответствии с указанным типом:
Доступ к объявленной переменной осуществляется по её имени. При этом все обращения к переменной заменяются на адрес ячейки памяти, в которой хранится её значение . При завершении программы или функции, в которой была описана переменная , память автоматически освобождается.
Доступ к значению переменной можно получить иным способом — определить собственные переменные для хранения адресов памяти. Такие переменные называют указателями. С помощью указателей можно обрабатывать массивы, строки и структуры, создавать новые переменные в процессе выполнения программы, передавать адреса фактических параметров функциям и адреса функций в качестве параметров.
Итак, указатель это переменная , значением которой является адрес памяти, по которому хранится объект определённого типа (другая переменная ). Например, если С это переменная типа char , а Р — указатель на С, значит в Р находится адрес по которому в памяти компьютера хранится значение переменной С.
Как и любая переменная , указатель должен быть объявлен. При объявлении указателей всегда указывается тип объекта , который будет храниться по данному адресу:
Звёздочка в описании указателя, относится непосредственно к имени, поэтому чтобы объявить несколько указателей, её ставят перед именем каждого из них:
2.6 Операции и выражения
Выражение задаёт порядок выполнения действий над данными и состоит из операндов (констант, переменных, обращений к функциям), круглых скобок и знаков операций. Операции делятся на унарные (например, -с ) и бинарные (например, а+b ). В таблице 2.4 представлены основные операции языка С++.
Перейдём к подробному рассмотрению основных операций языка.
2.6.1 Операции присваивания
Обычная операция присваивания имеет вид:
где значение это выражение, переменная, константа или функция. Выполняется операция так. Сначала вычисляется значение выражения указанного в правой части оператора, а затем его результат записывается в область памяти, имя которой указано слева.
Задача 2.1. Пусть в переменной а хранится значение, равное 3, а в переменную b записали число 5. Поменять местами значения переменных а и b .
Для решения задачи понадобится дополнительная переменная c (см. рис. 2.1). В ней временно сохраняется значение переменной а . Затем, значение переменной b записывается в переменную a , а значение переменной c в переменную b .
Рис. 2.1. Использование буферной переменной
Если в операторе присваивания левая и правая часть это переменные разных типов, то происходит преобразование: значение переменной в правой части преобразуется к типу переменной в левой части. Следует учитывать, что при этом можно потерять информацию или получить другое значение.
В С++ существует возможность присваивания нескольким переменным одного и того же значения. Такая операция называется множественным присваиванием и в общем виде может быть записана так:
Запись a=b=c=3.14159/6; означает, что переменным a, b и c было присвоено одно и то же значение 3.14159/6.
Операции + =, -=, *=, / = называют составным присваиванием. В таких операциях при вычислении выражения стоящего справа используется значение переменной из левой части, например так:
2.6.2 Арифметические операции
Операции +, -, *, / относят к арифметическим операциям. Их назначение понятно и не требует дополнительных пояснений. При программировании арифметических выражений следует придерживаться простых правил. Соблюдать очерёдность выполнения арифметических операций. Сначала выполняются операции умножения и деления (1-й уровень), а затем сложения и вычитания (2-й уровень). Операции одного уровня выполняются последовательно друг за другом. Для изменения очерёдности выполнения операций используют скобки. Таблица 2.5 содержит примеры записи алгебраических выражений.
Операции инкремента ++ и декремента -- так же причисляют к арифметическим, так как они выполняют увеличение и уменьшение на единицу значения переменной. Эти операции имеют две формы записи: префиксную (операция записывается перед операндом) и постфиксную (операция записывается после операнда). Так, например оператор p=p+1; можно представить в префиксной форме ++p; и в постфиксной p++; .Эти формы отличаются при использовании их в выражении. Если знак декремента (инкремента) предшествует операнду, то сначала выполняется увеличение (уменьшение) значения операнда, а затем операнд участвует в выражении. Например,
Если знак декремента (инкремента) следует после операнда, то сначала операнд участвует в выражении, а затем выполняется увеличение (уменьшение) значения операнда:
Остановимся на операциях целочисленной арифметики.
Операция целочисленного деления / возвращает целую часть частного (дробная часть отбрасывается) в том случае, если она применяется к целочисленным операндам, в противном случае выполняется обычное деление: 11/4 = 2 или 11.0/4 = 2.75.
Операция остаток от деления % применяется только к целочисленным операндам: 11%4 = 3.
К операциям битовой арифметики относятся следующие операции: &, |, ^,
, <<, >> . В операциях битовой арифметики действия происходят над двоичным представлением целых чисел.
Арифметическое И (&). Оба операнда переводятся в двоичную систему, затем над ними происходит логическое поразрядное умножение операндов по следующим правилам:
Например, если А=14 и В=24 , то их двоичное представление — А=0000000000001110 и В=0000000000011000 . В результате логического умножения A и B получим 0000000000001000 или 8 в десятичной системе счисления (рис. 2.2). Таким образом, A&B=14&24=8 .
Рис. 2.2. Пример логического умножения
Рис. 2.3. Пример логического сложения
Арифметическое ИЛИ (|). Здесь также оба операнда переводятся в двоичную систему, после чего над ними происходит логическое поразрядное сложение операндов по следующим правилам:
Например, результат логического сложения чисел А=14 и В=24 будет равен A |B=30 (рис. 2.3).
Арифметическое исключающее ИЛИ (^). Оба операнда переводятся в двоичную систему, после чего над ними происходит логическая поразрядная операция ^ по следующим правилам:
Арифметическое отрицание (
). Эта операция выполняется над одним операндом. Применение операции
вызывает побитную инверсию двоичного представления числа (рис. 2.4).
Рис. 2.4. Пример арифметического отрицания
Сдвиг влево (M<<L). Число M , представленное в двоичной системе, сдвигается влево на L позиций. Рассмотрим операцию 15 << 3 . Число 15 в двоичной системе имеет вид 1111. При сдвиге его на 3 позиции влево получим 1111000. В десятичной системе это двоичное число равно 120. Итак, 15 << 3 =120 (рис. 2.5). Заметим, что сдвиг на один разряд влево соответствует умножению на два, на два разряда — умножению на четыре, на три — умножению на восемь. Таким образом, операция M << L эквивалентна умножению числа M на 2 в степени L .
Рис. 2.5. Пример операции "Сдвиг влево"
Рис. 2.6. Пример операции "Сдвиг вправо"
Сдвиг вправо (M>>L). Число M , представленное в двоичной системе, сдвигается вправо на L позиций, что эквивалентно целочисленному делению числа M на 2 в степени L . Например, 15 >> 1=7 (рис. 2.6), 15 >> 3=1 .
2.6.3 Логические операции
В С++ определены следующие логические операции || (или), && (и), ! (не). Логические операции выполняются над логическими значениями true (истина) и false (ложь). В языке С ложь — 0, истина — любое значение 0. В таблице 2.6 приведены результаты логических операций.
2.6.4 Операции отношения
Операции отношения возвращают в качестве результата логическое значение. Таких операций шесть: >, >=, <, <=, ==, != . Результат операции отношения — логическое значение true (истина) или false (ложь).
2.6.5 Условная операция
Для организации разветвлений в простейшем случае можно использовать условную операцию ? :. Эта операция имеет три операнда и в общем виде может быть представлена так:
Работает операция следующим образом. Если условие истинно (не равно 0), то результатом будет выражение1 , в противном случае выражение2 . Например, операция y=x<0 ? -x : x; записывает в переменную y модуль числа х .
2.6.6 Операция преобразования типа
Для приведения выражения к другому типу данных в С++ существует операция преобразования типа:
Например, в результате действий x=5; y=x/2; z=(float) x/2; переменная y примет значение равное 2 (результат целочисленного деления), а переменная z = 2.5 .
2.6.7 Операция определения размера
Вычислить размер объекта или типа в байтах можно с помощью операции определения размера, которая имеет две формы записи:
Например, предположим, что была описана целочисленная переменная int k=3; .Исходя из того, что тип int занимает в памяти 4 байта, в переменную m=sizeof k; будет записано число 4.
В результате работы команд double z=123.456; p=sizeof (k+z); значение переменной p стало равно 8, т. к. вещественный тип double более длинный (8 байтов) по сравнению с типом int (4 байта) и значение результата было преобразовано к более длинному типу. В записи операции sizeof (k+z) были использованы скобки. Это связано с тем, что операция определения типа имеет более высокий приоритет, чем операция сложения. При заданном значении z=123.456; та же команда, но без скобок p=sizeof k+z; вычислит p=4+123.456=127.456 .
Команда s = sizeof "Hello"; определит, что под заданную строку в памяти было выделено s=6 байтов, т. к. объект состоит из 5 символов и один байт на символ окончания строки.
2.6.8 Операции с указателями
При работе с указателями часто используют операции получения адреса & и разадресации * (табл. 2.7).
Операция получения адреса & возвращает адрес своего операнда. Например:
Операция разадресации * возвращает значение переменной, хранящееся по заданному адресу, т.е. выполняет действие, обратное операции &:
К указателям применяют операцию присваивания. Это значит, что значение одного указателя можно присвоить другому. Если указатели одного типа, то для этого применяют обычную операцию присваивания:
Если указатели ссылаются на различные типы, то при присваивании значения одного указателя другому, необходимо использовать преобразование типов. Без преобразования можно присваивать любому указателю указатель void* .
Рассмотрим пример работы с указателями различных типов:
В указателях p1 и p2 хранится один и тот же адрес ( p1=0012FF7C ), но значения, на которые они ссылаются, разные ( *p1=3.14159, *p2=2.642140e-308 ). Это связано с тем, указатель типа *float адресует 4 байта, а указатель *double — 8 байт. После присваивания p2=(double *)p1; при обращении к *p2 происходит следующее: к переменной, хранящейся по адресу p1 , дописывается ещё следующих 4 байта из памяти. В результате значение *p2 не совпадает со значением *p1 .
Таким образом, при преобразовании указателей разного типа приведение типов разрешает только синтаксическую проблему присваивания. Следует помнить, что операция * над указателями различного типа, ссылающимися на один и тот же адрес, возвращает различные значения.
Над адресами С++ определены следующие арифметические операции:
- сложение и вычитание указателей с константой;
- вычитание одного указателя из другого;
- инкремент;
- декремент.
Сложение и вычитание указателей с константой n означает, что указатель перемещается по ячейкам памяти на столько байт, сколько занимает n переменных того типа, на который он указывает. Например, пусть указатель имеет символьный тип, и его значение равно 100. Результат сложения этого указателя с единицей — 101, так как для хранения переменной типа char требуется один байт. Если же значение указателя равно 100, но он имеет целочисленный тип, то результат его сложения с единицей будет составлять 104, так как для переменной типа int отводится четыре байта.
Эти операции применимы только к указателям одного типа и имеют смысл в основном при работе со структурными типами данных, например массивами.
Фактически получается, что значение указателя изменяется на величину sizeof(тип) .Если указатель на определённый тип увеличивается или уменьшается на константу, то его значение изменяется на величину этой константы, умноженную на размер объекта данного типа. Например:
Вычитание двух указателей определяет, сколько переменных данного типа размещается между указанными ячейками. Разность двух указателей это разность их значений, делённая на размер типа в байтах. Так разность указателей на третий и нулевой элементы массива равна трём, а на третий и девятый — шести. Суммирование двух указателей не допускается.
Операции инкремента и декремента, соответственно, увеличивают или уменьшают значение адреса:
К указателям так же применимы операции отношения ==, !=, <, >, <=, >= . Иными словами, указатели можно сравнивать. Например, если указывает на пятый элемент массива, а на первый, то отношение истинно. Кроме того, любой указатель всегда можно сравнить на равенство с константой нулевого указателя (NULL) 6 Константу нулевого указателя можно присвоить любому указателю и такой указатель при сравнении не будет равен любому реальному указателю. . Однако все эти утверждения верны, если речь идёт об указателях, ссылающихся на один массив. В противном случае результат арифметических операций и операций отношения будет не определён.
Замечание. Операции можно классифицировать по количеству операндов на: унарные - воздействуют на один операнд, бинарные - воздействуют на два операнда, тернарные - воздействует на три операнда. Некоторые символы используются для обозначения как унарных, так и бинарных операций. Например, символ "минус" используется как для обозначения унарной операции - арифметического отрицания, так и для обозначения бинарной операции вычитание. Будет ли данный символ обозначать унарную или бинарную операцию, определяется контекстом, в котором он используется.- Инкремент (++) и декремент(--).
Эти операции имеют две формы записи - префиксную,когда операция записывается перед операндом, и постфиксную - операция записывается после операнда. Префиксная операция инкремента (декремента) увеличивает (уменьшает) свой операнд и возвращает измененное значение как результат. Постфиксные версии инкремента и декремента возвращают первоначальное значение операнда, а затем изменяют его.
Рассмотрим эти операции на примере.
Задание. Выясните, допустимы ли следующие способы записи ++(++i) , (i--)-- , ++(i--) и т.д. И почему. Замечание.Префиксная версия требует существенно меньше действий: она изменяет значение переменной и запоминает результат в ту же переменную. Постфиксная операция должна отдельно сохранить исходное значение, чтобы затем вернуть его как результат. Для сложных типов подобные дополнительные действия могут оказаться трудоемки. Поэтому постфиксную форму имеет смысл использовать только при необходимости.- Арифметическое отрицание (-) - меняет знак операнда на противоположный.
- Логическое отрицание (!) - определяет операцию инверсия для логического типа.
Рассмотрим эти операции на примере.
Задание. Выясните, допустимы ли следующие способы записи !(-i), -(!a). И почему.Рассмотрим эту операцию на примере.
Задание. Объясните, почему операция (byte)i вместо ожидаемого значения -4 дала нам в качестве результата значение 252 .Рассмотрим эти операции на примере.
Результат работы программы:
- 1.0/0;
- 1/0
И объясните, как получился данный результат.
- i<j<k
- true<false
И объясните, как получился данный результат.
Логические операции применяются к операндам логического типа.
Результат логической операции И имеет значение истина тогда и только тогда, когда оба операнда принимают значение истина.
Результат логической операции ИЛИ имеет значение истина тогда и только тогда, когда хотя бы один из операндов принимает значение истина.
Рассмотрим операции на примере:
Результат работы программы:
Замечание.Фактически была построена таблица истинности для логических операций И и ИЛИ. Задание. Объясните, какое значение примет переменная t в данном фрагменте программы: int a=10, b=3; bool t=(a>=b && a!=2*b || a<0);Формат: (<операнд1>)? <операнд2> : <операнд3> ;
Операнд1 - это логическое выражение, которое оценивается с точки зрения его эквивалентности константам true и false . Если результат вычисления операнда1 равен true , то результатом условной операции будет значение операнда2 , иначе - операнда3 . Фактически условная операция является сокращенной формой условного оператора if , который будет рассмотрен позже.
Пример использования условной операции:
- вычислялось наименьшее значение из двух вещественных чисел x и y ;
- если число двузначное, то на экран выводилось "Да", и "Нет" в противном случае.
Формат операции простого присваивания ( = ):
В результате выполнения этой операции вычисляется значение операнда_1 , и результат записывается в операнд_2 . Возможно связать воедино сразу несколько операторов присваивания, записывая такие цепочки: a=b=c=100 . Выражение такого вида выполняется справа налево: результатом выполнения c=100 является число 100 , которое затем присваивается переменной b , результатом чего опять является 100 , которое присваивается переменной a .
Кроме простой операции присваивания существуют сложные операции присваивания, например, умножение с присваиванием ( *= ), деление с присваиванием ( /= ), остаток от деления с присваиванием ( % =), сложение с присваиванием ( += ), вычитание с присваиванием ( -= ) и т.д.
В сложных операциях присваивания, например, при сложении с присваиванием, к операнду_2 прибавляется операнд_1 , и результат записывается в операнд_2 . То есть, выражение с += а является более компактной записью выражения с = с + а. Кроме того, сложные операции присваивания позволяют сгенерировать более эффективный код, за счет того, что в простой операции присваивания для хранения значения правого операнда создается временная переменная, а в сложных операциях присваивания значение правого операнда сразу записывается в левый операнд.
Задание. Объясните, какие значения примут переменные t и b после выполнения данного фрагмента программы: int a=10, b=3; int t=(a++)-b; b+=t*a;Рассмотренные операции приведены с учетом убывания приоритета. Если в одном выражении соседствуют операции одного приоритета, то операции присваивания и условная операции выполняются справа налево, а остальные наоборот. Если необходимо изменить порядок выполнения операций, то в выражении необходимо поставить круглые скобки.
Читайте также: