Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Приоритет операторов отношений и логических операторов показан в следующей таблице.
Выражения Операторы, литералы и переменные — это все составляющие выражений. Вероятно, вы уже знакомы с выражениями по предыдущему опыту программирования или из школьного курса алгебры. В следующих разделах мы рассмотрим аспекты выражений, которые касаются их использования в языке C++. Преобразование типов в выражениях Если в выражении смешаны различные типы литералов и переменных, компилятор преобразует их к одному типу. Во-первых, все char- и short int-значения автоматически преобразуются (с расширением " типоразмера" ) к типу int. Этот процесс называется целочисленным расширением (integral promotion). Во-вторых, все операнды преобразуются (также с расширением " типоразмера" ) к типу самого большого операнда. Этот процесс называется расширением типа (type promotion), причем он выполняется по операционно. Например, если один операнд имеет тип int, а другой — long int, то тип int расширяется в тип long int. Или, если хотя бы один из операндов имеет тип double, любой другой операнд приводится к типу double. Это означает, что такие преобразования, как из типа char в тип double, вполне допустимы. После преобразования оба операнда будут иметь один и тот же тип, а результат операции — тип, совпадающий с типом операндов. Рассмотрим, например, преобразование типов, схематически представленное на рис. 3.1. Сначала символ ch подвергается процессу " расширения" типа и преобразуется в значение типа int. Затем результат операции ch/i приводится к типу double, поскольку результат произведения f*d имеет тип double. Результат всего выражения получит тип double, поскольку к моменту его вычисления оба операнда будут иметь тип double. Преобразования, связанные с типом bool Как упоминалось выше, значения типа bool автоматически преобразуются в целые числа 0 или 1 при использовании в выражении целочисленного типа. При преобразовании целочисленного результата в тип bool нуль преобразуется в false, а ненулевое значение — в true. И хотя тип bool относительно недавно был добавлен в язык C++, выполнение автоматических преобразований, связанных с типом bool, означает, что его введение в C++ не имеет негативных последствий для кода, написанного для более ранних версий C++. Более того, автоматические преобразования позволяют C++ поддерживать исходное определение значений ЛОЖЬ и ИСТИНА в виде нуля и ненулевого значения. Таким образом, тип bool очень удобен для программиста. Приведение типов В C++ предусмотрена возможность установить для выражения заданный тип. Для этого используется операция приведения типов (cast). C++ определяет пять видов таких операций. В этом разделе мы рассмотрим только один из них, а остальные четыре описаны ниже в этой книге (после темы создания объектов). Итак, общий формат операции приведения типов таков: (тип) выражение Здесь элемент тип означает тип, к которому необходимо привести выражение. Например, если вы хотите, чтобы выражение х/2 имело тип float, необходимо написать следующее: (float) х / 2 Приведение типов рассматривается как унарный оператор, и поэтому он имеет такой же приоритет, как и другие унарные операторы. Иногда операция приведения типов оказывается очень полезной. Например, в следующей программе для управления циклом используется некоторая целочисленная переменная, входящая в состав выражения, результат вычисления которого необходимо получить с дробной частью. #include < iostream> using namespace std; int main() /* Выводим i и значение i/2 с дробной частью.*/ { int i; for(i=1; i< =100; ++i ) cout < < i < < " / 2 равно: " < < (float) i / 2 < < ''; return 0; } Без оператора приведения типа (float) выполнилось бы только целочисленное деление. Приведение типов в данном случае гарантирует, что на экране будет отображена и дробная часть результата. Использование пробелов и круглых скобок Любое выражение в C++ для повышения читабельности может включать пробелы (или символы табуляции). Например, следующие два выражения совершенно одинаковы, но второе прочитать гораздо легче. х=10/у*(127/х); х = 10 / у * (127/х); Круглые скобки (так же, как в алгебре) повышают приоритет операций, содержащихся внутри них. Использование избыточных или дополнительных круглых скобок не приведет к ошибке или замедлению вычисления выражения. Другими словами, от них не будет никакого вреда, но зато сколько пользы! Ведь они помогут прояснить (для вас самих в первую очередь, не говоря уже о тех, кому придется разбираться в этом без вас) точный порядок вычислений. Скажите, например, какое из следующих двух выражений легче понять? х = у/3-34*temp+127; X = (у/3) - (34*temp) + 127; Глава 4: Инструкции управления В этой главе вы узнаете, как управлять ходом выполнения С++-программы. Существует три категории управляющих инструкций: инструкции выбора (if, switch), итерационные инструкции (состоящие из for-, while- и do-while-циклов) и инструкции перехода (break, continue, return и goto). За исключением return, все остальные перечисленные выше инструкции описаны в этой главе. Инструкция if Инструкция if позволяет сделать выбор между двумя выполняемыми ветвями программы. Инструкция if была представлена в главе 2, но здесь мы рассмотрим ее более детально. Полный формат ее записи таков. if(выражение) инструкция; else инструкция; Здесь под элементом инструкция понимается одна инструкция языка C++. Часть else необязательна. Вместо элемента инструкция может быть использован блок инструкций. В этом случае формат записи if-инструкции принимает такой вид. If(выражение) { последовательность инструкций } Else { последовательность инструкций } Если элемент выражение, который представляет собой условное выражение, при вычислении даст значение ИСТИНА, будет выполнена if-инструкция; в противном случае else-инструкция (если таковая существует). Обе инструкции никогда не выполняются. Условное выражение, управляющее выполнением if-инструкции, может иметь любой тип, действительный для С++-выражений, но главное; чтобы результат его вычисления можно было интерпретировать как значение ИСТИНА или ЛОЖЬ. Использование if-инструкции рассмотрим на примере программы, которая представляет собой версию игры " Угадай магическое число" . Программа генерирует случайное число и предлагает вам его угадать. Если вы угадываете число, программа выводит на экран сообщение одобрения ** Правильно **. В этой программе представлена еще одна библиотечная функция rand(), которая возвращает случайным образом выбранное целое число. Для использования этой функции необходимо включить в программу заголовок < cstdlib> . // Программа " Угадай магическое число". #include < iostream> #include < cstdlib> using namespace std; Int main() { int magic; // магическое число int guess; // вариант пользователя magic = rand(); // Получаем случайное число. cout < < " Введите свой вариант магического числа: "; cin > > guess; if(guess == magic) cout < < " ** Правильно **"; return 0; } В этой программе для проверки того, совпадает ли с " магическим числом" вариант, предложенный пользователем, используется оператор отношения " ==" . При совпадении чисел на экран выводится сообщение ** Правильно **. Попробуем усовершенствовать нашу программу и в ее новую версию включим else-ветвь для вывода сообщения о том, что предположение пользователя оказалось неверным. // Программа " Угадай магическое число": // 1-е усовершенствование. #include < iostream> #include < cstdlib> using namespace std; Int main() { int magic; // магическое число int guess; // вариант пользователя magic = rand(); // Получаем случайное число. cout < < " Введите свой вариант магического числа: "; cin > > guess; if(guess == magic) cout < < " ** Правильно **"; else cout < < "...Очень жаль, но вы ошиблись."; return 0; } Условное выражение Иногда новичков в C++ сбивает с толку тот факт, что для управления if-инструкцией можно использовать любое действительное С++-выражение. Другими словами, тип выражения необязательно ограничивать операторами отношений и логическими операторами или операндами типа bool. Главное, чтобы результат вычисления условного выражения можно было интерпретировать как значение ИСТИНА или ЛОЖЬ. Как вы помните из предыдущей главы, нуль автоматически преобразуется в false, а все ненулевые значения— в true. Это означает, что любое выражение, которое дает в результате нулевое или ненулевое значение, можно использовать для управления if-инструкцией. Например, следующая программа считывает с клавиатуры два целых числа и отображает частное от деления первого на второе. Чтобы не допустить деления на нуль, в программе используется if-инструкция. // Деление первого числа на второе. #include < iostream> using namespace std; Int main() { int a, b; cout < < " Введите два числа: "; cin > > a > > b; if(b) cout < < a/b < < ''; else cout < < " На нуль делить нельзя."; return 0; } Обратите внимание на то, что значение переменной b (делимое) сравнивается с нулем с помощью инструкции if(b), а не инструкции if(b! =0). Дело в том, что, если значение b равно нулю, условное выражение, управляющее инструкцией if, оценивается как ЛОЖЬ, что приводит к выполнению else-ветви. В противном случае (если b содержит ненулевое значение) условие оценивается как ИСТИНА, и деление благополучно выполняется. Нет никакой необходимости использовать следующую if-инструкцию, которая к тому же не свидетельствует о хорошем стиле программирования на C++. if(b! = 0) cout < < а/b < < ''; Популярное:
|
Последнее изменение этой страницы: 2016-03-17; Просмотров: 1265; Нарушение авторского права страницы