Реферат: Операции языка Cи

Кафедра: Автоматика и информационныетехнологии


ОПЕРАЦИИ ЯЗЫКА СИ


Содержание

ХАРАКТЕРИСТИКИ ОПЕРАЦИЙ

Таблица приоритетов операций

Комментарии к операциям

Правила преобразований типов

В выражениях

В присваиваниях

ЛАБОРАТОРНЫЕ ЗАДАНИЯ

Основные арифметические операции

Операции присваивания.

Логические операции и операции инкремента.

Поразрядные операции.       

Отношения и условия

Выполнение операций и их приоритеты

Основные типы данных        

Приведение целых и вещественных типов

Приведение целых и вещественных выражений

ОТВЕТЫ К ЗАДАНИЯМ

ДОПОЛНИТЕЛЬНЫЕ ЗАДАНИЯ

БИБЛИОГРАФИЧЕСКИЙ СПИСОК


/>Характеристики операций

Операция – это элементарная конструкция, котораявозвращает некоторый результат. В отличие от операций, операторы –синтаксические конструкции, управляющие ходом выполнения программы. Основныеоператоры: условные переходы и циклы.

По количеству аргументов операции бывают унарные,бинарные и имеется одна тернарная операция «Условие».

Если одна и та же операция встречается в выражениинесколько раз, то говорят о лево-ассоциативных и право-ассоциативных операциях.В первом случае данная операция выполняется слева направо, во втором – справаналево.

/> Таблица приоритетовопераций

Операции, расположенные в таблице выше, имеют большийприоритет.

Таблица 1

№ операции Группа операций Обозначение операции Название операции Название на сленге Ассоциативность 1             первичные () круглые скобки 1. () [] -> :: . ® 2             [] индексация Квадратные скобки ® 3             -> Обращение к элементу структуры по указателю на структурную переменную стрелка ® 4             :: Разрешение видимости Четвероточие ® 5             . Обращение к элементу структуры по имени структурной переменной Точка ® 6             унарные ! Логическое отрицание Восклицательный знак ← 7             ~ Побитовое инвертирование Тильда ← 8             ++

Автоматический инкремент ++х;

Отложенный инкремент х++

Плюс-плюс ← 9             --

Автоматический декремент --х;

Отложенный декремент х--

Минус-минус ← 10           - Обращение знака Минус ← 11           + Подтверждение знака плюс ← 12           (тип) Явное приведение типа ← 13           * Разыменование указателя Звездочка ← 14           & Взятие адреса Амперсанд ← 15           sizeof Размер в байтах аргумента sizeof ← 16           new Операция выделения динамической памяти new ← 17           delete Операция освобождения динамической памяти delete ← 18           мультипликативные * умножение умножение ® 19           / деление деление ® 20           % Деление по модулю процент ® 21           аддитивные

+

-

Сумма

разность

Сложение

Разность

® 22           сдвиги <<  Побитовый сдвиг влево Меньше-меньше ® 23           >>  Побитовый сдвиг вправо больше-больше ® 24           отношения

<

<=

>

>=

Меньше

Меньше равно

Больше

Больше равно

® 25           Сравнение == Сравнение на равенство ® 26           != Сравнение на неравенство 3. .* ->* ® 27           поразрядные & Побитовое «И» амперсанд ® 28           ^ Побитовое взаимоисключающее «ИЛИ» крышка ® 29           | Побитовое «ИЛИ» Побитовое «ИЛИ» 30           логические && Логическое «И» «И» 31           || логическое «ИЛИ» «ИЛИ» 32           Условие ?: Условное выражение Вопросительный знак ← 33           присваивания = Присваивание Равно ← 34           *= /= %= += -= &= ^= |= <<= >>= Комбинированные присваивания Умножить равно и т.д. ← 35           запятая , запятая запятая ®

Ассоциативность «слева направо» означает группировкуопераций таким образом: запись A1 @ A2 @ A3 означает ((A1 @ A2) @ A3).

Ассоциативность «справа налево» обрабатывает запись A1@ A2 @ A3 как (A1 @ (A2 @ A3)).

Комментариик операциям

/>/>1. ()– самая сильная операция. Выражение (2*(4+5)) равно 18.

2. [] индексирует элементы массивов. А[3][6] – втретьей строке шестой элемент. Индексация начинается с нуля, то есть А[0][0] –начальный элемент массива.

