Язык программирования Си для персонального компьютера - [51]
После последнего идентификатора в списке параметров может быть записана запятая с многоточием (,…). Это означает, что число параметров функции переменно, однако не меньше, чем следует идентификаторов до многоточия.
Для доступа к значениям параметров, имена которых не заданы в списке параметров функции, рекомендуется использовать макроопределения va_arg, va_end, va_start, описанные в разделе 12.
Допускается также список параметров, состоящий только из многоточия (…) и не содержащий идентификаторов. Это означает, что число параметров функции переменно и может быть равно нулю.
Примечание. Для совместимости с программами предыдущих версий компилятор допускает запись символа запятой без многоточия в конце списка параметров для обозначения их переменного числа. Запятая может быть использована вместо многоточия и в том случае, когда надо записать список параметров функции, принимающей нуль или более параметров. Использование запятой поддерживается только для совместимости. Для новых программ рекомендуется использовать многоточие.
Объявления параметров имеют тот же самый синтаксис, что и обычные объявления переменных (смотри раздел 3.4). Формальные параметры могут иметь базовый тип, либо быть структурой, объединением, указателем или массивом. Указание первой (или единственной) размерности для массива не обязательно. Массив воспринимается как указатель на тип элементов массива. Для формального параметра, таким образом, эквивалентны объявления
char s[];
char s[10];
char *s;
Параметры могут иметь класс памяти auto или register. Если спецификация класса памяти опущена, то подразумевается класс памяти auto. Если формальный параметр представлен в списке параметров, но не объявлен, то предполагается, что он имеет тип int. Порядок объявления формальных параметров необязательно должен совпадать с порядком их следования в списке параметров, однако для повышения читабельности программы рекомендуется следовать этому порядку.
Идентификаторы формальных параметров не могут совпадать с идентификаторами переменных, объявляемых внутри тела функции, но возможно локальное переобъявление формальных параметров внутри вложенных блоков функции.
В объявлениях формальных параметров не может быть объявлен никакой другой идентификатор, кроме перечисленных в списке параметров. Если функция имеет переменное число параметров, то программист отвечает и за определение их числа при вызове, и за получение их из стека внутри тела функции.
Тип каждого формального параметра должен соответствовать типу фактического аргумента и типу соответствующего аргумента в списке типов аргументов функции, если имеется предварительное объявление функции со списком типов аргументов. Компилятор выполняет преобразования по умолчанию отдельно над типом каждого формального параметра и над типом каждого фактического аргумента.
После преобразования все формальные параметры имеют тип размером не меньше, чем int, и ни один из формальных параметров не имеет тип float. Это означает, например, что объявление формального параметра с типом char эквивалентно его объявлению с типом int, а объявление с типом float эквивалентно объявлению с типом double.
Если используются модификаторы near, far, huge, то компилятор также может неявно провести преобразование аргументов-указателей. Метод преобразования в этом случае зависит от размера указателей в выбранной модели памяти и от наличия или отсутствия списка типов аргументов функции.
Тип каждого формального параметра (после преобразования) определяет, как интерпретируются размещенные в стеке аргументы. Несоответствие типов фактических аргументов типам формальных параметров может привести к неверной интерпретации. Например, если в качестве аргумента передается 16-битовый указатель, а соответствующий формальный параметр объявлен как 32-битовый, тоне 16, а 32 бита стека проинтерпретируются как аргумент. Эта ошибка повлияет не только на аргумент-указатель, но и на другие аргументы, которые следуют за ним. От ошибок такого рода может предохранить использование объявления функции со списком типов аргументов.
Пример:
struct student {
char name [20];
int id;
long class;
struct student *nextstu;
} student;
main(void)
{
int match(struct student *, char *);
.
.
.
if(match (student.nextstu, student.name) > 0) {
.
.
.
}
}
match (struct student *r, char *n)
{
int i = 0;
while(r->name[i] == n[i])
if(r->name[i++] == '\0')
return(r->id);
return (0);
}
В примере содержатся: объявление структурного типа student, определение главной функции, содержащей предварительное объявление функции match и ее вызов, и определение функции match. Обратите внимание на то, что одно и то же имя student используется без противоречия для тега структуры и имени структурной переменной.
Функция match объявлена с двумя аргументами. Первый аргумент — указатель на структуру типа student, второй — указатель на значение типа char.
В определении функции match заданы два формальных параметра, r и n. Параметр r объявлен как указатель на структуру типа student. Параметр n объявлен как указатель на значение типа char. По умолчанию, для функции
Куприн не оставил крупных произведений, предпочитая форму рассказа, изредка позволяя ей перерасти до размера повести. В каждой работе Александр напоминал о своём присутствии, становясь для читателя приятным собеседником, направляющим ход мысли в требуемую ему сторону. Уже этим он достоин прозываться классиком русской литературы, насколько бы ни принижал созданное им наследие. Куприн выделялся из многих прозаиков честностью и стремлением показать человеческое желание жить в чуточку лучшем мире.
В условиях применения современных видов оружия, и прежде всего ядерного оружия, являющегося самым мощным средством поражения противника, от каждого солдата и матроса больше чем когда-либо требуются отличная выучка, стойкость, железная воинская дисциплина и непреклонная воля к победе над врагом. Какие бы трудности ни возникали в бою в связи с применением новых видов оружия, помни о своем священном долге перед Родиной и отдавай все силы успешному выполнению боевой задачи. Чтобы стать всесторонне подготовленным воином Советских Вооруженных Сил, ты обучаешься многому, что нужно знать и уметь делать в бою. Данное Пособие поможет тебе ознакомиться с ядерным, химическим и бактериологическим оружием, Научиться умело вести боевые действия в условиях его применения и овладеть средствами и способами защиты от его воздействия.
В Справочнике приведены краткие биографии около 1400 российских деятелей украинского происхождения, внёсших свой вклад в развитие России. В нём помещены статьи о государственных, политических, общественных и церковных деятелях, революционерах, декабристах, полководцах, флотоводцах и военачальниках, героях войн, космонавтах, писателях, художниках, скульпторах, архитекторах, артистах театра и кино, режиссёрах, композиторах, искусствоведах, спортсменах, учёных, создателях новых технологий и техники. Справочник через биографии деятелей освещает историю Украины и России за период с 1654 г.
В брошюре даны описания и способы применения пехотных противотанковых средств немецкой армии, захваченных нашими войсками. Брошюра поможет нашим бойцам и командирам научиться применять эти средства против танков противника. Настоящее пособие составлено инженер-полковником Клюевым при участии инженер-полковника Панкратьева.
Руководство предназначается для изучения тактико-технических характеристик, устройства принципа действия, правил применения, хранения и транспортировки противотанковой мины ТМ-72 и минного взрывателя МВН-72.
rufb2edit 0.0.908 сен 2015http://lifehacker.ru/2015/01/22/chitat-v-3-raza-bystree/web2fb2_201509080815_87756238791.0Учимся читать в три раза быстрее за 20 минут - ЛайфхакерИя Зорина 22 января 2015Учимся читать в три раза быстрее за 20 минутУмение быстро читать освобождает кучу свободного времени. Только представьте, вы можете в три раза быстрее справляться со всей литературой — технической, профессиональной или художественной. А теперь приятная новость: в отличие от большинства навыков, которые нужно осваивать постепенно, скорочтение доступно вам уже через 20 минут тренировки.