You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: lang_c/6/1__otnosheniya_i_usloviya/article.md
+21-16Lines changed: 21 additions & 16 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -67,6 +67,7 @@ int main(void)
67
67
Отдельно остановимся на проверке равенства (`==`) двух вещественных чисел.
68
68
69
69
Посмотрите на следующий пример.
70
+
70
71
Листинг 3. Проверка равенства двух вещественных значений
71
72
```c
72
73
#include <stdio.h>
@@ -84,7 +85,7 @@ int main(void)
84
85
85
86
Здесь мы сравниваем между собой вещественное число `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` дают единицу.
86
87
87
-
Но в программировании, как я уже отмечал ранее, прописные математические истины могут давать сбой. Поэтому если мы скомпилируем и запустим это программу, то увидим следующий результат:
88
+
Но в программировании, как я уже отмечал ранее, прописные математические истины могут давать сбой. Поэтому если мы скомпилируем и запустим эту программу, то увидим следующий результат:
88
89
89
90

90
91
@@ -118,7 +119,7 @@ int main(void)
118
119
119
120

120
121
121
-
Видите? Хотя все три числа должны быть равны `1.0`, из-за накопления погрешностей число `c` получилось чуть-чуть меньше единицы. Поэтому оператор сравнение `a == c` показывает, что значения в переменных `a` и `c` не равны между собой.
122
+
Видите? Хотя все три числа должны быть равны `1.0`, из-за накопления погрешностей число `c` получилось чуть-чуть меньше единицы. Поэтому оператор сравнения `a == c` показывает, что значения в переменных `a` и `c` не равны между собой.
122
123
123
124
Как же в таком случае правильно сравнивать вещественные числа? Приближённо. Будем проверять, что разница между ними меньше некоторого очень маленького числа (например, `0.00000001`):
124
125
@@ -141,7 +142,7 @@ int main(void)
141
142
printf("c = %.16f\n", c);
142
143
143
144
// Точное сравнение
144
-
printf("exactly: a == c? %d\n", a == b);
145
+
printf("accurately: a == c? %d\n", a == b);
145
146
146
147
147
148
// Приблизительное сравнение с погрешностью
@@ -220,11 +221,11 @@ int main(void)
220
221
printf("%d\n", a != b * c); // выражение 2
221
222
printf("%d\n", !(a != b * c)); // отрицаине выражения 2
222
223
223
-
printf("%d\n", !0);
224
-
printf("%d\n", !1);
225
-
printf("%d\n", !5);
226
-
printf("%d\n", !3.14);
227
-
printf("%d\n", !'a');
224
+
printf("%d\n", !0); // 1
225
+
printf("%d\n", !1); // 0
226
+
printf("%d\n", !5); // 0
227
+
printf("%d\n", !3.14); // 0
228
+
printf("%d\n", !'a'); // 0
228
229
229
230
230
231
return 0;
@@ -256,15 +257,17 @@ int main(void)
256
257
257
258
int main(void)
258
259
{
259
-
printf("true && true = %d\n", 1 && 1);
260
-
printf("true && false = %d\n", 1 && 0);
261
-
printf("false && true = %d\n", 0 && 1);
262
-
printf("false && false = %d\n", 0 && 0);
260
+
printf("true && true = %d\n", 1 && 1); // 1
261
+
printf("true && false = %d\n", 1 && 0); // 0
262
+
printf("false && true = %d\n", 0 && 1); // 0
263
+
printf("false && false = %d\n", 0 && 0); // 0
263
264
264
265
return 0;
265
266
}
266
267
```
267
268
269
+
Запустите этот код у себя в IDE и сверьте результат.
270
+
268
271
### Оператор `||` логическое ИЛИ
269
272
270
273
`(условие1) || (условие2)` -- оператор `||`(логическое ИЛИ) возвращает `1`, если хотя бы одно из условий истинно или оба условия истинны. Иначе возвращает значение `0`.
@@ -277,15 +280,17 @@ int main(void)
277
280
278
281
intmain(void)
279
282
{
280
-
printf("true || true = %d\n", 1 || 1 );
281
-
printf("true || false = %d\n", 1 || 0 );
282
-
printf("false || true = %d\n", 0 || 1 );
283
-
printf("false || false = %d\n", 0 || 0 );
283
+
printf("true || true = %d\n", 1 || 1 ); // 1
284
+
printf("true || false = %d\n", 1 || 0 ); // 1
285
+
printf("false || true = %d\n", 0 || 1 ); // 1
286
+
printf("false || false = %d\n", 0 || 0 ); // 0
284
287
285
288
return 0;
286
289
}
287
290
```
288
291
292
+
Проверьте работу и этого кода. Вопрос на повторение: что будет, если заменить `1` на `-1`? Добавьте минус к единице и убедитесь в этом.
293
+
289
294
% **Важно!**
290
295
Обязательно надо использовать два значка для логических операторов И `&&` и ИЛИ `||`. Операторы `&` и `|` тоже есть, но они используются для других целей.
Copy file name to clipboardExpand all lines: lang_c/6/1__otnosheniya_i_usloviya/practice.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -11,4 +11,4 @@
11
11
В некоторых языках программирования есть встроенный логический тип данных. В язык Си логический тип данных был добавлен в стандарте C99.
12
12
Это тип данных `_Bool`, который хранит только два значения: `0` (ложь) и `1` (истина). Кроме того, этим же стандартом введён заголовочный файл `stdbool.h`, который определяет значения `true` (истина, т.е. `1`) и `false` (ложь, т.е. `0`).
13
13
14
-
Изучите самостоятельно, как работает тип `_Bool` и заголовочный файл `stdbool.h`.
14
+
Изучите самостоятельно, как работает заголовочный файл `stdbool.h` и тип `_Bool`, а также в чём его преимущества перед другими типами. Напишите в комментариях к уроку, что удалось узнать.
0 commit comments