3. Операция -> используется с указателями наструктурные переменные и на объекты классов. Например,

struct Pixel

{

intx,y;

charcol;

};

Pixel A, *ptr;

ptr = &A;

ptr->x = 100;

4. Операция :: применятся для обращения кглобальным переменным, скрытым локальными переменными.

intx = 2;

voidmain()

{

intx=5;

printf(“%d”,x + ::x); //7

}

5. Операция “точка” используется с структурнымипеременными и над объектами классов. Например,

Pixel A;

А.x = 100;

6. В языке Си нет логических констант true и false.Вместо этого все, что не ноль считается истинным, а ноль любого типа считаетсяложью. При этом представителем истины является 1.

Таблица 2.

Таблица истинности операциилогического отрицания

x ноль не ноль !x 1

7. Побитовое инвертирование применяется только к целымаргументам. Для получения результата аргумент необходимо преобразовать в двоичнуюсистему счисления. Количество разрядов должно соответствовать типу аргумента.

Таблица 3.

Таблицаистинности

x 1 ~x 1

Пример.

charx = 20,y;

y= ~x;

Так как х = 20 = 000101002, то y = 11101011. Переменнаяy является знаковой, поэтому ее содержимое компилятор будетинтерпретировать как число со знаком, то есть отрицательное. Найдем это числоиз схемы

y = 1110 1011

+

-y = 0001 0101

= 0000 0000

Так как –y = 21, то y = -21.

8. Автоматический инкремент увеличивает аргумент наединицу. Применяется к любым типам. Операция ++x эквивалентнаоператору x = x + 1, но занимает меньше места и удобнее в сложныхвыражениях. Отложенный инкремент x++ увеличивает аргумент на единицупри следующей встрече этой переменной. Не учитывается ее использование встроках и комментариях. Заметим, что название языка Си++ происходит от этойоперации Автор Си++ Б.Страустрап видимо, предполагал, что этот язык на порядоклучше своего предшественника, языка Си.

9. Операция декремента аналогично уменьшает аргументна единицу.

Пример. int x = 2,y = 4, z;

z = x++ + ++x + y-- + --y;

В результате x = 4,y = 2, z = 2+ 4+ 4+ 3= 13.

10. Операция –x являетсястандартной, она не меняет значения x.

11. Операция +x лишена смысла.

12. Явное преобразование типа не меняет типа своегоаргумента и влияет только на тип результата. Запись (int)2.1 вернет число 2.Используется, как правило, при работе с указателями. Для числовых константприменяется неявное преобразование типа.

13. Операция «звездочка» применяется только куказателю и возвращает переменную, на которую указывает этот указатель. Можетнаходиться в левой части операции присваивания (Lvalue) и в правой части(Rvalue). В первом случае результат операции – сама ячейка, на которуюуказывает указатель, Во втором случае – содержимое этой ячейки.

14. Взятие адреса применяется к любому идентификатору,с которым связана область ОЗУ. Возвращает логический адрес самого левого байтапамяти, которую занимает этот идентификатор. Это могут быть переменные базовыхтипов, другие указатели, элементы массивов, структурные переменные. Дляопределения типа результата этой операции, надо добавить к типу аргумента однузвездочку.

Пример.

intx = 3, y, *px;

px= &x; // указательpx указывает на переменную x

y=* px; // y=3

*px= y+1; //x=4

Типом выражения &y является int*, а тип записи&px это int **.

15. Операция sizeof возвращает размер «чего угодно» вбайтах. Например, sizeof(float) = 4, sizeof(20) = 2, для дальних адресовsizeof(float*) = 4.

16. Операция new выделяет динамическую память ивведена в языке Си++. Ее аналогом в Си является функция malloc.

17. Операция delete освобождает динамическую память,выделенную ранее операцией new. Ее аналогом в Си является функция free.
Пример.

int*pi = newint;

*pi= 100;

deletepi;

18. Умножение * является обычной операцией.

19. Деление / осуществляется обычным образом, еслиодин из аргументов имеет вещественный тип. Если оба аргумента – целые, тооперация возвращает только целую часть результата.

20. Деление % применяется только для двух целыхаргументов и возвращает целочисленный остаток от деления.

Например, 20.0/3= 6.33333,20/3= 6,20%3= 2.

Пример. Имеет место тождество

b= a * (b/a)+ b%a.

Пример. Если m – трехзначное целое число abc, то a =m/100, c = m%10, b = m%100/10.

