|
1 | 1 | # Приоритет операций. Cложные математические выражения |
2 | 2 |
|
3 | | -В математических вычислениях важную роль играет порядок, в котором выполняются действия. Чему, например, равно значение выражения `2 + 2 * 2`? Старый школьный прикол. Конечно же шесть, т.к. сначала выполняется умножение. |
| 3 | +В математических вычислениях важную роль играет порядок, в котором выполняются действия. Вспомним старый школьный прикол. Сколько будет `2 + 2 * 2`? Конечно же шесть, т.к. сначала выполняется умножение. |
4 | 4 |
|
5 | | -В C используется знакомый нам со школы порядок выполнения операций. Но т.к. в программировании есть свои особенности, то кое-какие отличия всё же есть. |
| 5 | +В C используется знакомый нам со школы порядок действий. Но т.к. в программировании есть свои особенности, то кое-какие отличия всё же есть. |
6 | 6 |
|
7 | 7 | Выпишем приоритет для тех операций, которые мы уже знаем. |
8 | 8 |
|
9 | | -1. вызов и вычисление функций (например, `sqrt()`, `cos()` и пр.) |
10 | | -2. умножение, деление, остаток от деления |
11 | | -3. сложение, вычитание |
12 | | -4. выполняется присваивание |
| 9 | +1. явное приведение типов |
| 10 | +2. вызов и вычисление функций (например, `sqrt()`, `cos()` и пр.) |
| 11 | +3. умножение, деление, остаток от деления |
| 12 | +4. сложение, вычитание |
| 13 | +5. выполняется присваивание |
| 14 | + |
13 | 15 |
|
14 | | -Каково значение переменных `x` и `y` после выполнения следующего кода `int x = 8 / 4 * 2;`? |
| 16 | +Давайте себя проверим. Какое значение будет записано в переменную `x` после выполнения следующей строки кода `int x = 8 / 4 * 2;`? |
15 | 17 |
|
16 | | -Правильный ответ `4`. Т.к все операторы `/` и `*`, присутствующие в выражении, имеют одинаковы приоритет, то действия выполняются слева направо. Другими словами данный код эквивалентен коду `int x = (8 / 4) * 2;` |
| 18 | +Правильный ответ `4`. Т.к все операторы `/` и `*`, присутствующие в выражении, имеют одинаковыq приоритет, то действия выполняются слева направо. Другими словами данный код эквивалентен коду `int x = (8 / 4) * 2;` |
17 | 19 |
|
18 | | -Здесь я использовал =круглые группирующие скобки `()`= для того, чтобы явно указать, что деление должно быть выполнено первым действием. Использование скобок для изменения порядка выполнения вычислений скорее всего уже хорошо вам известно со школы. |
| 20 | +Здесь я использовал =круглые группирующие скобки `()`= для того, чтобы явно указать, что деление должно быть выполнено первым действием. Использование скобок для изменения порядка действий скорее всего уже хорошо вам известно со школы. |
19 | 21 |
|
20 | 22 | Давайте дополним нашу таблицу приоритетов операций скобками: |
21 | 23 |
|
22 | 24 | 1. действия в скобках `()` |
23 | | -2. вызов и вычисление функций (например, `sqrt()`, `cos()` и пр.) |
24 | | -3. умножение, деление, остаток от деления |
25 | | -4. сложение, вычитание |
26 | | -5. выполнение присваивания |
| 25 | +2. явное приведение типов |
| 26 | +3. вызов и вычисление функций (например, `sqrt()`, `cos()` и пр.) |
| 27 | +4. умножение, деление, остаток от деления |
| 28 | +5. сложение, вычитание |
| 29 | +6. выполнение присваивания |
27 | 30 |
|
28 | 31 | Листинг 1. |
29 | 32 | ```c |
|
34 | 37 | % **Важно!** |
35 | 38 | Если в вашей программе вы написали довольно сложное выражение, в котором не сразу ясен порядок операций, то лучше добавить лишние скобки, чтобы явно задать последовательность операций. Это поможет избежать ошибок в вычислениях, которые потом будет сложно отловить. |
36 | 39 |
|
37 | | - |
38 | 40 | Кстати, а чему равняется значение `x` для следующего выражения: `int x = 1 / 2 * 2 + 1`? |
39 | 41 |
|
40 | | -Кто сказал `2`? Не правильно! Уже догадались почему? Нет, с приоритетами тут всё как надо. Если расставить скобки, то получим следующее эквивалентное выражение `int x = ((1 / 2) * 2) + 1`. |
| 42 | +Кто сказал `2`? Не правильно! Уже догадались почему? Нет, с приоритетами тут всё хорошо. Если расставить скобки, то получим следующее эквивалентное выражение `int x = ((1 / 2) * 2) + 1`. |
41 | 43 |
|
42 | 44 | Да, верно, проблема в том, что деление-то целочисленное, а значит `1 / 2` даст `0`, а значит `0 * 2 = 0`. И в итоге правильный ответ `1`. Вывод: Не забывайте про особенности целочисленного деления. |
43 | 45 |
|
|
46 | 48 |
|
47 | 49 | Формулы для вычислений бывают довольно громоздкими. |
48 | 50 |
|
49 | | -При этом, когда мы пишем программу, любое выражение мы записываем в одну строку. На начальном этапе это может вызвать некоторые затруднения. Чтобы от них избавиться, нужно овладеть навыком переводить формулу из стандартной математической записи в ту, которая используется в программировании и обратно. |
| 51 | +При этом, когда мы пишем программу, любое выражение, даже если в нём присутствуют дроби (в том числе и многоуровневые), мы записываем в строчку. На начальном этапе это может вызвать некоторые затруднения. Чтобы от них избавиться, нужно овладеть навыком переводить формулу из стандартной математической записи в ту, которая используется в программировании и обратно. |
50 | 52 |
|
51 | | -В следующем небольшом видео я на простом примере показываю, как можно поступать при записи сложных математических выражений. |
| 53 | +В следующем небольшом видео на простом примере показаны несколько подходов, позволяющих не запутаться при записи сложных математических выражений. |
52 | 54 |
|
53 | 55 | <div class="lessonVideo"> |
54 | 56 | <iframe src="https://www.youtube.com/embed/Gx6KUtmRmHs" allowfullscreen></iframe> |
|
0 commit comments