Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
л_4_Операции_и_выражения.doc
Скачиваний:
10
Добавлен:
05.11.2018
Размер:
660.99 Кб
Скачать

Определение размера sizeof

Результат представляет целую константу, выражающую объем в байтах области памяти, занимаемой операндом (например, массивом),

или объём переменной определённого типа.

Синтаксис: sizeof унарное_выражение или

sizeof (имя типа) или

sizeof (тип_класса).

Например, выражение:

n=sizeof(arname)/sizeof(int);

позволяет вычислить количество элементов в массиве arname типа int.

Вызов функции ( )

Круглые скобки играют роль бинарной операции при вызове функции. Они как операция обязательны в обращении к функции:

имя_функции (список_аргументов);

Здесь операндами служат имя_функции и список_аргументов. Результат вызова вычисляется в теле функции, структуру которого задает ее определение.

Существуют два способа вызова функции:

имя_функции (e1, e2, …, en);

(*указатель_на_функцию) (e1, e2, …, en);

Указатель на функцию – это переменная, содержащая адрес функции. Значение самого выражения вызова функции, если оно имеется, определяется оператором возврата в определении функции.

Индексация [ ]

Квадратные скобки также играют роль бинарной операции при индексировании элементов массива. В выражении имя_массива [индекс] операндами служат имя_массива и индекс. Индекс определяет не номер элемента, а его смещение относительно начала массива.

Операция запятая ,

Операция запятая – задание последовательности – бинарный оператор. Синтаксис Е1, Е2, …, Еn. Выражение дает в результате вычисляемые слева направо Еi, а значение и тип Еn определяет результат всего выражения в целом. Скобки, как обычно, помогают устанавливать и «противостоять стандартному» приоритету операций.

Например:

i = 1, 2; //в переменной i значение 1, т.к. у присваивания выше приоритет

i = (1, 2); //в переменной i значение 2.

i = (1, 2, -3); //в переменной i значение -3.

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

int func (int); //прототип функции

int i, j;

func( ((i=1), (j=2), i*j )); //вызов функции с одним аргументом, равным i*j

// переменные i и j получили новые значения и только после этого //было вычислено значение аргумента i*j func(i), g(), h(); //последовательный вызов всех функций

double d[3]={1,2,3};

cout << d[0,1]<< endl; //2 объяснить!!!

Операция расширения области видимости ::

Операция имеет две формы: унарную и бинарную. Соответственно, синтаксис: ::имя или имя_класса::функция. Первая форма (унарная) операции расширения области видимости позволяет осуществлять доступ к глобальному (или с продолжительностью файла) имени даже в том случае, когда это имя скрыто локальным «переобъявлением». Вторая форма (бинарная) использует имя класса с модификатором области действия, обозначающим, что функция, хотя и определена вне класса, в действительности является методом этого класса и существует в области действия класса.

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

Преобразование типов бывает:

  • автоматическое (неявное)

  • явное

Преобразование типа – операция времени выполнения. Компилятор выполняет преобразование типа во время выполнения операции и значение преобразуемой переменной в памяти не изменяется. В то же время при преобразовании типов нужно различать преобразования, изменяющие внутреннее представление данных, и преобразования, изменяющие только интерпретацию внутреннего представления. Например, при переводе данных типа unsigned int в int, их внутреннее представление не меняется, изменяется только интерпретация. При преобразовании типа float в int недостаточно изменить только интерпретацию, необходимо изменить длину участка памяти для внутреннего представления и кодировку. При таком преобразовании из float в int возможен выход за диапазон допустимых значений типа int, и реакция на эту ситуацию существенно зависит от конкретной реализации. Именно поэтому для сохранения мобильности программ в них рекомендуется с осторожностью применять преобразование типов.

Наиболее часто компилятор выполняет автоматическое (неявное) преобразование типов. Неявное преобразование типов проводится: при смешивании в одном выражении операндов разных типов:

  • при выполнении операций в выражениях (при смешивании в одном выражении операндов разных типов);

  • перед выполнением операции присваивания результат приводится к типу переменной слева от знака операции;

  • в случае, если одна и та же область памяти попеременно содержит данные то одного, то другого типа (совмещение в памяти данных разных типов); это происходит, например, при использовании объединений.

При этом:

  • операнды разных типов приводятся к «старшему», т.е. более длинному типу (типы в порядке возрастания их старшинства: битовое_поле, char, int, unsigned, long, unsigned long, float, double, long double);

  • при выполнении операции присваивания может возникнуть ситуация преобразования старшего типа к младшему;