5.x – Резюме к главе 5 и небольшой тест
Краткое резюме
Всегда используйте круглые скобки, чтобы устранить неоднозначность приоритета операторов, если есть какие-либо вопросы или возможность путаницы.
Все арифметические операторы работают так же, как и в обычной математике. Оператор остатка от деления (%) возвращает остаток от целочисленного деления. При использовании стандарта языка до C++11 остерегайтесь целочисленного деления и остатка от деления при работе с отрицательными числами.
Операторы инкремента и декремента можно использовать для простого увеличения или уменьшения чисел на единицу. По возможности избегайте постфиксных версий этих операторов.
Остерегайтесь побочных эффектов, особенно когда речь идет о порядке вычисления параметров функции. Не используйте переменную, имеющую побочные эффекты, в какой-либо инструкции более одного раза.
Оператор запятой может сжать несколько инструкций в одну. Но обычно лучше писать инструкции отдельно.
Условный оператор – это хорошая короткая версия инструкции if, но его не следует использовать в качестве альтернативы инструкции if. Используйте условный оператор только в том случае, если вы используете его результат.
Операторы отношения могут использоваться для сравнения чисел с плавающей запятой. Остерегайтесь использования операторов равенства и неравенства для чисел с плавающей запятой.
Логические операторы позволяют нам формировать сложные условные операторы.
Небольшой тест
Вопрос 1
Вычислите следующее выражение:
a) (5 > 3 && 4 < 8)
Ответ
(5 > 3 && 4 < 8) становится (true && true), что равно true.
b) (4 > 6 && true)
Ответ
(4 > 6 && true) становится (false && true), что равно false.
c) (3 >= 3 || false)
Ответ
(3 >= 3 || false) становится (true || false), что равно true.
d) (true || false) ? 4 : 5
Ответ
(true || false) ? 4 : 5 становится (true ? 4 : 5), что равно 4.
Вопрос 2
Оцените следующее выражение:
a) 7 / 4
Ответ
7/4 = 1 и остаток 3, поэтому это выражение равно 1.
b) 14 % 5
Ответ
14/5 = 2 и остаток 4, поэтому 14 % 5 равно 4.
Вопрос 3
Почему никогда не следует делать следующее:
a) int y{ foo(++x, x) };
Ответ
Поскольку operator++ применяет к x побочный эффект, мы не должны снова использовать x в том же выражении. В этом случае параметры функции foo() могут быть вычислены в любом порядке, поэтому неизвестно, будет ли сначала вычисляться x или ++x. Поскольку ++x изменяет значение x, неясно, какие значения будут переданы в функцию.
b) double x{ 0.1 + 0.1 + 0.1 }; return (x == 0.3);
Ответ
Ошибки в вычислениях с плавающей запятой приведут к тому, что возвращаемое значение будет вычислено как false, даже если похоже, что оно должно быть true.
c) int x{ 3 / 0 };
Ответ
Деление на 0 вызывает неопределенное поведение, которое, вероятно, будет выражено в сбое работы программы.
