Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Сейчас positive содержит -25536
сейчас big_positive содержит -294967296 сейчас little_positive содержит Т
Как видите, программа присваивает переменным типа int, long и char значения, которые находятся вне диапазона хранения каждого типа, поэтому возникает ошибка переполнения. При работе с переменными вам необходимо помнить диапазон значений, которые может хранить переменная каждого типа. Ошибки переполнения плохо уловимы, и поэтому их трудно определить и исправить. Обратите внимание на значение, которое программа выводит для переменной little_positive. Поскольку это переменная типа char, выходной поток cout пытается вывести ее значение в символьном виде. В этом случае выведенное значение соответствует второй половине таблицы ASCII со значением 210. 1.5.9. Представление о точности В предыдущем разделе вы узнали, что ошибки переполнения возникают при присваивании переменной значения, которое находится вне диапазона значений для переменной данного типа. Подобно этому вам также необходимо знать, что компьютеры не могут обеспечить неограниченную точность при хранении чисел. Например, при работе с числами с плавающей точкой (числа с десятичной точкой) компьютер не всегда может представить число с требуемой точностью. Поэтому возможны ошибки округления, которые тяжело обнаружить. Программа в примере 4.14 присваивает значение чуть меньше 0.5 переменным типа float и double. К сожалению, поскольку компьютер обладает ограниченной способностью в представлении чисел, переменные реально содержат не присваиваемые им значения, а число 0.5: Пример 4.14
#include < iostream.h> void main(void) {
Когда вы откомпилируете и запустите эту программу, на вашем экране появится следующий вывод: Значение типа float 0.49999990 равно 0.5 Значение типа double 0.49999990 равно 0.5
Как видите, значения, присваиваемые программой переменным, и значения, которые переменные содержат в действительности, не идентичны. Такие ошибки округления происходят потому, что компьютер должен представлять числа, используя фиксированное количество единиц и нулей. В большинстве случаев компьютер может точно представлять числа. Однако иногда, как показано в этой программе, компьютер представляет числа приближенно, а не точно. При программировании вам необходимо всегда помнить о точности. В зависимости от значений, с которыми работают ваши программы, могут возникать трудно обнаруживаемые ошибки округления. 1.5.10. Следите за ошибками переполнения при арифметических операциях Из раздела 1.7.7 вы узнали, что, если вы присваиваете переменной значение, которое не входит в диапазон значений для данного типа переменной, возникает ошибка переполнения. При выполнении арифметических операций необходимо помнить о возможности возникновения ошибок переполнения в процессе вычислений. Например, программа в примере 4.15 умножает 200 на 300 и присваивает результат переменной типа int. Однако, поскольку результат умножения (60000) превышает наибольшее возможное значение для типа int (32767), возникает ошибка переполнения. Пример 4.15 #include < iostream.h> void main(void) { Когда вы откомпилируете и запустите эту программу, на экране появится следующий вывод: 200 * 300 = -5536 1.6. Константы Константы , так же как и переменные, представляют собой область памяти для хранения данных с тем лишь отличием, что значение, присвоенное константе первоначально, не может быть изменено на протяжении выполнения всей программы. Константы бывают литеральными и типизованными, причем литеральные константы делятся на: символьные, строковые, целые и вещественные. Символьные константы представляются отдельным символом, заключенным в одинарные кавычки (апострофы): 'е', '@', '< ' Строковые константы - это последовательность символов, заключенная в двойные кавычки: " Это пример не самой длинной строковой константы! 11. Целые константы бывают следующих форматов: ■ десятичные; ■ восьмеричные: ■ шестнадцатеричные. Десятичные могут быть представлены как последовательность цифр, начинающаяся не с нуля, например: 123; 2384. Восьмеричные константы - последовательность восьмеричных цифр (от 0 до 7), начинающаяся с нуля, например: 034; 047. Шестнадцатеричный формат констант начинается с символов Ох или ОХ с последующими шестнадцатеричными цифрами (0…9.A…F), например: 0xF4; 0X5D. Буквенные символы при этом могут быть представлены в любом регистре. Длинные целые константы, используемые в переменных типа long, определяются буквой 1 или L сразу после константы без пробела: 36L, 012L, 0x52L. Вещественные константы - числа с плавающей запятой могут быть записаны в десятичном формате (24.58; 13.0; .71) или в экспоненциальной форме (1е4; 5е+2; 2.2е-5, при этом в мантиссе может пропускаться целая или дробная часть: .2е4). Типизованные константы используются как переменные, значение которых не может быть изменено после инициализации. Типизованная константа объявляется с помощью ключевого слова const, за которым следует указание типа константы, но, в отличие от переменных, константы всегда должны быть инициализированы. Символьные константы в С++ занимают в памяти 1 байт и, следовательно, могут принимать значения от 0 до 255 (см. табл. 4.2). При этом существует ряд символов, которые не отображаются при печати, - они выполняют специальные действия: возврат каретки, табуляция, и называются символами escape-последовательности. Термин мescape-последовательность" ввела компания Epson, ставшая первой фирмой, которая для управления выводом информации на своих принтерах стала использовать неотображаемые символы. Исторически сложилось так, что управляющие последовательности начинались с кода с десятичным значением 27 (0x1В), что соответствовало символу " Escape" кодировки ASCII. Escape-символы в программе изображаются в виде обратного слеша, за которым следует буква или символ. Таблица 4.8. Символы escape-последовательности
В качестве примера использования типизованных и литеральных констант вычислим значение площади круга по известному значению радиуса. Пример 4.16. #include < iostream.h> int main () { const double pi = 3.1415; const int Radius = 3; double Square =0; Square = pi * Radius * Radius; cout < < Square < < '\n'; return 0; }
В начале главной функции программы объявляются две константы: pi и Radius. Значение переменной Square изменяется в ходе выполнения программы и не может быть представлено как константа. Поскольку значение радиуса задано явно и в тексте программы не предусмотрено его изменение, переменная Radius объявлена как константа.
1.7. Перечисления При использовании большого количества логически взаимосвязанных констант удобно пользоваться перечислениями. Перечисления имеют вид: enum Name {iteml[=def], item2[=def], ... itemN[=def ] }; где enum - ключевое слово (от enumerate - перечислять), Name - имя списка констант, iteml...itemN - перечень целочисленных констант, [=def] - необязательный параметр инициализации.
Предположим, нам необходимо в программе описать работу светофора. Известно, что его цвет может принимать лишь 3 значения: красный (RED), желтый (YELLOW) и зеленый (GREEN). Для обработки полученных от светофора сигналов заведем три константы с такими же именами - RED, YELLOW и GREEN, проинициализировав их любыми неповторяющимися значениями с тем, чтобы в дальнейшем проверять, какой из этих трех цветов горит. Например, мы могли бы записать. Пример 4.17. const int RED = 0; const int YELLOW =1; const int GREEN = 2;
Используя перечисления, то же самое можно сделать в одну строку: enum COLOR {RED, YELLOW, GREEN};
Константы перечисления обладают следующей важной особенностью: если значение константы не указано, оно на единицу больше значения предыдущей константы. По умолчанию первая константа имеет значение 0. То же перечисление можно было проинициализировать другими значениями: enum COLOR {RED=13, YELLOW=l, GREEN}; При этом константа GREEN по-прежнему имеет значение 2.
1.8. Выражения Выражение в С++ представляет собой последовательность операторов, операндов и знаков пунктуации, воспринимаемую компилятором как руководство к определенному действию над данными. Всякое выражение, за которым идет точка с запятой, образует предложение или инструкцию языка: выражение; На практике возможны также случаи, когда сами операнды в выражениях могут быть представлены выражениями. Приведем примеры предложений языка: х = 3 * (у + 2.48); у = My_Func (dev, 9, i);
Выражение - это строка, составленная по определенным правилам из операндов, операций и предназначенная для получения значения. Например, 3+6/2*d.
Выражение называется константным, если его операндами являются только константы, например, 67-234.
По числу операндов, участвующих в операции, различают унарные (один операнд) и бинарные (два операнда) операции. Пример унарной операции -унарный минус (изменение знака числа); пример бинарной операции -*(умножение). По типу выполняемой операции различают арифметические, сдвига, поразрядные логические, логические, операции отношения и др. Из констант, переменных, разделителей и знаков операций можно конструировать выражения. Каждое выражение представляет собой правило вычисления нового значения. Каждое выражение состоит из одного или нескольких операндов, символов операций и ограничителей. Если выражение формирует целое или вещественное число, то оно называется арифметическим. Пара арифметических выражений, объединенная операцией сравнения, называется отношением. Если отношение имеет ненулевое значение, то оно – истинно, иначе – ложно. 1.9. Правила записи выражений Во избежание ошибок выражения в языке С++ должны записываться по определенным правилам. Приведем их. 1. Запись выражений ведется на одном уровне, в одну строчку, для 2. Не должно быть никаких надстрочных и подстрочных индексов. Это обеспечивается за счет соответствующего выбора идентификаторов. По- то они могут быть идентифицированы в С++, следующим образом: hx, xn, y0, zmn, fstrich, x1. 3. В отличие от обычной математической записи, в которой многие знаки операций предполагаются по умолчанию, в выражениях языка C++ необходимо проставлять все знаки операций, в частности знак умножения. Например, выражение (А + В) (X + У) бессмысленно: оно должно быть записано в виде (А + В)* (X + Y). Если вместо А*В написать АВ, то транслятор воспримет это выражение не как произведение переменных А и В, а как новую переменную (идентификатор) АВ, состоящую из двух символов. 4. Два символа операций не должны стоять рядом. Поэтому А*-В является бессмысленным, но А*(-В) допустимо. Выражение вида X + 3*- 7+4 необходимо представить в виде X + 3*(-7) + 4. Замечание: для операций инкремента и присваивания в С++ есть исключения из этого правила. 5. При записи выражений разрешается использовать только круглые 6. Количество круглых скобок при записи неограниченно, но необходимо следить, чтобы количество левых (открывающих) и правых (закрывающих) круглых скобок было одинаковым. 7. Скобки используются для указания желаемой очередности выполнение операций так же, как и в обычной математической записи. Поэтому оба выражения А - В + С и А - (В + С) допустимы, но означают не одно и то же. 8. В сомнительных случаях порядок выполнения операций в выражениях следует доопределять с помощью скобок. Так, выражение должно 9. Рекомендуется в выражениях по возможности не смешивать различные типы операндов, хотя это и допускается. Это связано с тем, что 10. Если выражение не помещается на одной строке бланка для записи программы, то его продолжают на следующих строках бланка, при А + В; либо в виде А + В; Из приведенных записей видно, что знак + ставится только один раз (в одной из строк), а не дважды, как это принято в математике. Перенос выражений лучше осуществлять на месте знаков операций или круглых скобок. Но не следует разрывать при переносе идентификаторы, константы, указатели функций, ключевые слова и составные знаки операций. Признаком конца выражения служит знак точка с запятой "; ". 11. При записи выражения в программе между идентификаторами, знаками операций и круглыми скобками разрешается ставить пробелы (хотя это обычно не делается). При изображении составных символов операций (например, ||, & & , > > , < <, > =, < =, ==, ++, -- и др.) между их составными частями (символами) вставлять пробелы не разрешается. 12. Фактические параметры (аргументы) встроенных и других функций всегда должны быть заключены в круглые скобки. 13. Запятая, отделяющая целую и дробную части числа в математике, при записи констант на языке С++ заменяется точкой.
Приведенные правила важны по многим причинам. Во-первых, необходимо точно составить программу, чтобы она произвела именно те вычисления, которые требуются. Во-вторых, некоторые вычисления могут оказаться просто невозможными из-за способа работы вычислительной машины и транслятора. В-третьих, неправильный порядок выполнения операций может привести к потере точности результата или даже к полной потере результата. Приведем примеры записи ряда арифметических выражений на языке С++:
1.10. Преобразования типов В С++ существует явное и неявное преобразование типов. В общем случае неявное преобразование типов сводится к участию в выражении переменных разного типа (так называемая арифметика смешанных типов). Если подобная операция осуществляется над переменными базовых типов (представленных в табл. 4.5), она может повлечь за собой ошибки: в случае, например, если результат занимает в памяти больше места, чем отведено под принимающую переменную, неизбежна потеря значащих разрядов. Для явного преобразования переменной одного типа в другой перед именем переменной в скобках указывается присваиваемый ей новый тип: Пример 4.18. #include < iostream.h> int main () { int Integer = 54; float Floating = 15.854; Integer = (int) Floating; // явное преобразование cout < < " New integer: "; cout < < Integer < < ' \n'; return 0 }
В приведенном листинге после объявления соответствующих переменных (целочисленной integer и вещественной Floating) производится явное преобразование типа с плавающей запятой (Floating) к целочисленному (Integer). Пример неявного преобразования: Пример 4.19. #include < iostream.h> int main () { int Integer = 0; float Floating = 15.854; Integer = Floating; // неявное преобразовани е cout < < " New integer: "; cout < < Integer < < '\n'; return 0; }
В отличие от предыдущего варианта программы, в данном случае после объявления и инициализации переменных осуществляется присваивание значения переменной с плавающей запятой Floating целочисленной переменной Integer. Результат работы обеих программ выглядит следующим образом: New integer: 15 То есть произошло отсечение дробной части переменной Floating.
1.11. Операции (операторы) инкремента и декремента 1.11.1. Увеличение значения переменной на 1 Обычной операцией, которую вы будете выполнять при программировании, является прибавление 1 к значению целой переменной. Например, предположим, что ваша программа использует переменную с именем count, чтобы сохранить данные о количестве напечатанных файлов. Каждый раз, когда программа печатает файл, 1 будет добавляться к текущему значению count. Используя оператор присваивания C++, ваша программа может увеличивать значение count, как показано ниже: count = count + 1; В данном случае программа сначала выбирает значение count, а затем добавляет к нему единицу. Далее программа записывает результат сложения обратно в переменную count. Программа в примере 4.20 использует оператор присваивания для увеличения переменной count (которая первоначально содержит значение 1000) на единицу (присваивая переменной результат 1001): Пример 4.20 #include < iostream.h> void main(void) { Когда вы откомпилируете и запустите эту программу, на вашем экране появится следующий вывод: Популярное:
|
Последнее изменение этой страницы: 2016-05-03; Просмотров: 471; Нарушение авторского права страницы