Назад | Начало урока | Вперед
Содержание

Глава 10

Выразите свои желания

В этой главе вы узнаете...

Программы обрабатывают данные, и одним из видов такой обработки является выполнение различных вычислений. Указание провести вычисления (которое записывается в виде формулы), в языке Visual C++ .NET называется выражением. Если вы знакомы с электронными таблицами (например, Excel), то наверняка уже имеете опыт использования выражений: каждый раз, набирая формулы в ячейках, вы набирали выражения.

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

Вверх

Можно ли «выражаться»?

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

oCircle.dblArea = PI * oCircle.dblRadius * oCircle.dblRadius;

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

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

2 + 2
3.14159 * Radius * Radius
ОстатокНаСчете < Лимит

Как видите, без помощи выражений вы не сможете даже сложить двух чисел!

Вверх

Простые операторы

В табл. 10.1 приведен список из пяти операторов, наиболее часто используемых при построении выражений. Оператором называется математический символ, указывающий, какое действие необходимо произвести для получения результата. Например, в выражении 4+5 оператором будет знак +.

Таблица 10.1. Математические операторы

Оператор Пример Выполняемое действие
* 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

Вычисление остатка от деления часто используется для того, чтобы не позволить значениям выходить из заданного диапазона. Например предположим, что вы создаете программу, которая перемещает фигурку космического корабля вдоль нижней части экрана (как в игре Space Invaders, если вы ее видели).

Для того чтобы корабль, залетая за правую часть экрана, появлялся с левой стороны, используйте оператор вычисления остатка от деления. Допустим, экран имеет в ширину 10 единиц и pos — это позиция фигурки корабля, тогда результат операции pos % 10 всегда будет принадлежать диапазону от 0 до 9, независимо от того, какое значение имеет переменная pos. Теперь, когда корабль достигает позиции 9 (крайняя справа), к ее значению прибавляется число 1, чтобы перейти в следующую позицию (корабль пропадает с экрана), далее позиция вычисляется как результат выражения pos % 10, получаем число 0, и корабль отображается в позиции 0 (крайняя слева).

Вверх

