- •Предисловие.
- •1. Введение.
- •1.1. История создания языка си.
- •1.2. Стандарты языка си.
- •2. Основные сведения, необходимые для создания программ на языке си.
- •2.1 Процесс создания исполняемого файла.
- •2.2 Распределение памяти программы.
- •2.3 Некоторые основные понятия.
- •2.4 Данные.
- •2.5 Структура простой программы.
- •3. Определение размеров типов данных и объектов.
- •4. Строки и строковые константы.
- •5. Директива препроцессора # define.
- •6. Функции форматированного ввода – вывода.
- •6.1 Функция форматированного вывода printf().
- •6.2 Функция форматированного ввода scanf().
- •7. Операции и операторы.
- •7.1 Арифметические операции
- •7.4 Порядок выполнения операций.
- •8. Выражения и операторы
- •8.1 Выражения.
- •8.2 Операторы.
- •8.3 Составные операторы.
- •8.4 Преобразование типов.
- •8.5 Операция приведения типов.
- •9. Функции ввода и вывода символов.
- •9.1 Функции getchar() и putchar().
- •9.2 Функции getch() и getche().
- •9.3 Ввод и вывод последовательности символов.
- •9.4 Подсчет символов, вводимых с клавиатуры.
- •9.5 Вывод символов из вводимого с клавиатуры файла.
- •9.6 Переключение ввода-вывода данных.
- •10. Принятие решений.
- •10.1 Оператор если (if).
- •10.2 Оператор если - иначе (if else).
- •10.3 Множественный выбор на основе операторов if, else.
- •10.5 Приоритеты операций отношения.
- •10.6 Логические операции (and, or, not).
- •10.7 Операция условия ?:.
- •10.8 Множественный выбор на основе операторов switch, break, default.
- •11. Циклы.
- •11.1 Цикл пока (while).
- •11.2 Цикл для (for).
- •11.4 Операция запятая ,.
- •11.5 Цикл делай пока (do while).
- •11.6 Вложенные циклы.
- •11.7 Операторы выход из структуры (break), продолжение (continue), безусловный переход (to go).
- •Литература.
- •Оглавление.
7.4 Порядок выполнения операций.
Рассмотрим следующую строку:
butter = 25.0 + 60.0 * n / SCALE;
В этом операторе имеются операции сложения, умножения и деления. Какая операция будет выполнена первой? Пусть переменная n равна 6.0, а константа SCALE - 2.0. При выполнении данной Си программы на машине переменная butter получит значение 205.0. Совершенно очевидно, что изменение порядка выполнения действий может приводить к различным результатам, поэтому язык Си нуждается в наборе непротиворечивых правил, указывающих, какое действие осуществлять первым. Язык Си делает это, задавая приоритет той или иной операции. Каждой операции назначается уровень старшинства. Умножение и деление имеют более высокий уровень, чем сложение и вычитание, поэтому они выполняются первыми. Если же две операции имеют один и тот же уровень старшинства, они выполняются в том порядке, в котором присутствуют в операторе. Для большинства операций обычный порядок - слева направо. (Операция присваивания (=) является исключением из этого правила.) Поэтому в операторе
butter = 25.0 + 60.0 * n / SCALE;
порядок операций следующий:
60.0 * n = 60.0*6 = 360.0;
360.0/SCALE=360.0/2.0=180.0;
25.0 + 180.0 = 205.0;
Если вы захотите, скажем, чтобы сложение выполнялось перед делением, тогда вы должны делать то же, что делается в приведенной ниже строке:
hour = (25.0 + 60.0 * n) / SCALE;
В первую очередь выполняется все, что заключено в скобки; внутри действуют обычные правила. В данном примере сначала выполняется умножение, а затем сложение. С помощью этих действий вычисляется выражение в скобках, и только потом результат делится на значение константы SCALE.
Порядок выполнения некоторых операций:
+ (сложение) слева направо.
- (вычитание) слева направо.
* (умножение) слева направо.
/ (деление) слева направо.
- (унарный минус) слева направо
= (присвоение) справа налево
Унарный знак минус связан с величиной, стоящей справа от него.
В приложении в конце конспекта приведена таблица, где содержатся правила вычисления операций, относящиеся ко всем операциям языка Си.
/* ПРОГРАММА:
who_higher.c - применение правил старшинства.
*/
/*#############################################*/
/*============================= include */
#include<stdio.h>
/*============================= main() */
main()
{/*.---------------------------.begin main() */
int top, score;
top = score = -(2 + 5)*6 + (4 + 3*(2 + 3));
printf("top = %d; score=%d; \n", top, score);
return 0;
}/*.---------------------------.end main() */
/*#############################################*/
РЕЗУЛЬТАТ РАБОТЫ ПРОГРАММЫ.
top= -23; score = -23;
ПОЯСНЕНИЯ К ПРОГРАММЕ.
-
Выражения, стоящие в скобках, имеют наивысший приоритет. Двигаясь слева направо, встречаем первое выражение в скобках (2+5). Вычисляя его, получаем top = score = -7*6 + (4 + 3*(2 + 3))
-
Следующее выражение в скобках - это (4 + 3*(2 + 3)). Отбрасываем скобки, получаем 4 + 3*(2 + 3).
-
Находим сумму 2+3. Выражение примет вид: top = score = -7*6 + (4 + 3*5). Мы должны еще завершить вычисление выражения в скобках. Поскольку умножение * имеет приоритет более высокий, чем сложение +, выражение теперь выглядит так top = score = -7*6 + (4 + 15).
-
Далее имеем top = score = -7*6 + 19.
-
Унарный минус (изменение знака) имеет более высокий приоритет, чем умножение *. Поэтому сначала число 7 превращается в число -7, а затем -7 умножается на 6. Строка примет вид top = score = -42 + 19
-
В результате сложения получим toр = score = -23.
-
Затем переменной score присваивается значение -23.
-
Наконец, переменная top получает то же значение -23.
Напомним, что операция присваивание = выполняется справа налево.