Мультипликативные операции имеют одинаковый приоритет.

21. Аддитивные операции обычны.

22. Бинарная операция сдвига используется для двухаргументов только целого типа. Левый аргумент надо преобразовать к двоичномувиду. Правый аргумент указывает, на сколько бит необходимо произвести сдвиг.
При сдвиге влево x << y левые биты числа xпропадают, новые биты справа заполняются нулями. Операция x << yравносильна умножению x × 2y.

23. При сдвиге вправо x >> yправые биты числа x пропадают, новые биты слева заполняются знаком числа x.Если x отрицательно, то новые биты равны 1, приположительном х новые биты равны 0. Операция x >> yравносильна делению нацело x / 2y.

Пример.

charx =20,y =-10;

unsignedchar z =20;

Тогда x>> 2= 000101002 >> 2= 000001012 = 5

x << 2 = 000101002 << 2 = 010100002 = 80

x << 3 = 000101002 << 3 = 101000002 = 160 – 256 =-94– логическая ошибка выхода задиапазон типа char

y >> 3 = 111101102 >> 3 = 111111102 = -2

z >> 3 = 000101002 >> 3 = 000000102 =2

24-26. Операции отношения и сравнения обычны. В случаеистины они возвращают 1, при нарушении возвращают 0.

27-29. Побитовые операции применяются для целыхаргументов.

Таблица 4.

Таблицыистинности

& 1 ^ 1 | 1 1 1 1 1 1 1 1 1 1

Пример.

7& 9= 00000111& 00010001= 000000012= 1

7^ 9= 00000111^ 00010001= 000101102= 22

7| 9= 00000111| 00010001= 000101112= 23

30-31. Логические операции возвращают 1 (истину) или 0(ложь).

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

Пример.

7 && 9 =1

32. Операция «Условие» позволяет иногда заменитьусловный оператор if-else на операцию.

Пример. Максимальное из двух чисел равно max= (x > y)? x: y;

Максимальное из трех чисел равно

max= (x >y)? ( x> z?x:z): ( y >z?y:z);

33. Результатом присваивания является значение того,что присвоено левому аргументу.

34. Комбинированное присваивание x op = yявляется компактной записью оператора x = x op y. Однакокомпилятор эту замен не производит. Комбинированное присваивание являетсяотдельной операцией.

35. «Запятая» является, пожалуй, самой экзотическойоперацией языка Си. Результатом выражения x,yявляется число y.

Пример.

x = 2,5; // x = 2, таккак присваивание сильнее запятой

x = (2,5); // x = 5

По-видимому, здесь хотели написать x=2.5

Правилапреобразований типов/>В выражениях

Если операнд имеет тип не int и не double, то сначалаприводится:

-           signed char --> intрасширением знакового бита (7)

-           unsigned char --> intдополнением нулями слева

-           short --> int расширениемзнакового бита (15)

-           unsigned short --> unsignedint дополнением нулями слева

-           enum --> int порядковый номерв перечислимом типе

-           float --> double дробная частьдополняется нулями

Если какой-нибудь операнд имеет тип double, unsignedlong, long или unsigned int то и другой операнд приводится к тому же типу.Результат: того же типа.

Если оба операнда имеют тип int, то результат тожетипа int.

При вызове функций их аргументы – тоже выражения,поэтому в них приводятся char,short к int и float к double. Это говорит о том,что аргументы (формальные параметры) функций можно всегда объявлять как int иdouble вместо char,short и float соответственно.

Зато спецификатор unsigned является существенным.

/>В присваиваниях

op = expr;

Тип выражения expr приводится к типу левой части – op.При этом возможны приведения более «длинного» типа к более«короткому» при помощи усечения, вроде:

-           int --> char обрубаетсястарший байт.

-           long --> int обрубаетсястаршее слово.

-           float --> int отброс дробнойчасти

-           double --> int и обрубаниемантиссы, если не лезет.

-           double --> float округление дробнойчасти.

Вот еще некоторые приведения типов:

-           signed --> unsigned виртуально(просто знаковый бит

-           unsigned --> signed считаетсязначащим или наоборот).

-           unsigned int --> longдобавление нулей слева.

-           int --> long расширениезнакового бита.

-           float --> int преобразованиевнутреннего.

-           int --> float представления:машинно зависимо.

Некоторые преобразования могут идти в несколькостадий, например:

