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

Сводка приоритетов операций

В табл. 2.8 приведены приоритеты всех операций, определенных в С. Необходимо помнить, что все операторы, кроме унарных и "?", связывают (присоединяют, ассоциируют) свои операнды слева направо. Унарные операторы (*, &, -) и "?" связывают (присоединяют, ассоциируют) свои операнды справа налево.

Наивысший

( ) [ ] -> .

Наинизший

! ~ ++ -- - (type) * & sizeof * / % + - << >> < <= > >= == != & ^ | && || ?: = += -= *= /= и т.д.

Таблица. Приоритеты операций в языке C

В данном случае под оператором имеется в виду, конечно, знак операции.

Выражения

Выражения состоят из операторов, констант, функций и переменных.В языке С выражением является любая правильная последовательность этих элементов. Большинство выражений в языке С по форме очень похожи на алгебраические, часто их и пишут, руководствуясь правилами алгебры. Однако здесь необходимо быть внимательным и учитывать специфику выражений в языке

Порядок вычислений

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

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

Явное преоразование типов: операция приведения типов

Программист может "принудительно" преобразовать значение выражения к нужному ему типу, используя операцию приведения типов. Общая форма оператора явного приведения типа:

(тип) выражение

Здесь тип— это любой поддерживаемый тип данных. Например, следующая запись преобразует значение выражениях/2к типуfloat:

(float) х/2

Явное преобразование типа — это операция. Оператор приведения типа является унарным и имеет тот же приоритет, что и остальные унарные операторы.

Иногда приведение типов может быть весьма полезным. Допустим, целую переменную нужно использовать как параметр цикла, притом в вычислении участвует и дробная часть числа. В следующем примере показано, как с помощью приведения можно сохранить точность:

#include <stdio.h>

int main(void) /* печать i и i/2 с дробной частью */

{

int i;

for(i=1; i<=100; ++i)

printf("%d / 2 is: %f\n", i, (float) i /2);

return 0;

}

Без операции приведения (float)выполнялось бы целочисленное деление. Дробная часть результата выводится благодаря приведению типа переменной

Операция определения размера sizof

Унарная операция sizeof, выполняемая во время компиляции программы, позволяет определить длину операнда в байтах. Например, если компилятор для чисел типаintотводит 4 байта, а для чисел типаdouble— 8, то следующая программа напечатает 8 4.

double f;

printf("%d ", sizeof f);

printf("%d", sizeof(int));

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

В языке С определяется (с помощью спецификатора класса памяти typedef) специальный типsize_t, приблизительно соответствующий целому числу без знака. Результат операцииsizeofимеет типsize_t. Но практически его можно использовать везде, где допустимо использование целого числа без знака.

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

/* Запись шести целых чисел в дисковый файл. */

void put_rec(int rec[6], FILE *fp)

{

int len;

len = fwrite(rec, sizeof(int)*6, 1, fp);

if(len != 1) printf("Ошибка при записи");

}

Приведенная функция put_rec()компилируется и выполняется правильно в любой среде, в том числе на 16- и 32-разрядных компьютерах.

И в заключение: оператор sizeofвыполняется во время трансляции, его результат в программе рассматривается как константа.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]