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 вызывает неопределенное поведение, которое, вероятно, будет выражено в сбое работы программы.