-           char --> long это

-           char --> int -->long

 char --> unsigned long это

-           char --> int -->unsigned long


Лабораторныезадания Основные арифметическиеоперации

Что напечатаетследующая программа?

#include<stdio.h>

main()

{

intx;

x= -3 + 4 * 5 — 6;  printf("%d\n",x);

x= 3 + 4 % 5 — 6;  printf("%d\n",x);

x= -3 * 4 % — 6 / 5; printf("%d\n",x);

x= (7 + 6) % 5 / 2; printf("%d\n",x);

return 0;

}

 Операции присваивания.

Что напечатаетследующая программа ?

#include <stdio.h>

#define PRINTX  printf("%d\n",x)

main()

{

int x=2,y,z;

x *= 3 + 2;    PRINTX;

x *= y = z =4;  PRINTX;

x = y == z;    PRINTX;

x == (y = z);  PRINTX;

return 0;

}


Логические операции иоперации инкремента.

Что напечатаетследующая программа ?

#include <stdio.h>

#define PRINT(int)  printf("%d\n",int)

main()

{

int x,y,z;

x=2; y=1; z=0;

x = x && y || z;  PRINT(x);

PRINT(x ||! y && z);

x=y=1;

z = x ++ — 1;    PRINT(x);

PRINT(z);

z += — x ++ + ++ y; PRINT(x);

PRINT(z);

z = x / ++ x;    PRINT(z);

return 0;

}

 Поразрядные операции.

Что напечатаетследующая программа ?

#include <stdio.h>

#define PRINT(int)  printf("%d\n",int)

main()

{

int x,y,z;

x=03; y=02; z=01;

PRINT( x | y & z );

PRINT( x | y & ~z );

PRINT( x ^ y & ~z );

PRINT( x & y && z );

x=1; y=-1;

PRINT(! x | x );

PRINT( ~ x | x );

PRINT( x ^ x );

x <<= 3; PRINT(x);

y <<= 3; PRINT(y);

y >>= 3; PRINT(y);

return 0;

}

 Отношения и условия

Что напечатаетследующая программа ?

#include<stdio.h>

#definePRINT(int)  printf("%d\n",int)

main()

{

int x=1,y=1,z=1;

x += y += z;

PRINT( x < y? y: x );

PRINT( x < y? x ++: y ++ );

PRINT(x);

PRINT(y);

PRINT( z += x < y? x ++: y ++);

PRINT(y);

PRINT(z);

x=3; y=z=4;

PRINT( (z >= y >= x)? 1: 0);

PRINT( z >= y && y >=x );

return 0;

}

 Выполнение операций иих приоритеты

  Что напечатаетследующая программа ?

#include <stdio.h>

#define PRINT(x,y,z)  printf(«x=%d\ty=%d\t z=%d\n»,x,y,z)

main()

{

int x,y,z;

x=y=z=1;

++ x || ++ y && ++ z; PRINT(x,y,z);

x=y=z=1;

++ x && ++ y || ++ z; PRINT(x,y,z);

x=y=z=1;

++ x && ++ y && ++ z; PRINT(x,y,z);

x=y=z=-1;

++ x && ++ y || ++ z; PRINT(x,y,z);

x=y=z=-1;

++ x || ++ y && ++ z; PRINT(x,y,z);

x=y=z=-1;

++ x && ++ y && ++ z; PRINT(x,y,z);

return 0;

}

 Основные типы данных

Что напечатает следующая программа?

#include<stdio.h>

#definePRINTd(x) printf("%d\n",x);//десятичноечисло со знаком

#define PRINTc(x)  printf("%c\n",x);//символсascii-кодом x

#define PRINTo(x)  printf("%o\n",x);//восьмеричноечисло со знаком

#define PRINTs(x)  printf("%s\n",x);//строковаяконстанта

int  integer =5;

char character='5';

char* string  =«5»;

main()

{

PRINTd(string);

PRINTd(character);

PRINTd(integer);

PRINTs(string);

PRINTc(character);

PRINTc(integer=53);

PRINTd( '5'>5 );

{

int sx=-8;

unsigned ux=-8;

PRINTo(sx); PRINTo(ux);

PRINTo( sx>>3 ); PRINTo(ux>>3 );

PRINTd( sx>>3 ); PRINTd(ux>>3 );

}

return 0;

}

 Приведение целых ивещественных типов

