Программирование на языке C для начинающих: операции и их приоритеты

После несколько затянувшегося перерыва продолжаю. На самом деле эти параграфы должны будут оказаться раньше, чем оператор ‘if’.

Сложение, вычитание, умножение, деление

Эти четыре операции знакомые нам из уроков арифметики начальной школы (или даже с детского садика) есть, практически, в любом современном языке программирования. Причем, в языках программирования эти операции обозначаются также как и в тех самых уроках арифметики… Ну почти также.

(2×7-4)/2+5

Дело в том, что на той клавиатуре, которая теперь воспринимается как стандартная в свое время не нашлось места для кнопки ×. А не нашлось такой кнопки там потому, что не нашлось такого символа и в таблице символов тех компьютеров. Поэтому, разработчики языков программирования, стали вместо такого символа использовать символ * (звездочка).

А остальные три символа присутствовали и в таблице символов и на клавиатуре. Таким образом, вот наши 4 арифметических операции:

+ сложение
- вычитание
* умножение
/ деление

И если мы запишем то же самое выражение, что записали выше на языке программирования С, то получим вот такую запись:

(24-2*7)/2+5

Разумеется, Вы все знаете про эти операции и, конечно знаете, чему будет равно это выражение. Не так ли? Проверьте себя: форкните http://ideone.com/DShaPL и запустите. Получилось то значение, которое Вы ожидали?

Правильный результат: 10.

Приоритеты операций

Также как в арифметике, операции различаются по приоритетам. В сложном выражении сперва вычисляются все операции умножения и деления, а затем все операции сложения и вычитания. Разумеется, последовательность выполнения операций можно изменить при помощи скобок. Рассмотрим пример выше.

Сперва вычисляем часть выражения, записанную в скобках. По правилам приоритетов операций сперва выполняем умножение 2 на 7, получаем, 14, а затем из 24 вычитаем этот результат, получаем 10. Это и будет результат выражения в скобках.

Затем полученное значение делим на 2. Обратите внимание, что делим на 2, а не на 2+5, так как и с точки зрения последовательности вычисления операций (слева-направо) и с точки зрения приоритетов, следующим шагом нужно производить деление. Получаем 5.

И уже к этому результату добавляем 5, и получаем результат 10.

А вот для этого выражения:

(24-2*7)/(2+5)

результат будет 1. Проверьте это при помощи того же форка на ideone.

Операции деления и остаток от деления

Какой результат Вы получите, например, для такого выражения:

10/5

В этом примере никаких проблем нет, 10 делится на 5 нацело и Вы получаете ожидаемый результат: 2.

А для такого:

10/4

Правильный ответ: 2. Не 2,5, не 2.5, то есть не “два с половиной” и даже не “две целых, пять десятых”, а просто “два”.

Почему такое происходит? давайте разберемся. Как я сказал раньше, мы пока используем для наших работ только целый тип данных: int. Этот тип данных предполагает, что все операции, которые применяются к объектам данного типа также целочисленны. И операция деления тоже целочисленная.

В школьном курсе арифметики это называлось деление с остатком. И тот результат, который Вы получили сейчас, это частное. К сожалению, в отличие от тетрадки, в языке C нельзя сразу получить и частное и остаток. Для нахождения остатка требуется использовать отдельную операцию, которая обозначается при помощи символа % (процент). Вот так, например:

10%4

И какой получился остаток от деления 10 на 4? Конечно, же 2. Эта операция в математике также называется “взятие по модулю”. То есть, вместо “остаток от деления 10 на 4″ можно говорить: ” 10 по модулю 4″.

Ну теперь Вы легко ответите, что в результате такой операции:

10/20

Вы получите частное 0 (ноль). А остаток от деления:

10%20

получите равным 10.

Операция “остаток от деления” имеет тот же приоритет, что и операция деления. То есть, выражение:

50/6%5

будет равно 3.

Сперва число 50 будет разделено на 6. В результате получим 8. А затем это значение 8 будет взято по модулю 5, и таким образом, мы получим результат 3.