Более сложные операторы
  • Оператор ++
  • Оператор »
  • Оператор «

    Операторы, показанные в табл. 10.2, несколько сложнее, чем операторы, приведенные в табл. 10.1. На данном этапе вы, наверное, могли бы обойтись и без них. Но по мере приобретения опыта создания программ вы оцените эти операторы по достоинству и с удовольствием будете их использовать. Некоторые из этих "сложных" операторов рассмотрены ниже в отдельных разделах этой главы. (Вы, наверное, подумаете: "Неужели они настолько сложные, что для их описания нужно выделять отдельные разделы?!".)

    Таблица 10.2. Операторы увеличения, уменьшения и сдвига

    Оператор Пример Выполняемое действие
    ++ foo++,
    ++foo
    Увеличение. Добавляет число 1 к значению элемента. Например, если переменная nAge имеет значение 2, то после выполнения операции nAge++ она будет иметь значение 3. (Кстати, свое название язык C++ получил благодаря этому оператору.)
    -- foo --,
    -- foo
    Уменьшение. Его действие противоположно действию оператора увеличения. Например, если переменная а имеет значение 2, после выполнения операции а — она будет иметь значение 1
    >> foo>> bar Сдвиг разряда вправо. Выражение foo >> bar возвращает тот же результат, что и выражение foo/2bar. Более подробно этот оператор описан ниже в главе
    << foo<< bar Сдвиг разряда влево. Его действие противоположно действию оператора >>. Более подробную информацию вы найдете далее в главе

    Вверх

    Оператор ++

    Этот оператор не так прост, как может вначале показаться, поскольку степень увеличения зависит от типа переменной, значение которой увеличивается. Например, если у вас есть указатель на переменную fоо и значение переменной foo занимает четыре байта, то оператор увеличения, примененный к указателю, увеличит его значение на число 4. поскольку именно в этом случае указатель будет ссылаться на следующее значение после значения переменной foo. Сложновато, не так ли? Более детальную информацию об указателях вы можете найти в главе 13.

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

    int bar = 1 ;
    Console::WriteLine(++bar.ToString());

    В этом случае значение переменной bar будет увеличено на число 1, и на экране будет отображено число 2 (новое значение переменной bar).
    Напротив, если вы наберете bar++, значение этой переменной вначале будет обработано, а затем увеличено. Например:

    int bar = 1;
    cout << bar++;

    В этом случае значение переменной bar будет увеличено на единицу, но на экране будет отображено ее старое значение (число 1), поскольку увеличение происходит после отображения значения переменной. (В первом примере для отображения значения использован управляемый код, а во втором — старый неуправляемый код С++.)

    Оператор ++ часто используется в циклах для отсчета количества итераций. (Вам это непонятно? Не переживайте. Эти вопросы подробно обсуждаются в главе 11.)

    Оператор -- работает по тому же принципу, что и ++, с той лишь разницей, что он
    уменьшает значения переменных на единицу. (Ну хорошо, не всегда на единицу. В некоторых случаях, например при работе с указателями, значение может уменьшаться более чем на единицу. Но в основном значение уменьшается именно на число 1. Уф!)

    Вверх

    Оператор »

    Оператор сдвига очень полезен при работе с двоичными числами. Вот некоторые примеры его использования:

    16 >> 1 возвращает число 8;
    16 >> 2 возвращает число 4;
    16 >> 3 возвращает число 2;
    15 >> 1 возвращает число 7;
    15 >> 2 возвращает число 3.

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

    Число 16, например, в двоичном виде выглядит так:
    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.

    Если получаемое число превышает максимально допустимое значение переменной, сдвигаемые влево биты обрезаются. Например, если для значения переменной зарезервировано только 8 бит памяти и вы сдвигаете исходное значение на 8 бит влево, то в результате получите число 0 (нуль). Это произойдет потому, что все биты исходного значения были сдвинуты за пределы переменной и обрезаны.

    Обратите внимание, что оператор << выглядит точно так же, как символы <<, используемые вместе с командой cout. (Напомним, что cout является неуправляемым оператором языка C++, который используется для отображения данных на экране.) Если вы попытаетесь использовать оператор cout для отображения результата выполнения операции сдвига влево, его символы << будут иметь приоритет перед такими же символами оператора сдвига, из-за чего будет отображен не тот результат, который вам нужен (дело в том, что выражения обрабатываются слева направо и команда cout << будет обработана первой).

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

    cout << (16 << 2) << endl;

    Вверх

    Истина и ложь в логических выражениях

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

    Теперь же вы познакомитесь с логическими выражениями. Логические выражения используются не для вычисления какого-то конкретного результата, а для определения ложности или истинности проверяемого условия.
    (Например, нас могут интересовать такие вопросы: "Любит ли она меня?", "Есть ли деньги па моем счете?" или "Нажал ли пользователь клавишу Enter?". Почти всегда, когда нужно получить ответ на вопрос о выполнении какого-то условия, используются логические выражения. Обычно в программах истинность условий проверяется в выражениях, подобных этому:

    "Если проверяемое условие истинно, выполните вот этот набор инструкций".
    Если логическое выражение возвращает нулевое значение, проверяемое условие считается ложным (т.е. оно не выполняется). Если возвращаемое значение отлично от нулевого, условие считается истинным (оно выполняется).

    В языке C++ логические выражения используются настолько часто, что для представления возвращаемых ими результатов предусмотрен даже отдельный тип данных: bool. У этого типа данных есть только два значения, для представления которых специально зарезервированы два ключевых слова: true (Истина) и false (Ложь).

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

    Отсюда происходит их название: логические операторы. В следующей Главе описано, как логические операторы могут использоваться для определения условий, проверяемых условными операторами (такими, например, как оператор i f ) .

    Таблица 10.3. Операторы сравнения (или логические операторы)

    Оператор Пример использования Выполняемое действие
    > 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";

    Переменная а может принимать только числовые значения типа integer (int). в то время как предпринимается попытка присвоить ей текстовое значение Sasha. Компилятор C++ будет с этим не согласен,

    Не путайте оператор присвоения с оператором равенства

    Обратите внимание, что логический оператор равенства == отличается от оператора присвоения =. Оператор присвоения (=) присваивает переменной, указанной слева, значение, расположенное справа. Оператор равенства (==) проверяет, совпадает ли значение, расположенное слева, со значением, расположенным справа, но при этом ни одно из значений не изменяется. Использование оператора = в тех местах, где подразумевается использование оператора ==, является довольно распространенной ошибкой, - способной повлечь за собой серьезные проблемы.

    Например, в результате выполнения приведенного ниже кода переменной а всегда будет присваиваться значение 2. Это будет происходить потому, что при проверке условия оператора if переменной а присваивается значение 1, а поскольку числу 1 соответствует логическое значение true , инструкция условного оператора а = а + 1 будет выполняться:

    if (а = 1)
    а = а + 1;

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

    if (a == 1)
    а = а + 1;

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

    if (a == 1)
    а = а + 1;

    наберите код

    if (1 == а)
    а = а + 1;

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

    if (1 = а)
    а = a + 1;

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

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

    Вверх

    Все об операторах

    Довольно часто возникает необходимость совершить какое-то действие в отношение
    только одной переменной. Например, нужно прибавить какое-то число к общей сумме или умножить значение на какую-то константу.

    Конечно, это можно сделать, набрав выражение наподобие такого:

    foo = foo * 3;
    bar = bar + 2;

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

    foo = foo operator bar;

    можно заменить эквивалентным ему выражением

    foo operator bar;

    Например, вместо выражения

    b = b + 1;

    можно набрать

    b += 1;

    В табл. 10.4 приведен список всех специальных операторов присвоения и описаны выполняемые ими действия.

    Таблица 10.4. Специальные операторы присвоения

    Оператор Пример Выполняемое действие
    += 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;

    Вверх

    Работа с битами

    Для сохранения одного числа используется некоторое количество битов. Например, для числа типа integer (int) выделяется 32 бита памяти. Количество битов, выделяемых для переменной, определяет максимальное значение, которое она может принять.
    Для логических переменных, несмотря на то что они могут принимать только два значения — true и false , обычно выделяется столько же памяти, сколько и для числовых переменных. Допустим, вам нужно сохранить и обработать большое количество логических значений. В этом случае вы можете в значительной степени оптимизировать использование памяти, если для представления одного логического значения будете использовать только один бит памяти (вместо обычных 32 битов).
    Например представим, что создаваемая программа должна сохранить и обработать результаты опроса 10 000 респондентов, каждому из которых будет задано 32 вопроса, требующих ответа "нет" или "да". Если вы используете для этого обычные логические значения, для которых памяти нужно столько же, сколько для представления обычных чисел, программа потребует для своего выполнения столько памяти, сколько нужно для представления 10 000 х 32 (320 000) чисел. Это даже больший объем памяти, чем имели некоторые первые компьютеры!

    Если же для сохранения одного ответа вы будете использовать только один бит, ситуация меняется кардинальным образом. Действительно, если ответа может быть только два, 0 можно использовать для представления отрицательного ответа, а 1 — для положительного. Тогда нулевой бит числа можно использовать для хранения информации об ответе на первый вопрос, первый бит— для хранения информации об ответе на второй вопрос и т.д. (нумерация битов начинается с нулевого). Таким образом, каждая числовая переменная может хранить данные об ответе на 32 вопроса (так как в ее распоряжении есть 32 бита памяти) и ваша программа уже будет требовать для своего выполнения память в объеме, необходимом для хранения 10 000 чисел. Экономия существенная, не так ли?

    Если вы используете числа именно таким образом, это называется созданием битовых полей. В табл. 10.5 описаны операторы, которые позволяют обрабатывать значения переменных на уровне битов (в таблице обрабатываемые значения и получаемые результаты представлены в двоичном виде).

    Таблица 10.5. Побитовые операторы

    Оператор Пример Выполняемое действие
    ~ ~ 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, который вы могли видеть в электронных таблицах. Оператору 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 + 2) х 3. В этом случае вначале будет обработан тот оператор, который заключен в скобки, т.е. оператор сложения, и только потом полученное число будет умножено на три.

    В табл. 10.6 представлен список операторов с учетом их приоритета, Те операторы, которые указаны выше, обрабатываются раньше, чем расположенные ниже (другими словами, они имеют больший приоритет). Например, оператор + имеет больший приоритет, чем оператор >. Поэтому, выражение 1 + 0 > 1 равнозначно выражению (1 + 0) > 1. Но сами по себе, как вы понимаете, эти выражения ложны.
    Те операторы, которые расположены в одной и той же строке таблицы, имеют одинаковый приоритет, поэтому если в выражении они стоят рядом, то вычисляются по очереди слева направо. Например, 3 x 4 / 2 равнозначно ( 3 x 4 ) / 2.

    Таблица 10.6. Приоритет операторов

    Приоритет Операторы
    Высший приоритет ()
    ++ -- ~ !
    * / %
    + -
    >> <<
    < <= > >=
    == !=
    &
    ^
    |
    &&
    ||
    Низший приоритет ?:

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

    Вверх

    Двоичная и десятичная системы счисления

    Если вы не занимались раньше программированием, упоминания о двоичных числах и побитовых операциях могут поставить вас в затруднительное положение. Система счисления, которой мы пользуемся в повседневной жизни и к которой привыкли, называется десятичной. Каждая цифра десятичного числа, в зависимости от своей позиции, означает единицы, десятки, сотни, тысячи и т.д. Например, число 125
    представляется как 100+ 20+ 5 или, что то же самое, как 1 х 102 +2x101 +5 х 100. (Со школы вы наверное еще помните, что любое число в нулевой степени равно единице.)

    Компьютер не может представлять числа с использованием десяти различных цифр. Так как он может различать информацию только в формате "да-нет", каждая позиция в числе может быть представлена только одной из двух цифр: нулем и единицей. Числа, представленные с помощью нулей и единиц, называются двоичными. Каждая цифра такого числа называется битом (или двоичной цифрой). Например,
    двоичное число 1101 расшифровывается как 1 х 23 + 1 х 22 + 0 х 21 + 1 х 20. Если перевести это в десятичную систему счисления, то получим 8 + 4 + 0 + 1, или просто число 13.

    Для хранения одного числа компьютер использует набор из восьми битов, который обозначается термином байт. Один байт может представить 256 (или 28) уникальных значений. Два байта, объединенные вместе для представления одного значения, называются словом. Слово имеет в своем распоряжении 16 битов и может уже представить 65 536 (или 216) уникальных значений. Четыре байта (32 бита) образуют двойное слово.

    Для тех, кто имеет отношение к компьютерам, число 210 является ключевым. Это 1024 байта, или килобайт памяти (К). Хотя приставка кило обозначает тысячу, в мире компьютерных технологий она обозначает число 1024. Таким образом, например, 64К означает 64 х 1024, или 65 536 байт памяти.

    Точно так же, хотя приставка мега (M в обычном мире означает миллион, для компьютерщиков это число 1024x1024, или 1048 576.
    Поскольку двоичные числа не очень удобны (они слишком длинные), иногда используется шестнадцатеричная система счисления. В этой системе каждая позиция в числе может быть представлена 16 цифрами. Четыре бита объединяются для представления одной шестнадцатеричной цифры, которая называется гексит.

    Поскольку гексит может принимать значения от 0 до 15, для представления цифр, обозначаемых десятичными числами от 10 до 15 используются первые шесть букв латинского алфавита (от А до F). Другими словами, буква А обозначает 10, В- 11 и т.д. Если вам нужно набрать шестнадцатеричное число в кодах C++, начните его с приставки Ох. Так, число ОхОА соответствует десятичному числу 10, а число OxFF - десятичному числу 255. Если среди ваших знакомых есть хакер, помешанный на языках программирования, спросите, сколько ему лет в шестнадцатеричной системе, и он не задумываясь ответит.

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

    Вверх

    Примеры работы операторов

    Чтобы получить лучшее представление о работе операторов, просмотрите приведенные
    ниже примеры.

    Пример 1. Вычисление площади круга.

    dblArea = PI * dblRadius * dblRadius;

    Пример 2. Вычисление объема налога, которым облагаются продаваемые товары, если
    известны налоговая ставка и сумма, вырученная от продажи.

    dblTax = dblPurchase * dblTaxRate;

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

    dblPrice = (1 + dblTaxRate) * dblPurchase;

    Пример 4. Сравнивается значение кредитного лимита с ценой товара, и, если лимит
    меньше цены, его значение увеличивается на 500.

    DblCreditLimit = (dblPrice > dblCreditLimit) ?
    blCreditLimit + 500 : dblCreditLimit;

    Вверх

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

    Во всех выражениях, с которыми вы сталкивались до этого, использовались только самые простые операторы. Но предположим, вам нужно вычислить что-то более серьезное и специфическое, связанное, например, с тригонометрическими операциями. Средство языка Visual C++, обозначаемое термином CLR (Common Language Runtime), предоставляет вам возможность использования целого набора математических функций для проведения специальных вычислений. Все они принадлежат классу Math. Наиболее часто используемые из них представлены в табл. 10.7.

    Таблица 10.7. Математические функции

    Функция Пример использования Выполняемое действие
    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

    #include "stdafx.h"
    #using <mscorlib.dll>
    using namespace System;

    //Set up a structure for storing information about circles
    class CircleInfo
    {

    public:
    double dblRadius;
    double dblArea;
    };

    // This is the entry point for this application
    #ifdef _UNICODE
    int wmain(void)
    #else
    int main(void)
    #endif
    {

    CircleInfo oCircle;

    //Ask for the size of the radius
    Console::WriteLine(S"What is the radius?");

    //Read in the radius and convert to a floating point number
    oCircle.dblRadius = Double::Parse(Console::ReadLine());

    //Calculate the area of the circle
    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());

    //And now do some gratuitous math
    Console::WriteLine(S"And in case you were wondering,

    the square root of the radius is {0}", Math::Sqrt(oCircle.dblRadius).ToString());

    //Hang out until the user is finished
    Console::WriteLine(S"Hit the enter key to stop the program");
    Console::ReadLine();

    return 0;

    }

    Код программы в файле CircleArea5

    Вверх

    Старый формат математических
    функций

    В действительности все основные математические функции, которые доступны при
    написании программ .NET, используются также и при написании стандартных программ
    C++. Эти функции являются составной частью библиотеки math, которая подключается
    таким кодом:

    #include <math.h>

    В табл. 10.8 представлены наиболее часто используемые функции библиотеки : math.
    Помните, что их использование уместно только при написании неуправляемых программ.

    Таблица 10.8. Математические функции языка C++

    Функция Пример использования Выполняемое действие
    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) Возвращает тангенс числа. Число представляется в радианах

    Назад | Начало урока | Вверх | Вперед
    Содержание