Студопедия

КАТЕГОРИИ:


Архитектура-(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(); признаком этого в данном случае служит префикс &.)

 

 

Размеры данных. Приведем таблицу размеров данных для некоторых распространенных вычислительных систем.

 

Размер слова DEC PDP-11 DEC VAX Interdata IBM PC
  16 бит 32 бита 32 бита 16 бит
char        
int        
short        
long        
float        
double        
Диапазон порядка(double) ±38 ±38 ±76 -307 - 308

 

При инициализации переменной следите за тем, чтобы тип константы соответствовал типу переменной.

 

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; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.01 сек.