Аналогично:

60%16/5

Сперва найдем остаток от деления 60 на 16, получаем 12, а затем значение 12 разделим на 5 получим 2.

Теперь мы можем расширить список операций:

+ сложение
- вычитание
* умножение
/ деление
% остаток от деления

Cкобки

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

(2+3)*(7-2)

Посчитайте, сколько должно получиться и проверьте себя при помощи того же форка на ideone

Скобки можно использовать вложенные. Например:

5-(50-(2+3)*8)/5

Посчитайте чему должно быть равно это выражение и убедитесь, что вы посчитали правильно при помощи того же форка на ideone.

Скобки можно вкладывать многократно. Например:

5-(50-((2+6/2)*8-5)-10)/5

Конечно, при наличии возможности, лучше избегать таких сложных выражений, но, тем не менее, это вполне допустимое выражение. Посчитайте сколько должно получиться. Затем проверьте при помощи того же самого форка на ideone.

Ассоциативность операций

Возможно, из начальной школы Вы помните что такое “ассоциативность операций”. Те кто забыл могут посмотреть на википедии. Если коротко, то если в выражении одна и та же операция идет несколько раз подряд, и эта операция ассоциативна, то можно применять эти операции в любой последовательности. Свойство ассоциативности присуще операциям сложения и вычитания. В программировании все не совсем так. Есть случаи, когда выполнение операций в другой последовательности (даже если это просто операция умножения) может привести к другим результатам. И даже коммутативный закон не всегда работает. Пример таких случаев выходит за рамки данного учебника. Однако, об этом нужно помнить. 

Поэтому, в языках программирования все одинаковые операции всегда выполняются в одной и той же последовательности. Большинство операций выполняется слева направо. Такие операции называют лево-ассоциативными. Другие операции выполняются справа налево и такие операции называются право-ассоциативными.

В языке C есть одна группа право-ассоциативных операций. Эту группу мы рассмотрим позже.

Все арифметические операции лево-ассоциативны. Это значит, что и выражение:

20+5+4

и выражение:

20/5/4

всегда будет вычисляться слева-направо.

Вложенные скобки

Задание

Составьте не менее 10 различных выражений, со следующими требованиями:

  1. Три операции сложения, так чтобы в результате получилось значение 10.
  2. Три операции вычитания так чтобы в результате получилось значение 20.
  3. Одну операцию сложения и одну операцию вычитания, так чтобы в результате получилось значение 30.
  4. По одной или более операций сложения, умножения и деления, так чтобы в результате получилось значение 40.
  5. По одной или более операций сложения, умножения и остатка от деления, так чтобы в результате получилось значение 50.
  6. Две или более разных операции, но не менее 5 операций итого и одну пару скобок, так чтобы в результате получилось значение 60.
  7. Операцию остатка от деления и еще две любые другие операции разных операции, но не менее 4 операций итого и одну пару скобок, так чтобы в результате получилось значение 70.
  8. Операцию деления и еще одну любую операции, но не менее 8 операций итого и две пары скобок (не вложенных), так чтобы в результате получилось значение 80.
  9. Операцию деления и еще одну любую операции, но не менее 4 операций итого и две пары вложенных скобок, так чтобы в результате получилось значение 90.
  10. Операцию умножения и еще одну или более любую операции, но не менее 5 операций итого и три пары вложенных скобок, так чтобы в результате получилось значение 100.

Распечатайте результаты всех этих операций. Для выполнения задания форкните эту заготовку: http://ideone.com/jEIBsh.

Следующий параграф

К оглавлению

Лицензия

Attribution-NonCommercial-ShareAlike 3.0 Unported (CC BY-NC-SA 3.0)

Programming in C for beginners by Sergey Borisov (AKA risik) is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.

Программирование на языке C для начинающих автор Сергей Борисов (AKA risik) доступна на условиях лицензии Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.

 

One thought on “Программирование на языке C для начинающих: операции и их приоритеты”

Leave a Reply