Что напечатает следующая программа ?

#include <stdio.h>

#define  PRi(x)    printf(«i=%.8g\t»,(double)x)

#define  PRl(x)    printf(«l=%.8g\t»,(double)x)

#define  PRf(x)    printf(«f=%.8g\t»,(double)x)

#define  PRd(x)    printf(«d=%.8g\t»,(double)x)

#define  NL      putchar('\n')

#define  PRINT4(x1,x2,x3,x4) PRi(x1);PRl(x2);PRf(x3);PRd(x4);NL

main()

{

double d;

float f;

long l;

int i;

i=l=f=d= 100/3;     PRINT4(i,l,f,d);

d=f=l=i= 100/3;     PRINT4(i,l,f,d);

i=l=f=d= 100/3.;     PRINT4(i,l,f,d);

d=f=l=i= (double)100/3; PRINT4(i,l,f,d);

i=l=f=d= (double)(100000/3);PRINT4(i,l,f,d);

d=f=l=i= (double)100000/3; PRINT4(i,l,f,d); return 0;

}

Приведениецелых и вещественных выражений

Что напечатает следующая программа ?

#include <stdio.h>

#define  NL       putchar('\n')

#define  PR(x)     printf("%g\t",(double)x)

#define  PRINT1(x1)   PR(x1);NL

#define  PRINT2(x1,x2) PR(x1);PR(x2);NL

main(){

double d=3.2 ,x; int   i=2 ,y;

x= ( y= d/i ) *2; PRINT2(x,y);

y= ( x= d/i ) *2; PRINT2(x,y);

y= d *( x= 2.5/d ); PRINT1(y);

x= d *( y= ( (int)2.9 + 1.1 )/d );

PRINT2(x,y);

return 0;

}

 Ответы к заданиям

1.        11  1  0  1

2.         10  40  1  1

3.        1  1  2  0  3  0  1

4.        3  3      1  1  1  -1  0  8  -8  -1

5.        3  2 3  3  4  4  4  0  1

6.        x=2 y=1 z=1         x=2 y=2 z=1

          x=2 y=2 z=2

          x=0 y=-1 z=0

          x=0 y=0 z=-1

          x=0 y=-1 z=-1

7.        175 — младший байт адреса вдесятичной форме        53 5 5 5 1

          sx= 177770

          ux= 177770

sx>>3 = 177777 знак переносится присдвиге

ux>>3 = 17777  знак не переноситсяпри сдвиге

          -1

          8191

8.        i=33 l=33 f=33 d=33     i=33 l=33f=33

 d=33

          i=33 l=33 f=33.333332d=33.333333

          i=33 l=33 f=33 d=33

          i=-32203 l=33333 f=33333d=33333

          i=-32203 l=-32203f=-32203 d=-32203

9.        x=2 y=1      x=1.6 y=3

          y=2

          x=0  y=0

Дополнительныезадания

1.        Напишите выражение для определениясуммы 0-го и 3-го битов числа int x.

2.        Напишите выражение для определенияколичества единиц в числе char х.

3.        Установить в единицу 3-ий и 5-ыйбиты переменной int x. Сбросить в ноль 9-ый и 13-ыйбиты переменной int x.

4.        Что напечатает фрагмент программы

int x=100, y=7, z;

z = (x / y) % 5 * 3;

printf(“%d”, z);

5.        Что напечатает фрагмент программы

int x=10, y=-70, z;

z = x<< 3 + y >> 2;

printf(“%d”, z);

6.        Переменная int x содержитчетырехзначное натуральное число abcd. С помощью операций / и %найдите цифры a, b, c, d.  

7.        Найдите с помощью операций«условие» максимальное из трех чисел. Использовать только один оператор в виде max= …… ;

8.        Запишите в виде одного логическоговыражения принадлежность точки (x, y) уpезанному единичному квадpату

/>


Рис.1.


Библиографическийсписок

1.        Керниган Б., Ритчи Д., Фьюэр А.Язык программирования Си: Задачи по языку Си. М.: Финансы и статистика, 1985. –192с.

2.        Керниган Б., Ритчи Д. Языкпрограммирования Си. М.: Финансы и статистика, 1992. — 272с.

3.        Подбельский В.В., Фомин С.С.Программирование на языке Си. Учеб. пособие. М.:Финансы и статистика, 2004. 600 с.

еще рефераты
Еще работы по информатике, программированию