Дайте відповіді на питання:
1. Поширеною практикою є використання в конструкції if не лише логічних виразів чи значень, але і цілих значень (коди помилок), наприклад:
char v; /* ... */ if (v) { std::cout << "True" << std::endl; }
Чи буде виведено на екран “True”, якщо змінну v проініціалізувати значенням:
- 0
- 1
- 2
- -1
- ‘\0’
- ‘0’
2. Задано змінну c типу char. Одним рядком коду перевірте, чи цей символ може використовуватись для запису цілого числа (символи від ‘0’ до ‘9’, ‘-’ або ‘+’), і збережіть результат в змінну isnum типу bool.
3. Задано цілочисельні змінні a і b. Напишіть конструкцію if, яка би виводила “Hello, world!”, якщо одне з двох тверджень правильне:
- a більше 3 і b менше -5.
- a не більше 3 і b не менше -5.
4. Синтаксис C++ дозволяє записувати короткі конструкції if та else без фігурних дужок з певними обмеженнями. Нижче наведено код програми для обчислення частки двох цілих чисел. Що буде виведено на екран і яким буде код повернення для вхідних даних 4 і 0? Для 4 і 2?
int a, b;
/* ... */
// Якщо b рівне 0 - вивести помилку, код повернення 1.
if (b == 0) std::cout << "Error: b is 0." << std::endl; return 1;
// В іншому випадку - вивести результат, код повернення 0.
std::cout << a / b << std::endl;
return 0;
Відповідь
1. Ціле число інтерпретується як false тільки коли воно рівне 0. Тому у випадку числа 0 і термінального символа ‘\0’ (це одне і те ж) нічого не буде виведено. “True” буде виведено для значень 1, 2, -1 та символа ‘0’ (йому відповідає число 48).
2. bool isnum = (c >= '0' && c <= '9') || c == '-' || c == '+';
3. Друге твердження можна більш технічно інтерпретувати як “не (a > 3) і не (b < -5)”. Порівнявши його з першим, бачимо, що “Hello, world!” потрібно вивести, якщо умови a > 3 і b < -5 або одночасно true, або одночасно false:
if ((a > 3) == (b < -5)) {
std::cout << "Hello, world!" << std::endl;
}
4. Короткий запис буде продовжуватись не до кінця рядка, а лише до першої крапки з комою. Таким чином, код програми еквівалентний наступному:
int a, b;
/* ... */
// Якщо b рівне 0 - лише вивести помилку.
if (b == 0) {
std::cout << "Error: b is 0." << std::endl;
}
// Код повернення завжди 1, незалежно від даних.
return 1;
// Ця частина коду недосяжна і ніколи не виконуватиметься.
std::cout << a / b << std::endl;
return 0;
Тому для 4 і 0 програма спрацює “правильно”: виведе повідомлення про помилку, і код повернення буде 1 (все, що не 0, прийнято вважати помилкою).
Для 4 і 2 код повернення буд також 1, але без ніяких повідомлень.
Через подібні нюанси коротку форму запису потрібно використовувати з обережністю, а краще взагалі не використовувати — лише знати про неї і розрізняти в коді.
Добавить комментарий