КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Модификаторы near, far и huge
Модификатор cdecl. Модификатор pascal. Язык Паскаль использует отличную от С и C++ последовательность вызова процедур. В Паскале (так же, как в ФОРТРАНе) аргументы функции передаются в порядке слева направо, а списки аргументов, имеющие переменную длину, не разрешены. Кроме этого, в Паскале аргументы из стека должна удалять вызванная, а не вызывающая функция (когда управление возвращается от вызванной функции). Программы на С и C++ могут создавать такую вызывающую последовательность двумя способами. Во-первых, можно использовать ключ компиляции /Gc, при котором для всех содержащихся вызовов и описаний функций по умолчанию создается вызывающая последовательность паскалевского типа. Во-вторых, в программе на С можно явно переопределить вызывающую последовательность (по умолчанию, С-типа), если при описании функции указать ключевое слово pascal.
Если при компиляции программ на С или C++ использовать ключ /Gz, все ссылки на функции и переменные генерируются в соответствии с типом вызовов языка Паскаль. Однако могут быть случаи, когда необходимо гарантировать, что некоторые используемые в программе идентификаторы сохраняют свое написание (различие заглавных и строчных букв) и имеют в начале символ подчеркивания. Чаще всего, это те идентификаторы, которые используются в другом файле на С. Для обеспечения такой совместимости с языком С (сохранение различий букв при написании и начального символа подчеркивания) можно использовать ключевое слово cdecl. Когда cdecl используется при описании функции, это влияет также на способ передачи параметров. Обратите внимание на то, что все функции С и C++, имеющие прототипы в заголовочных файлах Microsoft Visual C/C++, — например, stdio.h — имеют тип cdecl. Это гарантирует возможность компоновки с библиотечными функциями, даже если при компиляции использовалась опция /Gz. Следующий пример компилировался с ключом /Gz; в нем показано, как переписать предыдущий пример для обеспечения совместимости с С:
#define TABLESIZE 30 float cdecl cfcalculate(int iscore,int iweight) {
} float cdecl cfscore_table[TABLESIZE]; main () { int iscore 95, iweight = 10; cfscore_table[0] = cfcalculate(iscore,iweight); return(0); }
Три модификатора near, far и huge влияют на работу операции косвенной ссылки (*); другими словами, они модифицируют размер указателей на объекты данных. Указатель near имеет длину 2 байта, указатель far — 4 байта, указатель huge — также 4 байта. Отличие указателей far и huge заключается в том, что указатель huge работает с формой адреса. Эта концепция детально описана в дальнейшем. 6.5.7. Тип данных char Этот тип определяет целые числа без знака в диапазоне от 0 до 255. Обычно такое целое размещается в одном байте памяти.
char response; char intable, latan; char isma = 'S';
Символьные константы. В языке Си символы заключаются в апострофы. Поэтому, когда мы присваиваем какое-то значение переменной broiled типа char, мы должны писать
broiled = 'T'; /*ПРАВИЛЬНО*/ а не broiled = Т; /*НЕПРАВИЛЬНО*/
Если апострофы опущены, компилятор «считает», что мы используем переменную с именем Т, которую забыли описать.
6.5.8. Другие типы и размеры данных. В языке Си имеются и другие типы данных, построенные с использованием основных типов. Они включают в себя массивы, указатели, структуры и объединения. (Указатели используются функцией scanf(); признаком этого в данном случае служит префикс &.)
Размеры данных. Приведем таблицу размеров данных для некоторых распространенных вычислительных систем.
При инициализации переменной следите за тем, чтобы тип константы соответствовал типу переменной.
int apples = 3; /*ПРАВИЛЬНО*/ int oranges = 3.0; /*НЕПРАВИЛЬНО*/
Язык Си «рассматривает» такие несоответствия менее жестко, чем, скажем, Паскаль, но в любом случае лучше учиться избегать дурных привычек.
6.6. Преобразование типов данных. Предположим, что выполняется следующая операция, в которой переменные fresult и fvalue имеют тип float, а переменная ivalue — тип int:
fresult = fvalue * ivalue;
Следовательно, это операция смешанного типа. При выполнении оператора значение ivalue будет преобразовано в число с плавающей точкой, а затем выполнится умножение. Компилятор распознает смешанные операции и генерирует код для выполнения следующих операций. Давайте посмотрим, что происходит при преобразовании типа float в тип int. Предположим, что описаны переменные ivalue1 и ivalue2 типа int и переменные fvalue и fresult типа float. Рассмотрим следующую последовательность операторов:
Ivalue1 = 3; ivalue2 = 4; fvalue = 7.0; fresult = fvalue + ivalue1/ivalue2;
Операция ivalue1/ivalue2 — не смешанная; она представляет собой деление двух целых чисел, и ее результат 0, так как при выполнении целочисленного деления дробная часть (в этом примере 0.75) отбрасывается. Поэтому значение fresult равно 7.0. Что будет, если переменную ivalue2 описать как float? В этом случае переменная fresult получит значение с плавающей точкой 7.75, поскольку операция ivalue1/ivalue2 будет иметь смешанный тип. Тогда значение ivalue1 временно преобразуется в число с плавающей точкой 3.0 и результат деления будет равен 0.75. После сложения с fvalue получим 7.75.
6.6.1. Явные преобразования типов при помощи операции приведения типа. Как вы видели, компилятор С и C++ автоматически меняет формат переменной при выполнении смешанных операций, в которых задействуются различные типы данных. Однако, в некоторых случаях, несмотря на то, что автоматическое преобразование не выполняется, преобразование типов было бы желательным. В таких случаях необходимо особо указать, что требуется изменение типа. Кроме того, подобные явные указания облегчают другим программистам понимание используемых операторов. В языке С имеется несколько процедур, позволяющих указывать необходимость преобразования типа. Одна из таких процедур называется приведением типа. Если нужно временно изменить формат некоторой переменной, достаточно перед ее именем указать в скобках имя типа, который необходимо получить. Например: если переменные ivalue1 и ivalue2 объявлены как int, а переменные fvalue и fresult как float, то три следующих оператора будут эквивалентны:
fresult = fvalue + (float)ivalue1/ivalue2; fresult = fvalue + ivalue1/(float)ivalue2; fresult = fvalue + (float)ivalue1/(float)ivalue2;
Все три оператора выполняют преобразование в тип с плавающей точкой и деление переменных ivalue1 и ivalue2. Если любая из этих переменных приведена в тип float, то — согласно описанным выше правилам стандартного преобразования типов в смешанных арифметических операциях — выполняется деление чисел с плавающей точкой. Третий оператор явно указывает, какие операции должны выполняться.
7. Символьные строки. 7.1. Символьные строки. 7.2. Длина строки — функция strlen(). 7.3. Функции printf() и scanf().
Дата добавления: 2015-01-03; Просмотров: 1217; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |