Глава 10
В этой главе вы узнаете...
Программы обрабатывают данные, и одним из видов такой обработки является выполнение различных вычислений. Указание провести вычисления (которое записывается в виде формулы), в языке Visual C++ .NET называется выражением. Если вы знакомы с электронными таблицами (например, Excel), то наверняка уже имеете опыт использования выражений: каждый раз, набирая формулы в ячейках, вы набирали выражения.
Выражения применяются для получения новых данных исходя из уже имеющихся. Например, выражения можно использовать для вычисления площади круга, объема воздушного шара, веса танка или проведения более сложных вычислений, скажем, подведения итогов голосования.
Вверх
Использование выражений просто необходимо при создании серьезных программ. Если
Выражения также используются для того, чтобы определить, выполняется ли определенное условие. Например, если нужно определить, достигнут ли лимит по кредитной карточке, следует написать выражение, которое будет сравнивать значение лимита с остатком денег на счете.
Если вы хотите создать программу, способную на какие-то реальные действия, вам обязательно придется прибегнуть к помощи выражений. Посмотрите на выражения, приведенные ниже:
Как видите, без помощи выражений вы не сможете даже сложить двух чисел!
Вверх
В табл. 10.1 приведен список из пяти операторов, наиболее часто используемых при построении выражений. Оператором называется математический символ, указывающий, какое действие необходимо произвести для получения результата. Например, в выражении 4+5 оператором будет знак +.
Таблица 10.1. Математические операторы
Можно ли «выражаться»?
вы читаете главы по порядку, то уже сталкивались с выражениями, вычисляющими площадь квадрата и площадь круга. Например, в следующей строке, взятой из программы CircleArea3 (глава 9), вычисляется площадь круга исходя из информации о значении его радиуса:
oCircle.dblArea = PI * oCircle.dblRadius * oCircle.dblRadius;
2 + 2
3.14159 * Radius * Radius
ОстатокНаСчете < Лимит
Простые операторы
Оператор | Пример | Выполняемое действие |
* | foo * bar | Умножает одно число на другое. Например, 6*3 будет 18 |
/ | foo / bar | Делит одно число на другое. Например, 6/3 будет 2 |
+ | foo + bar | Суммирует два числа. Например, 6+3 будет 9 |
- | foo - bar | Отнимает от одного числа другое. Например, 6-3 будет 3 |
% | foo % bar | Возвращает остаток от деления двух чисел. Например, 10%3 даст число 1, поскольку 10/3 будет 3 и остаток 1 |
Для того чтобы корабль, залетая за правую часть экрана, появлялся с левой стороны, используйте оператор вычисления остатка от деления. Допустим, экран имеет в ширину 10 единиц и pos — это позиция фигурки корабля, тогда результат операции pos % 10 всегда будет принадлежать диапазону от 0 до 9, независимо от того, какое значение имеет переменная pos. Теперь, когда корабль достигает позиции 9 (крайняя справа), к ее значению прибавляется число 1, чтобы перейти в следующую позицию (корабль пропадает с экрана), далее позиция вычисляется как результат выражения pos % 10, получаем число 0, и корабль отображается в позиции 0 (крайняя слева).
Вверх
Операторы, показанные в табл. 10.2, несколько сложнее, чем операторы, приведенные в табл. 10.1. На данном этапе вы, наверное, могли бы обойтись и без них. Но по мере приобретения опыта создания программ вы оцените эти операторы по достоинству и с удовольствием будете их использовать. Некоторые из этих "сложных" операторов рассмотрены ниже в отдельных разделах этой главы. (Вы, наверное, подумаете: "Неужели они настолько сложные, что для их описания нужно выделять отдельные разделы?!".)
Таблица 10.2. Операторы увеличения, уменьшения и сдвига
Вверх
Есть два способа использования оператора ++. Его можно набрать или перед именем переменной: ++bar, или после: саr++.
В этом случае значение переменной bar будет увеличено на число 1, и на экране будет отображено число 2 (новое значение переменной bar).
В этом случае значение переменной bar будет увеличено на единицу, но на экране будет отображено ее старое значение (число 1), поскольку увеличение происходит после отображения значения переменной. (В первом примере для отображения значения использован управляемый код, а во втором — старый неуправляемый код С++.)
Оператор ++ часто используется в циклах для отсчета количества итераций. (Вам это непонятно? Не переживайте. Эти вопросы подробно обсуждаются в главе 11.)
Оператор -- работает по тому же принципу, что и ++, с той лишь разницей, что он
Вверх
Оператор сдвига очень полезен при работе с двоичными числами. Вот некоторые примеры его использования:
Для получения результата первое число представляется в двоичном виде, а затем все биты сдвигаются вправо на количество позиций, указанное вторым числом. Обратите внимание, что при сдвиге битов вправо число уменьшается.
Число 16, например, в двоичном виде выглядит так:
Вверх
Ниже приведены примеры использования оператора <<.
Если получаемое число превышает максимально допустимое значение переменной, сдвигаемые влево биты обрезаются. Например, если для значения переменной зарезервировано только 8 бит памяти и вы сдвигаете исходное значение на 8 бит влево, то в результате получите число 0 (нуль). Это произойдет потому, что все биты исходного значения были сдвинуты за пределы переменной и обрезаны.
Поэтому, если вам нужно отобразить результат выполнения операции сдвига влево, возьмите это выражение в скобки:
Вверх
Все рассмотренные ранее операторы используются в выражениях для вычисления какого-то определенного результата. Например вы видели, как используется оператор умножения для вычисления площади круга, если известно значение его радиуса.
Теперь же вы познакомитесь с логическими выражениями. Логические выражения используются не для вычисления какого-то конкретного результата, а для определения ложности или истинности проверяемого условия.
"Если проверяемое условие истинно, выполните вот этот набор инструкций".
В языке C++ логические выражения используются настолько часто, что для представления возвращаемых ими результатов предусмотрен даже отдельный тип данных: bool. У этого типа данных есть только два значения, для представления которых специально зарезервированы два ключевых слова: true (Истина) и false (Ложь).
В табл. 10.3 рассмотрены операторы, которые используются в логических выражениях.
Отсюда происходит их название: логические операторы. В следующей Главе описано, как логические операторы могут использоваться для определения условий, проверяемых условными операторами (такими, например, как оператор i f ) .
Таблица 10.3. Операторы сравнения (или логические операторы)
Вверх
Оператор присвоения (=) используется в тех случаях, когда необходимо присвоить значение какой-нибудь переменной. Например, если нужно сохранить входящую информацию или вычисленный результат. С оператором присвоения вы уже встречались ранее и видели, например, в такой строке:
Когда происходит присвоение значения, то значение, вычисляемое расположенным справа от знака равенства выражением, присваивается переменной, указанной слева от знака равенства (=).
Переменной можно присвоить только значение того же типа, что и сама переменная, или типа, который может быть автоматически преобразован к типу переменной. Продемонстрируем это на таком примере:
Ошибки здесь нет, поскольку присваиваемое значение имеет тот же тип, который
Переменная а может принимать только числовые значения типа integer (int). в то время как предпринимается попытка присвоить ей текстовое значение Sasha. Компилятор C++ будет с этим не согласен,
Не путайте оператор присвоения с оператором равенства
Например, в результате выполнения приведенного ниже кода переменной а всегда будет присваиваться значение 2. Это будет происходить потому, что при проверке условия оператора if переменной а присваивается значение 1, а поскольку числу 1 соответствует логическое значение true , инструкция условного оператора а = а + 1 будет выполняться:
Совершенно иначе выполняется код, показанный ниже, поскольку в этом случае значение переменной а : изменяется только при условии, что оно равно единице:
Чтобы не ошибиться и быть точно уверенным, что значения будут сравниваться, а не присваиваться, можно поступить следующим образом. Если нужно сравнить значение переменной с каким-то числом или каким-то постоянным значением, укажите его первым, а затем наберите знаки равенства и название переменной. Так, вместо кода
наберите код
Оба фрагмента будут работать одинаково. Однако вы можете случайно пропустить один знак равенства и набрать код
В этом случае компилятор выдаст сообщение об ошибке. Таким образом вы рискуете получить только синтаксическую ошибку (которая сразу же будет обнаружена), вместо логической ошибки, найти которую не так просто и которая может оказаться не такой уж безобидной.
Вверх
Довольно часто возникает необходимость совершить какое-то действие в отношение
Конечно, это можно сделать, набрав выражение наподобие такого:
Однако C++ предлагает для таких случаев набор специальных операторов присвоения, которые одновременно обрабатывают значение переменной и присваивают ей полученный результат. Выражения с такими операторами более лаконичны и наглядны. Работают они по следующему принципу. Выражение, наподобие
можно заменить эквивалентным ему выражением
Например, вместо выражения
можно набрать
В табл. 10.4 приведен список всех специальных операторов присвоения и описаны выполняемые ими действия.
Таблица 10.4. Специальные операторы присвоения
Вверх
Для сохранения одного числа используется некоторое количество битов. Например, для числа типа integer (int) выделяется 32 бита памяти. Количество битов, выделяемых для переменной, определяет максимальное значение, которое она может принять.
Если же для сохранения одного ответа вы будете использовать только один бит, ситуация меняется кардинальным образом. Действительно, если ответа может быть только два, 0 можно использовать для представления отрицательного ответа, а 1 — для положительного. Тогда нулевой бит числа можно использовать для хранения информации об ответе на первый вопрос, первый бит— для хранения информации об ответе на второй вопрос и т.д. (нумерация битов начинается с нулевого). Таким образом, каждая числовая переменная может хранить данные об ответе на 32 вопроса (так как в ее распоряжении есть 32 бита памяти) и ваша программа уже будет требовать для своего выполнения память в объеме, необходимом для хранения 10 000 чисел. Экономия существенная, не так ли?
Если вы используете числа именно таким образом, это называется созданием битовых полей. В табл. 10.5 описаны операторы, которые позволяют обрабатывать значения переменных на уровне битов (в таблице обрабатываемые значения и получаемые результаты представлены в двоичном виде).
Таблица 10.5. Побитовые операторы
Вверх
Условным оператором называется оператор if. Он работает по тому же принципу, что и
Вверх
Если вы еще не забыли того, что учили в школе на уроках математики, для вас не будет неожиданностью выполнение в формулах одних математических операций раньше других (даже если они указаны в конце формулы).
Чтобы изменить порядок обработки операторов, определяемых их приоритетом, используйте круглые скобки. Например, можете набрать выражение (3 + 2) х 3. В этом случае вначале будет обработан тот оператор, который заключен в скобки, т.е. оператор сложения, и только потом полученное число будет умножено на три.
В табл. 10.6 представлен список операторов с учетом их приоритета, Те операторы, которые указаны выше, обрабатываются раньше, чем расположенные ниже (другими словами, они имеют больший приоритет). Например, оператор + имеет больший приоритет, чем оператор >. Поэтому, выражение 1 + 0 > 1 равнозначно выражению (1 + 0) > 1. Но сами по себе, как вы понимаете, эти выражения ложны.
Таблица 10.6. Приоритет операторов
Вверх
Если вы не занимались раньше программированием, упоминания о двоичных числах и побитовых операциях могут поставить вас в затруднительное положение. Система счисления, которой мы пользуемся в повседневной жизни и к которой привыкли, называется десятичной. Каждая цифра десятичного числа, в зависимости от своей позиции, означает единицы, десятки, сотни, тысячи и т.д. Например, число 125
Компьютер не может представлять числа с использованием десяти различных цифр. Так как он может различать информацию только в формате "да-нет", каждая позиция в числе может быть представлена только одной из двух цифр: нулем и единицей. Числа, представленные с помощью нулей и единиц, называются двоичными. Каждая цифра такого числа называется битом (или двоичной цифрой). Например,
Для хранения одного числа компьютер использует набор из восьми битов, который обозначается термином байт. Один байт может представить 256 (или 28) уникальных значений. Два байта, объединенные вместе для представления одного значения, называются словом. Слово имеет в своем распоряжении 16 битов и может
уже представить 65 536 (или 216) уникальных значений. Четыре байта (32 бита) образуют двойное слово.
Для тех, кто имеет отношение к компьютерам, число 210 является ключевым. Это 1024 байта, или килобайт памяти (К). Хотя приставка кило обозначает тысячу, в мире компьютерных технологий она обозначает число 1024. Таким образом, например, 64К означает 64 х 1024, или 65 536 байт памяти.
Точно так же, хотя приставка мега (M в обычном мире означает миллион, для компьютерщиков это число 1024x1024, или 1048 576.
Поскольку гексит может принимать значения от 0 до 15, для представления цифр, обозначаемых десятичными числами от 10 до 15 используются первые шесть букв латинского алфавита (от А до F). Другими словами, буква А обозначает 10, В- 11 и т.д. Если вам нужно набрать шестнадцатеричное число в кодах C++, начните его с приставки Ох. Так, число ОхОА соответствует десятичному числу 10, а число OxFF - десятичному числу 255. Если среди ваших знакомых есть хакер, помешанный на языках программирования, спросите, сколько ему лет в шестнадцатеричной системе, и он не задумываясь ответит.
Почему компьютеры используют двоичную систему счисления? Это связано прежде всего с аппаратной частью, в частности с принципами работы транзисторов. Но это уже отдельная тема, и, если вас эти вопросы действительно интересуют, обратитесь к специальной литературе.
Вверх
Чтобы получить лучшее представление о работе операторов, просмотрите приведенные
Пример 1. Вычисление площади круга.
Пример 2. Вычисление объема налога, которым облагаются продаваемые товары, если
Пример 3. Вычисление розничной цены товара при условии, что она должна включать в
Пример 4. Сравнивается значение кредитного лимита с ценой товара, и, если лимит
Вверх
Во всех выражениях, с которыми вы сталкивались до этого, использовались только самые простые операторы. Но предположим, вам нужно вычислить что-то более серьезное и специфическое, связанное, например, с тригонометрическими операциями. Средство языка Visual C++, обозначаемое термином CLR (Common Language Runtime), предоставляет вам возможность использования целого набора математических функций для проведения специальных вычислений. Все они принадлежат классу Math. Наиболее часто используемые из них представлены в табл. 10.7.
Таблица 10.7. Математические функции
Увидеть некоторые из этих функций в действии вы можете в приведенном ниже листинге программы, которая, как и прежде, вычисляет площадь круга.
#include "stdafx.h"
//Set up a structure for storing information about circles
// This is the entry point for this application
//Ask for the size of the radius
//Calculate the area of the circle
//And now do some gratuitous math
//Hang out until the user is finished
return 0;
Код программы в файле CircleArea5
Вверх
В действительности все основные математические функции, которые доступны при
#include <math.h>
Таблица 10.8. Математические функции языка C++
Назад |
Начало урока |
Вверх |
Вперед
Более сложные операторы
Оператор
Пример
Выполняемое действие
++
foo++,
++foo Увеличение. Добавляет число 1 к значению элемента. Например, если переменная nAge имеет значение 2, то после выполнения операции
nAge++ она будет иметь значение 3. (Кстати, свое название язык
C++ получил благодаря этому оператору.)
--
foo --,
-- foo Уменьшение. Его действие противоположно действию оператора
увеличения. Например, если переменная а имеет значение 2, после
выполнения операции а — она будет иметь значение 1
>>
foo>> bar
Сдвиг разряда вправо. Выражение foo >> bar возвращает тот же
результат, что и выражение foo/2bar. Более подробно этот
оператор описан ниже в главе
<<
foo<< bar
Сдвиг разряда влево. Его действие противоположно действию оператора
>>. Более подробную информацию вы найдете далее в главе
Оператор ++
Набрав ++bar, вы даете указание вначале увеличить значение переменной bar. а затем его использовать. Рассмотрим это на таком примере:
int bar = 1 ;
Console::WriteLine(++bar.ToString());
Напротив, если вы наберете bar++, значение этой переменной вначале будет обработано, а затем увеличено. Например:
int bar = 1;
cout << bar++;
уменьшает значения переменных на единицу. (Ну хорошо, не всегда на единицу. В некоторых случаях, например при работе с указателями, значение может уменьшаться более чем на единицу. Но в основном значение уменьшается именно на число 1. Уф!)
Оператор »
16 >> 1 возвращает число 8;
16 >> 2 возвращает число 4;
16 >> 3 возвращает число 2;
15 >> 1 возвращает число 7;
15 >> 2 возвращает число 3.
Для внесения ясности рассмотрим действие оператора сдвига подробнее.
1 0 0 0 0
Если сдвинуть все биты вправо на одну позицию, получим число
0 1 0 0 0
В десятичной системе это число соответствует числу 8, поэтому выражение
16 >> 1
даст число 8.
Рассмотрим другой пример. Число 15 в двоичной системе счисления выглядит так:
0 1 1 1 1
Поэтому результатом операции
15 >> 2
будет число
0 0 0 1 1
В десятичной системе ему соответствует число 3.
Оператор «
16 <<" 1 возвращает число 32;
16 << 2 возвращает число 60.
cout << (16 << 2) << endl;
Истина и ложь в логических выражениях
(Например, нас могут интересовать такие вопросы: "Любит ли она меня?", "Есть ли деньги па моем счете?" или "Нажал ли пользователь клавишу Enter?". Почти всегда, когда нужно получить ответ на вопрос о выполнении какого-то условия, используются логические выражения. Обычно в программах истинность условий проверяется в выражениях, подобных этому:
Если логическое выражение возвращает нулевое значение, проверяемое условие считается ложным (т.е. оно не выполняется). Если возвращаемое значение отлично от нулевого, условие считается истинным (оно выполняется).
Оператор
Пример использования
Выполняемое действие
>
fоо > bar
Больше чем. Возвращает логическое значение true, если
значение слева больше значения справа. Например:
3 > 5 возвращает значение f a l s e;
3 > 1 возвращает значение t r u e;
3 > 3 возвращает значение f a l s e, поскольку три равно
трем, но не больше
>=
foo >= bar
Больше или равно. Возвращает логическое значение true,
если значение слева больше значения справа или равно ему.
Например:
3 >= 5 возвращает значение f a l s e;
3 >= 1 возвращает значение t r u e;
3 >= 3 возвращает значение t r u e, поскольку три равно
трем
<
foo < bar
Меньше чем. Возвращает логическое значение true, если
значение слева меньше значения справа. Например:
3 < 5 возвращает значение t r u e;
3 < 1 возвращает значение f a l s e;
3 < 3 возвращает значение f a l s e
<=
foo <= bar
Меньше или равно. Возвращает логическое значение true,
если значение слева меньше значения справа или равно
ему.
Например:
3 <= 5 возвращает значение t r u e;
3 <= 1 возвращает значение f a l s e;
3 <= 3 возвращает значение t r u e
==
foo == bar
Равенство. Возвращает логическое значение t r u e , если
значение слева равно значению справа.
Например:
1 == 2 возвращает значение f a l s e ;
1 == 1 возвращает значение t r u e
!=
foo != bar
He равно. Возвращает логическое значение t r u e , если
значение слева не равно значению справа.
Например:
1 != 2 возвращает значение t r u e ;
1 != 1 возвращает значение f a l s e
!
!foo
Не. Требует значение только одного аргумента. Если
аргумент имеет значение true, оператор возвращает
значение f a l s e .
Если аргумент имеет значение f a l s e ,
оператор возвращает значение t r u e .
Например:
! 1 возвращает значение f a l s e ;
! 0 возвращает значение t r u e
&&
foo && bar
Логическое И. Возвращает значение t r u e только в том
случае, если значению справа и значению слева
соответствуют значения t r u e .
Например:
1 && 1 возвращает значение t r u e ;
0 && 1 возвращает значение f a l s e ;
используется в выражениях наподобие: "Если есть
возможность && есть желание, тогда ..."
||
foo || bar
Логическое ИЛИ. Возвращает значение t r u e
в случае, если
хотя бы одному из проверяемых значений соответствует
значение t r u e .
Например:
1 || 0 возвращает значение t r u e ;
1 || 1 возвращает значение t r u e ;
0 || 0 возвращает значение f a l s e
Оператор присвоения
fltArea = PI * fltRadius * fltRadius;
Оператор присвоения можно использовать несколько раз в одном и том же выражении. Например, в приведенном ниже коде значение 0 (нуль) присваивается сразу нескольким переменным:
а = b = с = 0;
int a = 10;
объявлен для переменной.
А вот в следующей строке содержится ошибка:
int a = "Sasha";
if (а = 1)
а = а + 1;
if (a == 1)
а = а + 1;
if (a == 1)
а = а + 1;
if (1 == а)
а = а + 1;
if (1 = а)
а = a + 1;
Все об операторах
только одной переменной. Например, нужно прибавить какое-то число к общей сумме или умножить значение на какую-то константу.
foo = foo * 3;
bar = bar + 2;
foo = foo operator bar;
foo operator bar;
b = b + 1;
b += 1;
Оператор
Пример
Выполняемое действие
+=
foo += bar
Добавляет значение, указанное справа, к значению переменной,
указанной слева. Например, чтобы добавить к значению переменной
foo число 3, наберите foo += 3;
-=
foo -= bar
Отнимает от значения переменной, указанной слева, значение,
указанное справа. Например, чтобы вычесть из значения переменной
foo число 3, наберите
foo -= 3;
*=
foo *= bar
Умножает значение переменной, указанной слева, на значение,
указанное справа. Например, чтобы умножить значение переменной foo на число 3, наберите
foo *= 3;
/=
foo /= bar
Делит значение переменной, указанной слева, на значение, указанное
справа. Например, чтобы разделить значение переменной foo на число 3, наберите
foo /= 3;
%=
foo %= bar
Присваивает переменной, указанной слева, остаток, получаемый в
результате деления исходного значения этой переменной на значение,
указанное справа. Например, чтобы присвоить переменой foo
остаток, получаемый при делении ее значения на число 10, наберите
foo %= 10;
<<=
foo <<= bar
Выполняет сдвиг влево значения переменной, указанной слева, на
число битов, равное значению, указанному справа. Например, чтобы
сдвинуть значение переменной f oo на два бита влево, наберите
foo <<= 2;
>>=
foo >>= bar
Выполняет сдвиг вправо значения переменной, указанной слева, на
число битов, равное значению, указанному справа. Например, чтобы
сдвинуть значение переменной foo на два бита вправо, наберите
foo >>= 2;
&=
foo &= bar
Выполнение поразрядной операции И с присвоением полученного
результата переменной, указанной слева. Например, если переменная
foo имеет значение 10, то в результате выполнения следующего
выражения ей будет присвоено значение 2:
foo &= 2;
|=
foo |= bar
Выполнение поразрядной операции ИЛИ с присвоением полученного
результата переменной, указанной слева. Например, если переменная
foo имеет значение 10, то в результате выполнения следующего
выражения ей будет присвоено значение 11:
foo |= 1;
^=
foo ^= bar
Выполнение поразрядной операции ИСКЛЮЧИТЕЛЬНОЕ ИЛИ с
присвоением полученного результата переменной, указанной слева.
Например, если переменная foo имеет значение 10, то в результате
выполнения следующего выражения ей будет присвоено значение 8:
foo ^= 2;
Работа с битами
Для логических переменных, несмотря на то что они могут принимать только два значения — true и false , обычно выделяется столько же памяти, сколько и для числовых переменных. Допустим, вам нужно сохранить и обработать большое количество логических значений. В этом случае вы можете в значительной степени оптимизировать использование памяти, если для представления одного логического значения будете использовать только один бит памяти (вместо обычных 32 битов).
Например представим, что создаваемая программа должна сохранить и обработать результаты опроса 10 000 респондентов, каждому из которых будет задано 32 вопроса, требующих ответа "нет" или "да". Если вы используете для этого обычные логические значения, для которых памяти нужно столько же, сколько для представления обычных чисел, программа потребует для своего выполнения столько памяти, сколько нужно для представления 10 000 х 32 (320 000) чисел. Это даже больший объем памяти, чем имели некоторые первые компьютеры!
Оператор
Пример
Выполняемое действие
~
~ fоо
Побитовое НЕ. Нули меняются на единицы и наоборот.
Например:
~1011 даст 0100
<<
foo << bar
Сдвиг влево на указанное количество битов.
Например:
1011 « 2 даст 1100
(см. также табл. 10.2)
>>
foo >> bar
Сдвиг вправо на указанное количество битов.
Например:
1011 » 2 даст 0010
(см. также табл. 10.2)
&
foo & bar
Побитовое И. Если биту в значении слева и биту под тем же номером в
значении справа соответствует единица, возвращается единица. Во всех
остальных случаях возвращается нуль.
Например:
1011 & 1010 даст 1010
|
foo | bar
Побитовое ИЛИ. Если биту в значении слева или биту под тем же
номером в значении справа соответствует единица, возвращается
единица. В противном случае возвращается нуль.
Например:
1011 I 1010 даст 1011
^
foo ^ bar
Побитовое ИСКЛЮЧИТЕЛЬНОЕ ИЛИ. Только если одному из
сравниваемых битов соответствует единица, а второму- нуль,
возвращается единица. В остальных случаях возвращается нуль.
Например:
1011 л 1010 даст0001
Условный оператор
оператор IF, который вы могли видеть в электронных таблицах. Оператору if требуются три
выражения. Вначале оценивается первое выражение. Если ему соответствует значение t r u e ,
возвращается результат, получаемый при обработке второго выражения, если f a l s e — ре-
зультат, получаемый при обработке третьего выражения.
В электронных таблицах синтаксис оператора IF выглядел так:
IF (expr1, expr2, ехрrЗ)
Это означало следующее: если выражение expr1 истинно, вернуть значение ехрг2, в
противном случае вернуть значение ехргЗ.
В языке C++ то же самое записывается несколько иначе:
expr1 ? expr2 : ехргЗ
Таким образом, для карточной игры можно было бы набрать нечто подобное:
UserMessage = (Очки > 21) ? "Перебор!" : "Еще карту?";
Приоритет операторов
При обработке математических выражений компьютер придерживается тех же правил,
которые вы учили в школе (и, возможно, уже забыли). Выражения обрабатываются слева направо, но все же некоторые операторы обрабатываются в первую очередь. Например, результатом выражения 3 + 2 x 3 будет число 9. Почему? Потому что оператор умножения имеет больший приоритет, чем оператор сложения, следовательно, вначале два умножается на три и только потом к полученному числу прибавляется три. Если бы приоритет операторов не учитывался и выражение просто вычислялось бы слева направо, мы получили бы число 15.
Те операторы, которые расположены в одной и той же строке таблицы, имеют одинаковый приоритет, поэтому если в выражении они стоят рядом, то вычисляются по очереди слева направо. Например, 3 x 4 / 2 равнозначно ( 3 x 4 ) / 2.
Приоритет
Операторы
Высший приоритет
()
++ -- ~ !
* / %
+ -
>> <<
< <= > >=
== !=
&
^
|
&&
||
Низший приоритет
?:
набранном выражении, всегда добавляйте круглые скобки, чтобы убедиться, что
вычислен будет именно тот результат, который вам нужен.
Двоичная и десятичная системы счисления
представляется как 100+ 20+ 5 или, что то же самое, как 1 х 102 +2x101 +5 х 100. (Со школы вы наверное еще помните, что любое число в нулевой степени равно единице.)
двоичное число 1101 расшифровывается как 1 х 23 + 1 х 22 + 0 х 21 + 1 х 20. Если перевести это в десятичную систему счисления, то получим 8 + 4 + 0 + 1, или просто число 13.
Поскольку двоичные числа не очень удобны (они слишком длинные), иногда используется шестнадцатеричная система счисления. В этой системе каждая позиция в числе может быть представлена 16 цифрами. Четыре бита объединяются для представления одной шестнадцатеричной цифры, которая называется гексит.
Примеры работы операторов
ниже примеры.
dblArea = PI * dblRadius * dblRadius;
известны налоговая ставка и сумма, вырученная от продажи.
dblTax = dblPurchase * dblTaxRate;
себя налог на продаваемые товары, объем которого был вычислен во втором примере.
dblPrice = (1 + dblTaxRate) * dblPurchase;
меньше цены, его значение увеличивается на 500.
DblCreditLimit = (dblPrice > dblCreditLimit) ?
blCreditLimit + 500 : dblCreditLimit;
Математические функции
Функция
Пример использования
Выполняемое действие
Abs
Math::Abs(-4)
Возвращает абсолютное значение числа (модуль)
Ceil
Math::Ceil(4.2)
Округление до ближайшего большего целого.
Например,
применив эту функцию к числу 4.2, получим число 5
Cos
Math::Cos
(.03)
Возвращает косинус числа.
Число выражается в радианах
Е
Math::E
Возвращает значение числа е,
которое основано на
вычислении натурального логарифма и равно
приблизительно 2,718
Exp
Math::Exp(4)
Возвращает результат вычисления еn,
где вместо n
используется аргумент функции
Floor
Math::Floor(4.2)
Округляет число до ближайшего меньшего целого.
Например, если аргументом является число 4.2,
возвращается число 4
Log
Math::Log(4)
Возвращает значение натурального логарифма для
указанного числа
Max
Math::Max
(4.5 , 3.2)
Возвращает большее из двух чисел
Min
Math::Min(4.5 , 3.2)
Возвращает меньшее из двух чисел
PI
Math::PI
Возвращает значение числа пи,
которое равно
приблизительно 3,141592
Pow
Math::Pow(4,2)
Возвращает число хn,
где х - это первый аргумент, n -
второй. В данном случае (4,2) даст число 16
Round
Math::Round(4.2)
Округляет число до ближайшего целого.
Например,
число 4.2 будет округлено до числа 4, а число 4.8 - до
числа 5
Sin
Math::Sin(.03)
Возвращает синус числа.
Число представляется в
радианах
Sqrt
Math::Sqrt(4)
Возвращает квадратный корень числа
Tan
Math::Tan(.03)
Возвращает тангенс числа.
Число представляется в радианах
// CircleArea4
// Computes the area of a circle given the radius
// Uses math functions
#using <mscorlib.dll>
using namespace System;
class CircleInfo
{
double dblRadius;
double dblArea;
#ifdef _UNICODE
int wmain(void)
#else
int main(void)
#endif
{
Console::WriteLine(S"What is the radius?");
//Read in the radius and convert to a floating point number
oCircle.dblRadius = Double::Parse(Console::ReadLine());
oCircle.dblArea = Math::PI*oCircle.dblRadius*oCircle.dblRadius;
//Write out the result
//Note that we must convert the area into a string to do so
Console::WriteLine(S"The circle's area is
{0} units.", oCircle.dblArea.ToString());
Console::WriteLine(S"And in case you were wondering,
Console::WriteLine(S"Hit the enter key to stop the program");
Console::ReadLine();
Старый формат математических
функций
написании программ .NET, используются также и при написании стандартных программ
C++. Эти функции являются составной частью библиотеки math, которая подключается
таким кодом:
Помните, что их использование уместно только при написании неуправляемых программ.
Функция
Пример использования
Выполняемое действие
abs
abs(-4)
Возвращает абсолютное значение числа (модуль)
ceil
ceil (4.2)
Округление до ближайшего большего целого
cos
cos(.03)
Возвращает косинус числа.
Число выражается в радианах
exp
exp(4)
Возвращает результат вычисления еn
floor
floor(4.2)
Округляет число до ближайшего меньшего целого
log
log (4)
Возвращает значение натурального логарифма для указанного
числа
pow
pow(4,2)
Возвращает число хn,
где х- это первый аргумент, n-
второй
sin
sin(.03)
Возвращает синус числа.
Число представляется в радианах
sqrt
sqrt(4)
Возвращает квадратный корень числа
tan
tan(.03)
Возвращает тангенс числа.
Число представляется в радианах
Содержание