- •Основные элементы языка Си Константы
- •Константы целого типа
- •Задание.
- •Беззнаковые и длинные целые константы
- •Константы с плавающей точкой
- •Escape-последовательности
- •Символьные константы
- •Строковые константы
- •Задание.
- •Вопросы.
- •Основные операции языка Си Общие положения
- •Арифметические операции
- •Унарные операции
- •Унарный минус
- •Операция унарный плюс.
- •Задание.
- •Операции инкремента и декремента
- •Задание.
- •Операции отношения и логические операции
- •Задание.
- •Операции присваивания
- •Примеры.
- •Задание.
- •Побитовые операции
- •Задание.
- •Логические побитовые операции
- •Задание.
- •Маскирование
- •Пример.
- •Задание.
- •Пример.
- •Задание.
- •Пример.
- •Пример.
- •Задание.
- •Пример.
- •Примеры.
- •Задание
- •Oперации присваивания и побитовые операции
- •Примеры.
- •Условная операция
- •Примеры.
- •Пример.
- •Задание.
- •Побочные эффекты. Приоритеты и порядок выполнения операций
- •Пример.
- •Пример.
Операции инкремента и декремента
Операции ++ (инкремент) и – (декремент) вызывают соответственно увеличение или уменьшение операнда на единицу. Необычность операций ++ и ---- состоит в том, что их можно использовать как префиксные, так и как постфиксные. Различие в выполнении этих двух вариантов операций заключается в том, что при префиксной записи значение операнда меняется до того как он используется, а при постфиксной записи — после использования операнда. Например, пусть a=2. Тогда после x=a++; x примет значение 2, а после вычисления x=++a; x будет присвоено 3.
Операции инкремента и декремента можно применять только к переменным любого типа, но не к выражениям.
Рассматриваемые операции обозначаются двумя символами, между которыми не должно быть пробела. Это относится и к другим двухсимвольным обозначениям операций: >=, += и т.д.
Есть случай, когда префиксная и постфиксная записи дают один и тот же результат, а именно если выражение содержит единственную операцию.
То есть, две инструкции в программе, имеющие вид
a++; и ++а;
равносильны по действию.
В одном выражении не рекомедуется смешивать использование переменной с операциями инкремента и декремента и без них, так как это может привести к непредсказуемому результату. Например, при i=1 выполнение инструкции
printf("%d %d",i,++i);
приводит к печати вместо предполагаемых 1 и 2, значений 2 и 2, так
как вначале вычисляются все аргументы, и только затем производится печать
(стандарт языка здесь никаких ограничений не накладывает).
Остальные унарные операции (!, sizeof и приведения типа) будут
рассмотрены позже.
Задание.
1. Что будет напечатано фрагментами программы, если начальное значение i=1?
a) printf("i=%d\n",i); б) printf("i=%d\n",i);
printf("i=%d\n",++i); printf("i=%d\n",i++);
printf("i=%d\n",i); printf("i=%d\n",i);
2. Какие значения получат переменные x,y,z после вычислений, если начальные значения переменных a=1, b=2?
x=a++-1;
y=a++ +++b;
z= a/++a;
Операции отношения и логические операции
В Си имеется четыре операции проверки отношений, которые образуют группу с приоритетом, меньшим чем у унарных и арифметических операций.
<
<=
>
>=,
Тесно связаны с ними операции проверки равенства == (равно) и != (не равно), у которых своя группа приоритета, причем ниже чем у операций отношения.
Распространенной ошибкой является использование знака "присвоить" = вместо "равно" ==. Операция "равно" не меняет значений операндов и тем самым принципиально отличается от "присвоить".
Обычно компиляторы выдают предупреждение о возможности такой ошибки, хотя такая замена знака операции не приводит к синтаксической ошибке.
Все шесть приведенных операций используются для формирования логических выражений, описывающих некоторые условия и принимающих значения "истина" или "ложь". В Си нет специальных логических значений, вместо них приняты числовые: 1 - "истина", 0 - "ложь".
Сложные условия со значениями "истина" или "ложь" формируются с помощью двух логических связок:
&& логическое "и",
|| - логическое "или".
Приоритет операции && (логическое умножение) выше, чем у || (логическое сложение).
В логических выражениях используется также операция отрицания !.Значение "истина" она обращает в "ложь" и наоборот. Поэтому, если ее применить к переменной с нулевым значением, то результатом будет единица. Если же ее применить к переменной с любым ненулевым значением, то результатом будет 0.
В контексте логических выражений любое ненулевое значение (не только 1) истолковывается как "истина". Например, если x = 2 и y =3, то x && y дает результат "истина", т.е. 1.
Сложные логические выражения, состоящие из простых логических выражений со связками && и || между ними вычисляются слева направо до тех пор, пока не появиться возможность установить значение всего выражения в целом. Поэтому для получения значения сложного выражения не всегда необходимость вычислить все его операнды. Иногда может хватить даже одного. Например, если в выражении
e<.001 && c>100
первое отношение не выполняется, то второе вычислять не нужно: уже ясно, что значением всего выражения будет "ложь". Аналогично, если в выражении
e<.001 || c>100
первое отношение истинно, то истинно и все выражение.