Операции и выражения в Си. Арифметические операции. Операции инкремента ++ и декремента --

Страницы работы

Фрагмент текста работы

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–ветвь присутствует

Похожие материалы

Информация о работе