3.4 Операции и выражения в Си
Выражения в языке Си - это последовательность операндов, операций и символов-разделителей. Операнды - это переменные, константы либо другие выражения. По числу операндов, участвующих в операции, различают две группы операций: унарные (один операнд) и бинарные (два операнда). По типу выполняемой операции различают арифметические, поразрядные логические, сдвига, логические, операции отношения и др.
3.4.1. Арифметические операции. Язык Си включает стандартный набор арифметических операций сложения (+), вычитания (-), умножения (*) и деления (/), не требующих особого пояснения. Специфичными для Си являются операции определения остатка (%), инкремента (++) и декремента ( -- ).
Операцию % поясняет следующий пример:
int a=5, b=2, c;
c=a % b; // c=1 - остаток от деления 5/2
c=b % a; // с=2
Операции инкремента ++ и декремента -- могут применяться только к переменным. Существуют две формы их записи: префиксная, когда операнд располагается справа от знака операции (например, ++i, --j), и постфиксная, когда операнд располагается слева от знака операции (i++, j--). В префиксной форме (для инкремента) сначала выполняется увеличение операнда на 1, и увеличенное значение используется в выражении. В постфиксной форме (для инкремента) сначала берется значение операнда и только после этого его значение увеличивается на 1. Например:
int a=0, b=1, c;
c=a++; // c равно 0, а равно 1
c=++a; // теперь с равно 2, а равно 2
c=++; // с равно 2, b равно 2
3.4.2. Поразрядные логические операции. В Си используются:
& - поразрядное логическое И (AND);
| - поразрядное логическое ИЛИ (OR);
^ - поразрядное исключающее ИЛИ (XOR);
~ - поразрядная инверсия.
Например:
int s=0x53c9, mask=0x356c,
r_or, r_and, r_xor, r_inv;
r_or=s|mask; //r_or =0x77ed
r_and=s&mask; //r_and=0x1148
r_xor=s^mask; //r_xor=0x66a5
r_inv=s~mask; // r_inv=0xcaa3
3.4.3. Операции сдвига. Си имеет две операции поразрядного сдвига:
<< - сдвиг влево операнда на число двоичных разрядов, указанное справа от знака операции;
>> - сдвиг вправо операнда на число двоичных разрядов, указанное справа от знака операции;
Выдвигаемые биты теряются, а “вдвигаются” нулевые биты.
Сдвиг операндов влево - это наиболее быстрый способ умножения, а сдвиг вправо - деления. Например:
half_adr=adr>>1; // деление на 2
double_adr=adr<<1; // умножение на 2
3.4.4. Логические операции и операции отношения. Эти операции используются для формирования логических выражений, имеющих только два значения: 1, если логическое выражение ИСТИННО(по англ. TRUE), и 0, если логическое выражение ЛОЖНО (по англ. FALSE). Отметим, что в языке Си нет логических данных (boolean).
Операции отношения обозначаются следующим образом:
== равно; != не равно; < меньше; > больше;<= меньше или равно;>= больше или равно.
Логические операции обозначаются:
&& - логическое И;
|| - логическое ИЛИ;
! - логическое НЕ;
Рассмотрим простой пример программы, выводящей на экран результат выполнения логических операций и операций отношения:
/* logic.cpp. Иллюстрация логических операций…*/
#include<stdio.h>
main()
{
float var1,var2;
printf(“Введите первое значение(var1): ”);
scanf(“%f”,&var1);
printf(“Введите второе значение(var2): ”);
scanf((“%f”,&var2);
printf(“var1>var2 дает %d\n”,var1>var2);
printf(“var1<var2 дает %d\n”,var1<var2);
printf(“var1==var2 дает %d\n”,var1==var2);
printf(“var1!=var2 дает %d\n”,var1!=var2);
printf(“var1&&var2 дает %d\n”,var1&&var2);
printf(“var1||var2 дает %d\n”,var1||var2);
printf(“/var1 дает %d\n”,!var1);
printf(“/var2 дает %d\n”,!var2);
return 0 ;
}
Задание. Наберите программу logic.cpp и запустите её.
Проэкспериментировав с программой logic.cpp можно заметить, что, строго говоря, в Си значению ИСТИНА соответствует не только значение 1, но и любое другое ненулевое значение. Вот почему, например, если var1=15, а var2=0, то !var1 дает значение 0 ( ЛОЖЬ), а !var2 – 1 (ИСТИНА), var1 || var2 дает значение 1 (ИСТИНА), а var1 && var2 – 0 (ЛОЖЬ).
3.4.5.Преобразование типов в выражениях. Операнды, участвующие в операции, могут быть разного типа. В этом случае перед её выполнением компилятор предварительно приводит операнды к одному типу по следующему правилу.
Операнды разных типов приводятся к «старшему», т.е. к более длинному типу. Ниже перечислены типы, начиная от самого старшего, в порядке убывания старшинства: самый старший – long double, double, float, unsigned long, long int, unsigned int, int, char – самый младший.
Рассмотренные преобразования выполняются автоматически и называются неявным приведением типов. Язык Си позволяет задать и явное приведение типа операндов, используя операцию (type), где type – любой допустимый тип языка Си. Результатом операции является выражение, преобразованное к типу type. Например:
int a=8; b=5;
float var1, var2;
var1=a/b; // var1 неожиданно будет равно 1.0
var2=(float)a/(float)b; // var2 дает ожидаемое 1.6
3.4.6. Приоритет операций и порядок их выполнения. Все операции, распознаваемые компилятором, упорядочены по приоритету, который определяет порядок интерпретации выражения. Он может изменяться круглыми скобками. Приоритеты операций можно узнать в [1,2].
Важной особенностью компиляторов Turbo C и Borland C является ускоренное вычисление логических выражений: вычисление их значения прекращается тогда, когда результат уже ясен. Например, если первое же выражение в выражение1&&( выражение2 || выражение3)
дает результат ЛОЖЬ то значения остальных выражений цепочки не вычисляются.
3.5. Операторы управления вычислительным процессом
Операторы управления вычислительным процессом позволяют выполнять ветвление, циклическое повторение одного или нескольких операторов, передачу управления в нужное место кода программы.
3.5.1. Оператор if. Операторы ветвления выбирают в программе из группы альтернатив возможное продолжение вычислительного процесса. Выбор выполняется исходя из значения заданного выражения. В Си используются два оператора ветвления: if … else и switch.
Оператор if имеет следующую общую форму записи:
if (выражение)
оператор_1;
else
оператор_2;
где часть else может и отсутствовать. Сначала вычисляется “выражение” в скобках, и если оно истинно (отлично от нуля), то выполняется оператор_1. Если “выражение” ложно (равно нулю) и else–ветвь присутствует
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.