× К оглавлению На главную Об авторе

Дата и время публикации:

Дата и время модификции:

Нотации выражения


1. Что исследуем?

Два арифметических выражения:.

(1) \( 6:2(2 + 1) \) и

(2) \( 6/2(2 + 1) \) .

При этом, для них соблюдаются следующие равенства:

(3) \( 6:2(2 + 1) = 9 \) и

(4) \( 6/2(2 + 1) = 1 \) .

2. Два решения и взгляда

2.1 Взгляд математика

Потому что равенство (3) вытекает из выражения (1), а равенство (4) – из выражения (2). При этом, различие в результатах вычислений находится в разнице записи операции деления.

В первом случае, используется знак двоеточия, что приводит к следующей последовательности вычислений:

(5) \( 6:2(2 + 1) = 6/(2*(2+1)) = 6 / (2*3) = 6 / 6 = 1 \) и

Во втором случае, получаем следующее:

(6) \( (6/2) * (2+1) = 3 * 3 = 9\) .

Как видим, для выражения (1) используется подзабытая запись деления в виде двоеточия (:), когда все остальное выражение берется в скобки слева, что подтверждается его равенством (5).

В тоже время, так как в выражении (2) используется знак (/), оно разбивается на две части: дробь в левой и суммы в правой, что иллюстрирует равенство (6).

2.2 Взгляд программиста

Согласно стандарту программирования все операции должны быть явно указаны, т.о. все сводится к равенству (6), что иллюстрирует листинг 2.1 .

Листинг 2.1.

/*.1.*/
/*.2.*/ int arithmetic_ratio(void)
/*.3.*/ {
/*.4.*/   int a = 2,
/*.5.*/       b = 1,
/*.6.*/       c = 6;
/*.7.*/   return ((c/a) * (a+b)); /* res=9 */
/*.8.*/ }

При этом, если из первой части выражения, где операция деления, убрать скобки получим код, как показано в листинге 2.2

Листинг 2.2.

/*.1.*/
/*.2.*/ int arithmetic_ratio(void)
/*.3.*/ {
. . .
/*.7.*/ return (c/(a*(a+b))); /* res=1 */
/*.8.*/ }

потому что операция деления будет выполнена ранее чем умножения, так как равнозначные арифметические вычисления, такие как умножение (*) и деление (/), производятся слева направо, а правый операнд берется из левого. Поэтому для получения результата соответствующего равенству (4) необходимо все заключить в скобки ( \( res = 6 / (2*3) = 1 \) ), как было показано в листинге 2.2 .

3. Библиография

3.1 Репетитор по математике. А какому калькулятору поверите Вы?

3.2 math.stackexchange.com: on the priority of arithmetic operations

3.4 The C operators precedence