Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЭЛЕМЕНТЫ ЯЗЫКА C.doc
Скачиваний:
8
Добавлен:
05.11.2018
Размер:
476.16 Кб
Скачать
      1. Операция sizeof

С помощью операции sizeof можно определить размер памяти, которая соответствует идентификатору или типу. Операция sizeof имеет следующий формат:

sizeof(выражение)

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

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

Когда sizeof применяются к имени типа структуры или объединения или к идентификатору имеющему тип структуры или объединения, то результатом является фактический размер структуры или объединения, который может включать участки памяти, используемые для выравнивания элементов структуры или объединения. Таким образом, этот результат может не соответствовать размеру, получаемому путем сложения размеров элементов структуры.

Пример:

struct { char h;

int b;

double f;

} str;

int a1;

a1 = sizeof(str);

Переменная а1 получит значение, равное 12, в то же время если сложить длины всех используемых в структуре типов, то получим, что длина структуры str равна 7.

Несоответствие имеет место в виду того, что после размещения в памяти первой переменной h длинной 1 байт, добавляется 1 байт для выравнивания адреса переменной b на границу слова (слово имеет длину 2 байта для машин серии IBM PC AT /286/287), далее осуществляется выравнивание адреса переменной f на границу двойного слова (4 байта), таким образом в результате операций выравнивания для размещения структуры в оперативной памяти требуется на 5 байт больше.

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

struct { double f;

int b;

char h;

} str;

    1. Программирование вычислительных структур

      1. Исполняемые операторы

Все исполняемые операторы языка СИ могут быть условно разделены на следующие категории:

- условные операторы, к которым относятся оператор условия if и оператор выбора switch;

- операторы цикла (for, while, do while);

- операторы перехода (break, continue, return, goto);

- другие операторы (оператор «выражение», пустой оператор).

Операторы в программе могут объединяться в составные операторы с помощью фигурных скобок.

{ [oбъявление]

:

оператор; [оператор];

:

}

Для операторов перехода и циклов составной оператор рассматривается как один оператор.

Выполнение составного оператора заключается в последовательном выполнении составляющих его операторов.

Пример:

int main ()

{

int q,b;

double t,d;

:

{

int e,g;

double f,q;

:

}

:

return (0);

}

Переменные e,g,f,q будут уничтожены после выполнения составного оператора. Отметим, что переменная q является локальной в составном операторе, т.е. она никоим образом не связана с переменной q объявленной в начале функции main с типом int. Отметим также, что выражение стоящее после return может быть заключено в круглые скобки, хотя наличие этих скобок не обязательно.

Все операторы языка СИ, кроме составных операторов, заканчиваются точкой с запятой ";".

Пустой оператор состоит только из точки с запятой. При выполнении этого оператора ничего не происходит. Он обычно используется в операторах do, for, while, if в строках, когда оператор не требуется, но по синтаксису требуется хотя бы один оператор.

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

Как вы думаете, будет ли красивым здание, построенное с хаотичным использованием белых и красных кирпичей с вкраплением бетонных плит хаотично разного размера и с хаотично не выдержанным архитектурным стилем: классицизм, минимализм, барокко, ампир! То же самое относится и к программам, тексты которых должны писаться с соблюдением стандарта проекта. Стандарт проекта должен требовать единообразного оформления исходных текстов до уровня отсутствия «трюков» программистов и невозможности по тексту выяснения автора фрагмента текста. Технологическая дисциплина проекта требует быстрого написания надежных программ. Для этого используются стандартные структуры кодирования, в которых не используются многие из возможностей операторов языка.

Кодирование программы должно осуществляться только с использованием стандартных структур! Запрещено использование меток, операторов безусловного перехода на метку (go to), операторов досрочного выхода из структур break, за исключением структуры switch!

Вообще, при использовании иного другого процедурно-ориентированного языка программирования (не Си), необходимо предварительно закодировать на используемом языке программирования все описанные в разделе методики разработки функциональных описаний стандартные структуры без изменения их логики!

Стандартные структуры кодирования, конечно, основываются на операторах языка программирования, но это не просто операторы. Так при программировании на языке Си структура УНИВЕРСАЛЬНЫЙ ЦИКЛ-ДО будет включать «лишню» операцию «!» (НЕ):

/* подготовка цикла */

do

{

/* Тело цикла */

. . .

}

while (!(L));

В приведенной выше структуре ненулевое значение переменной L соответствует окончанию выполнения цикла, а не его продолжению выполнения, как в операторе языка программирования! Использование «лишней» операции (!) НЕ никак не удлинит программу. Современные компиляторы автоматически инвертируют логическое условие завершения цикла.

Структуре СЛЕДОВАНИЕ в программах могут соответствовать: выполнение всей программы; вызов функции и процедуры; отдельный смысловой блок вычислений, который не оформлен в форму функции или процедуры (программный блок); оператор присваивания, а также оператор ввода-вывода информации; комментарий оставшихся действий.