Написание выражений
Встроенные типы данных поддерживаются набором операторов: арифметических, логических, отношения, структурообразующих. Арифметические операторы не имеют особенностей, исключая деление целых и получение остатка.
// Арифметические операторы + сложение а + Ъ - вычитание а - Ъ * умножение а * Ъ / деление а / Ъ % остаток а % Ъ
Деление двух целых значений выдает целое. Любой остаток отсекается, и это не округление. Остаток получается с помощью оператора %:
5/3 результат 1 тогда, как 5 % 3 имеет результат 2 5/4 результат 1 тогда, как 5 % 4 имеет результат 1 5/5 результат 1 тогда, как 5 % 5 имеет результат О
В каких случаях мы нуждаемся в операторе получения остатка? Представьте, что мы хотим печатать не более восьми слов в линии. Если количество слов меньше восьми, мы выводим пробелы после слов. Если строка состоит из восьми или более слов, мы выводим переход на новую строку (newline):
Const int line_size = 8; int cnt = 1;
// это выражение выполняется много раз со // строками, представленными разными значениями, // и cnt увеличивается на единицу при каждом проходе... cout « a_string« (cnt % line_size? " " : "n");
Выражение в скобках за оператором вывода, похоже, не имеет для вас значения, пока вы не освоите условный оператор (? :). Результат выражения - либо пробел, либо переход на новую строку - в зависимости от того, нулевое или ненулевое значение принимает оператор остатка. Посмотрим, какой смысл мы можем ему придать.
Выражение cnt % 1 ine_s і ze превращается в ноль, когда cnt достигает значения line_size; иначе оно не равно нулю.
Что это означает для нас? Условный оператор имеет основную форму:
Expr? execute_if_expr_is_true: execute_if_expr_is_false; выражение? выполнять_если_выражение_истинно: выполнять_если_выражение_ложно;
Если ехрг (выражение) принимает значение true, выражение, следующее за знаком вопроса, выполняется. Если ехрг принимает значение false, выполняется выражение, следующее за двоеточием. В нашем случае выражение становится либо пробелом, либо переводом на новую строку для оператора вывода.
Условное выражение обрабатывается как ложное (false), если его значение равно нулю. Любое ненулевое значение принимается как true. В примере, пока cnt не делится на восемь, а результат не нулевой, выполняется переход оператора по условию true, и печатается пробел.
Оператор структурного присваивания дает краткую нотацию при применении арифметической операции для задания объектов. Например, чтобы не писать:
Cnt = cnt + 2;
Программист С++ обычно пишет:
Cnt += 2; // прибавить 2 к данному значению cnt
Структурное присваивание применимо к каждому арифметическому оператору: +=, -+, /=, и %=.
Когда к объекту прибавляется или вычитается 1, программист С++ использует операторы увеличения или уменьшения:
Cnt++; // добавляет 1 к значению cnt (инкремент) cnt—; // вычитает 1 из значения cnt (декремент)
Существует префиксная (до) и постфиксная (после) разновидность операторов увеличения и уменьшения. В префиксном написании объект увеличивается или уменьшается на 1 до того, как его значение используется:
Int tries = 0;
Cout « "Are you ready for try #"« ++tries « "?n";
Tries увеличивается на 1 до вьюода его значения. В постфиксном написании значение объекта вначале используется в выражении, а затем увеличивается (или уменьшается) на 1:
Int tries = 1;
Cout « "Are you ready for try #"« tries++ « "?n";
Теперь значение tries выводится до того, как увеличивается на 1. В обоих примерах значение 1 выводится.
Каждый из операторов сравнения принимает значение true или false. Их всего шесть:
== равно а == b! = не равно а! = b < меньше чем а < b > больше чем а > b <= меньше чем или равно а <= b >= больше чем или равно а >= b
Вот пример того, как мы можем использовать оператор равенства (эквивалентности) для проверки ответа пользователя:
Bool usr_more = true; char usr_rsp;
// спросим пользователя, хочет ли он продолжить // прочитаем ответ в usr_rsp if (usr__rsp == "N") usr_more = false;
Условное выражение і f выполняет предложение, следующее за ним, если выражение в скобках принимает значение true. В данном примере usrjnore устанавливается в false, если usr_rsp равно ' N'. Если usr_rsp не равно ' N', не делается ничего. «От противного», используя оператор неравенства, можно написать так:
If (usr_rsp!= "Y")usr_more = false;
Проблема с проверкой usr_rsp только на значение ' N' в том, что пользователь может ввести ответ в нижнем регистре, то есть ' п'. Мы должны распознать оба значения. Одна из стратегий - добавить else:
If (usr_rsp == "N") usr_more = false;
Else if (usr_rsp == "n") usr_more = false;
Если usr_rsp равно 'N', то usr__more устанавливается в false и больше ничего не делается. Если оно не равно 'N', выполняется else. Если usr_rsp равно 'п',то usr_more принимает значение false. Если же значение usr_rsp не равно ни тому, ни другому, значение usr_more не определяется.
Одна из распространенных ошибок начинающих программистов - использование оператора присваивания при проверке равенства, как показано ниже:
// раз, и присвоили usr_rsp символ "N"
// а теперь всегда условие принимает значение true
If (usr_rsp = "NH)
Логический оператор ИЛИ (| |) предлагает альтернативный путь проверки истинности во множественных выражениях:
If (usr_rsp == "N" II usr_rsp == "n")usr_more = false;
Логический оператор ИЛИ становится истинным (true), если любое из выражений истинно. Левое выражение проверяется первым. Если оно истинно, следующее выражение не проверяется. В нашем примере usr_rsp проверяется на равенство ' п', только если оно не равно ' N'.
Логический оператор И (&&) становится истинным, только если оба выражения истинны. Например,
If (password &&validate(password) && (acct = retrieve_acct_info(password))) // процесс доступа...
Верхнее выражение проверяется первым. Если оно ложно, оператор И принимает значение false, а остальное выражение не проверяется. В данном случае информация доступа принимается только при введении правильного пароля.
Логический оператор НЕ (!) принимает значение true, если выражение, которому он принадлежит, имеет значение false. Например, вместо записи:
If (usr__more == false)
Cout « "Your score for this session is " « usr__score « " Bye!n";
Мы можем написать:
If (! usr_more) ...