Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 21 additions & 16 deletions lang_c/6/1__otnosheniya_i_usloviya/article.md
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ int main(void)
Отдельно остановимся на проверке равенства (`==`) двух вещественных чисел.

Посмотрите на следующий пример.

Листинг 3. Проверка равенства двух вещественных значений
```c
#include <stdio.h>
Expand All @@ -84,7 +85,7 @@ int main(void)

Здесь мы сравниваем между собой вещественное число `1.0` и значения выражений `10 * 0.1` и `0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1`. В математике оба эти отношения, конечно, истинны. Т.к. умножение `10` на `0.1` также как и сложение десяти слагаемых по `0.1` дают единицу.

Но в программировании, как я уже отмечал ранее, прописные математические истины могут давать сбой. Поэтому если мы скомпилируем и запустим это программу, то увидим следующий результат:
Но в программировании, как я уже отмечал ранее, прописные математические истины могут давать сбой. Поэтому если мы скомпилируем и запустим эту программу, то увидим следующий результат:

![Результат сравнения двух вещественных значений](./real_numbers_comparison.png "Рис.1 Результат работы программы Листинг 3. Проверка равенства вещественных значений")

Expand Down Expand Up @@ -118,7 +119,7 @@ int main(void)

![](./real_numbers_comparison2.png)

Видите? Хотя все три числа должны быть равны `1.0`, из-за накопления погрешностей число `c` получилось чуть-чуть меньше единицы. Поэтому оператор сравнение `a == c` показывает, что значения в переменных `a` и `c` не равны между собой.
Видите? Хотя все три числа должны быть равны `1.0`, из-за накопления погрешностей число `c` получилось чуть-чуть меньше единицы. Поэтому оператор сравнения `a == c` показывает, что значения в переменных `a` и `c` не равны между собой.

Как же в таком случае правильно сравнивать вещественные числа? Приближённо. Будем проверять, что разница между ними меньше некоторого очень маленького числа (например, `0.00000001`):

Expand All @@ -141,7 +142,7 @@ int main(void)
printf("c = %.16f\n", c);

// Точное сравнение
printf("exactly: a == c? %d\n", a == b);
printf("accurately: a == c? %d\n", a == b);


// Приблизительное сравнение с погрешностью
Expand Down Expand Up @@ -220,11 +221,11 @@ int main(void)
printf("%d\n", a != b * c); // выражение 2
printf("%d\n", !(a != b * c)); // отрицаине выражения 2

printf("%d\n", !0);
printf("%d\n", !1);
printf("%d\n", !5);
printf("%d\n", !3.14);
printf("%d\n", !'a');
printf("%d\n", !0); // 1
printf("%d\n", !1); // 0
printf("%d\n", !5); // 0
printf("%d\n", !3.14); // 0
printf("%d\n", !'a'); // 0


return 0;
Expand Down Expand Up @@ -256,15 +257,17 @@ int main(void)

int main(void)
{
printf("true && true = %d\n", 1 && 1);
printf("true && false = %d\n", 1 && 0);
printf("false && true = %d\n", 0 && 1);
printf("false && false = %d\n", 0 && 0);
printf("true && true = %d\n", 1 && 1); // 1
printf("true && false = %d\n", 1 && 0); // 0
printf("false && true = %d\n", 0 && 1); // 0
printf("false && false = %d\n", 0 && 0); // 0

return 0;
}
```

Запустите этот код у себя в IDE и сверьте результат.

### Оператор `||` логическое ИЛИ

`(условие1) || (условие2)` -- оператор `||`(логическое ИЛИ) возвращает `1`, если хотя бы одно из условий истинно или оба условия истинны. Иначе возвращает значение `0`.
Expand All @@ -277,15 +280,17 @@ int main(void)

int main(void)
{
printf("true || true = %d\n", 1 || 1 );
printf("true || false = %d\n", 1 || 0 );
printf("false || true = %d\n", 0 || 1 );
printf("false || false = %d\n", 0 || 0 );
printf("true || true = %d\n", 1 || 1 ); // 1
printf("true || false = %d\n", 1 || 0 ); // 1
printf("false || true = %d\n", 0 || 1 ); // 1
printf("false || false = %d\n", 0 || 0 ); // 0

return 0;
}
```

Проверьте работу и этого кода. Вопрос на повторение: что будет, если заменить `1` на `-1`? Добавьте минус к единице и убедитесь в этом.

% **Важно!**
Обязательно надо использовать два значка для логических операторов И `&&` и ИЛИ `||`. Операторы `&` и `|` тоже есть, но они используются для других целей.

Expand Down
2 changes: 1 addition & 1 deletion lang_c/6/1__otnosheniya_i_usloviya/practice.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,4 @@
В некоторых языках программирования есть встроенный логический тип данных. В язык Си логический тип данных был добавлен в стандарте C99.
Это тип данных `_Bool`, который хранит только два значения: `0` (ложь) и `1` (истина). Кроме того, этим же стандартом введён заголовочный файл `stdbool.h`, который определяет значения `true` (истина, т.е. `1`) и `false` (ложь, т.е. `0`).

Изучите самостоятельно, как работает тип `_Bool` и заголовочный файл `stdbool.h`.
Изучите самостоятельно, как работает заголовочный файл `stdbool.h` и тип `_Bool`, а также в чём его преимущества перед другими типами. Напишите в комментариях к уроку, что удалось узнать.
Loading