Глава 3. Итоговый тест

   ⁄ 

 Обновлено 11 Мар 2017

  ⁄   

Сначала повторим вкратце то, чему научились в этой главе.

Теория

Всегда используйте круглые скобки для устранения возможных проблем с приоритетами операторов и порядком их выполнения.

Арифметические операторы в C++ работают так же, как и в обычной математике. Оператор % возвращает остаток от целочисленного деления. Остерегайтесь ошибок округления и знаков, когда операнды целочисленного деления и операции % — отрицательны.

Операторы инкремента (+1) и декремента (-1) используются для увеличения или уменьшения чисел. Остерегайтесь побочных эффектов, особенно когда дело доходит до порядка, в котором будут обрабатываться параметры функции. Не используйте переменную с побочным эффектом больше одного раза в одном стейтменте.

Операторы сравнения позволяют сравнивать числа типа с плавающей точкой. Остерегайтесь использования операторов равенства и неравенства с ними.

Логические операторы позволяют формировать сложные условные стейтменты. Побитовые операторы позволяют работать на уровне отдельных битов.

Задание №1

1. Вычислите следующие выражения:

a) (5 > 3 && 4 < 8)
b) (4 > 6 && true)
c) (3 >= 3 || false)
d) (true || false) ? 4 : 5

Ответ 1

a) (5 > 3 && 4 < 8) значит (true && true), результат — true.
b) (4 > 6 && true) значит (false && true), результат — false.
c) (3 >= 3 || false) значит (true || false), результат — true.
d) (true || false) ? 4 : 5 значит (true ? 4 : 5), результат — 4.

Задание №2

2. Вычислите результат:

a) 7 / 4
b) 14 % 5

Ответ 2

a) 7 / 4 = 1 с остатком 3, результат — 1.
b) 14 % 5 = 2 с остатком 4, результат — 4.

Задание №3

3. Переведите следующие двоичные числа в десятичную систему:

a) 1101
b) 101110

Ответ 3

a) 1101 — это ((1 * 8) + (1 * 4) + (0 * 2) + (1 * 1)) = 8 + 4 + 1 = 13
b) 101110 — это ((1 * 32) + (0 * 16) + (1 * 8) + (1 * 4) + (1 * 2) + (0 * 1)) = 32 + 8 + 4 + 2 = 46

Задание №4

4. Переведите следующие десятичные числа в двоичную систему:

a) 15
b) 53

Ответ 4

а) Используя метод 1:

15 / 2 = 7 r1
7 / 2 = 3 r1
3 / 2 = 1 r1
1 / 2 = 0 r1

Смотрим на остатки (снизу вверх): 1111.

Используя метод 2:

15 >= 8? Да, 8 бит равен 1. Остается 7.
7 >= 4? Да, 4 бит равен 1. Остается 3.
3 >= 2? Да, 2 бит равен 1. Остается 1.
1 >= 1? Да, 1 бит равен 1.

Результат — 1111.

b) Используя метод 1:

53 / 2 = 26 r1
26 / 2 = 13 r0
13 / 2 = 6 r1
6 / 2 = 3 r0
3 / 2 = 1 r1
1 / 2 = 0 r1

Смотрим на остатки (снизу вверх): 110101.

Используя метод 2:

53 >= 32? Да, 32 бит равен 1. Остается 21.
21 >= 16? Да, 16 бит равен 1. Остается 5.
5 >= 8? Нет, 8 бит равен 0.
5 >= 4? Да, 4 бит равен 1. Остается 1.
1 > 2? Нет, 2 бит равен 0.
1 >=1? Да, 1 бит равен 1.

Таким образом, десятичное 53 равно двоичному 110101.

Задание №5

5. Почему вы никогда не должны делать следующее:

a) int y = foo(++x, x);
b) int x = 7 / -2; // (до C++11)
c) int x = -5 % 2; // (до C++11)
d) float x = 0.1 + 0.1; if (x == 0.2) return true; else return false;
e) int x = 3 / 0;

Ответ 5

а) Поскольку оператор ++ создает побочный эффект аргументу x, то мы не должны использовать x дважды в этом выражении. Параметры функции foo() могут обрабатываться в любом порядке и нельзя определить, что будет первым (x или ++x). Поскольку ++x изменяет значение x, то неясно, какие значения будут переданы в функцию.

b) До C++ 11 неясно, округлит ли компилятор это значение до -3 или до -4.

с) До C++ 11 неясно, будет ли результатом 1 или -1.

d) Ошибки округления чисел типа с плавающей точкой приведут к результату false, хоть и кажется, что должно быть true.

e) Деление на 0 приведет к сбою программы.

Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (7 оценок, среднее: 4,71 из 5)
Загрузка...
Поделиться в:
Подписаться на обновления:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *