sem07 (Мини-учебник с ejudge = Чернокнижка)

PDF-файл sem07 (Мини-учебник с ejudge = Чернокнижка) Практика расчётов на ПЭВМ (37208): Книга - 3 семестрsem07 (Мини-учебник с ejudge = Чернокнижка) - PDF (37208) - СтудИзба2019-05-08СтудИзба

Описание файла

Файл "sem07" внутри архива находится в следующих папках: Мини-учебник с ejudge = Чернокнижка, Еще, Entry level. PDF-файл из архива "Мини-учебник с ejudge = Чернокнижка", который расположен в категории "". Всё это находится в предмете "практика расчётов на пэвм" из 3 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .

Просмотр PDF-файла онлайн

Текст из PDF

1Занятие №71.1 Вычисление выраженийРассмотрим некоторые особенности вычисления выражений в языке Си.1.1.1 Преобразования типов при вычислении выраженийПеред вычислением арифметических операций транслятор может выполнять два действия с аргументами: целочисленное повышение (integer promotion) и балансировка.Рангом целого типа назовём число согласно таблице 1:012345_Boolchar, unsigned char, signed charshort, unsigned shortint, unsigned intlong, unsigned longlong long, unsigned long longТаблица 1: Ранги целых типовЦелочисленное повышение выполняется для аргументов типов _Bool, char,unsigned char, signed char, short, unsigned short, перечислимых типов, представляемых указанными выше целочисленными типами, и битовых полей.

Целочисленноеповышение выполняется при передаче параметров, если соответствующий тип формальногопараметра не задан, а также для аргументов операций, за исключением операции sizeof.Если тип аргумента, для которого выполняется целочисленное повышение, таков, что любое значение этого типа имеет представление в типе int, результат целочисленного повышения имеет тип int, а в противном случае результат целочисленного повышения имеет типunsigned int.

Практически это значит, что тип результата при выполнении целочисленного повышения зависит от размеров целых типов в данном компиляторе языка Си. Например, если размер типа char — 8 бит, short — 16 бит, int — 32 бита, то результат целочисленного повышения всегда имеет тип int. Для архитектуры с размером типов short иint 16 бит тип short повышается в тип int, а тип unsigned short — в тип unsignedint.Балансировка.

В случае вычисления инфиксного выражения, которое имеет два арифметических операнда, транслятор определяет тип выражения с помощью балансировки типов операндов. Для балансировки типов транслятор применяет следующие правила.Для комплексного типа назовём соответствующим вещественным типом тип, набазе которого построен данный комплексный тип. Наприме, для типа float _Complexсоответствующим вещественным типом будет тип float.

Для всех прочих типов соответствующий вещественный тип — это он сам.• Если соответствующий вещественный тип одного из операндов — long double,то соответствующий вещественный тип другого операнда преобразовывается в longdouble. Если после этого один из операндов имеет тип _Complex long double,то и другой операнд преобразовывается в тип _Complex long double. Таким образом, например, сложение аргумента типов _Complex float и long double дастрезультат типа _Complex long double.1• Иначе если соответствующий вещественный тип одного из операндов — double, тосоответствующий вещественный тип другого операнда преобразовывается в double.Если после этого один из операндов имеет тип _Complex double, то и другой операнд преобразовывается в тип _Complex double.• Иначе если соответствующий вещественный тип одного из операндов — float, то соответствующий вещественный тип другого операнда преобразовывается в float.

Если после этого один из операндов имеет тип _Complex float, то и другой операндпреобразовывается в тип _Complex float.• Иначе над обоими аргументами выполняется целочисленное повышение. Далее дляопределения типа аргументов и типа результата используются следующие правила.– Если типы аргументов совпадают, дальнейших преобразований не производится.– Иначе если оба типа аргументов — знаковые, или оба типа аргументов — беззнаковые, в качестве балансированного типа выбирается тот тип аргумента, рангкоторого выше. Так, при сложении аргументов типа int и long результат будетиметь тип long независимо от размера каждого из типов.– Иначе если ранг типа аргумента, имеющего беззнаковый тип, не ниже ранга аргумента со знаковым типом, балансированный тип будет тип аргумента беззнакового типа. Например, при сложении аргументов типа int и unsigned longрезультат будет иметь тип unsigned long.– Иначе если тип операнда, имеющего знаковый тип, может представить все значения типа другого операнда, тогда балансированным типом будет знаковый тип.Например, на архитектуре с размером типа long 32 бита и размером типа longlong 64 бита, результат сложения аргументов типа unsigned long и longlong будет иметь тип long long.– Иначе балансированными типом будет беззнаковый тип, соответствующий знаковому типу.

Например, на архитектуре с размером типов int и long 32 бита,результат сложения аргументов типа unsigned int и long будет иметь типunsigned long.Каждый из операндов преобразовывается в балансированный тип, арифметическая операция выполняется над значениями одинакового типа, и результат операции имеет балансированный тип.Для вычислений с плавающей точкой может использоваться вещественный тип с большей точностью, чем требуется типом аргументов.

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

Сейчас это требование снято. С другойстороны, на архитектуре i386 вычисления с плавающей точкой часто ведутся в типе longdouble, так как в регистрах FPU значения хранятся в типе long double. Но если длявычислений с плавающей точкой используются инструкции SSE/SSE2, то используемыйтип совпадает с типом выражение, то есть для сложения двух аргументов типа float используется инструкция сложения аргументов типа float.2Поскольку результат вычисления выражения с плавающей точкой зависит от порядкавыполнения операций и от типов промежуточных значений, на детали выполнения операцийс плавающей точкой необходимо обращать внимание.1.1.2 Порядок вычисления выражения и побочные эффектыПорядок, в котором транслятор вычисляет подвыражения неопределён и зависит от реализации.

Например, операторy = *p++;может быть эквивалентно либоtemp = p; p += 1; y = *temp;либоy = *p; p += 1;Если в программе встретилось выражениеf() + g()компилятор может расположить вызовы функций f и g в произвольном порядке.При вызове функции, например f(a, b), компилятор может вычислять выражения впроизвольном порядке.Порядок вычисления выражения важен, когда выражение имеет некоторый побочныйэффект, например, заносит значение в переменную, либо модифицирует состояние файла.Программа на Си содержит точки согласования. В точках согласования точно известно, какие побочные эффекты имели место, а какие должны произойти. Например, каждоевыражение, записанное как оператор имеет точку согласования в конце.

Гарантируется, чтов фрагментеy = 37;x += y;значение 37 будет помещено в y до того, как значение y будет использовано при вычислении x.Точки согласования могут находится внутри выражения. Операции «запятая», вызовфункции, логическое «и», логическое «или» содержат точки согласования. Например,if ((c = getchar()) != EOF && isprint(c))isprint(c) будет вычислено только после того, как новое значение, возвращённоеgetchar(), будет занесено в переменную c.Между двумя точками согласования один и тот же объект может модифицироватьсятолько один раз, и значение, читаемое из модифицируемого объекта может использоваться только для вычисления нового значения этого объекта.Например,val = 10 * val + (c - ’0’); // хорошоi= ++i + 2;// плохо31.2 Инициализация составных типовМассивы, структуры и перечисления точно также, как и простые типы могут быть проинициализированы в точке определения.

Массивы типов char, signed char, unsignedchar могут быть проинициализированы строкой. Для одномерного массива произвольноготипа инициализация выглядит следующим образом:<тип> <имя>[<размер>] = { <зн. 1>, <зн. 2>, ... <зн.

K> };Все инициализирующие значения должны иметь тип, совпадающий с типом массива. Их недолжно быть больше, чем размер массива, если их меньше, чем размер массива, оставшиесяэлементы инициализируются по умолчанию. Например,char str[20] = { ’a’, ’ ’, ’s’, ’t’, ’r’, ’i’, ’n’, ’g’, ’\0’ };Если массив содержит инициализацию, тогда размер массива может быть опущен. Он будетвычислен по количеству инициализирующих элементов.Структура инициализируется похожим образом.<тип> <имя> = { <зн. 1>, <зн.

2>, ..., <зн. K>};В этом случае полям структуры последовательно присваиваются указанные значения. Уобъединений может быть проинициализирован только первый элемент.Если массив сам имеет тип массива (многомерный массив), или тип структуры, илиструктура имеет поля типа массива или структуры, инициализаторы могут быть вложенными.Напримерstruct circle { double x, y, r; };struct circle cc[2] = {{1.0, 2.0}, {1.3,2.0,0.4}};Если фигурные скобки, отделяющие внутренние инициализаторы, опускаются, инициализация идёт подряд, переходя при необходимости границы типов. Например, если в указанном выше примере опустить внутренние фигурные скобки, cc[1] пример значение{1.0,2.0,1.3}, а cc[2] — {2.0,0.4,0.0} (если переменная cc — глобальная).Обратите внимание, что если инициализирована только часть элементов локального массива, значение остальных элементов массива останется неопределённым.

В следующем примереvoid func(void){int x[10] = { 0, 0 };}значение элементов x[0] и x[1] будет установлено равным 0, а значениеостальных элементов — неопределено!Стандарт C99 допускает инициализацию локальных переменных структурного и массивового типов, в которой иницализирующие выражения не являются константными. Например, следующий пример допустим в C99, но не допустим в C90.void func(double x, double y){struct circle cc = { x, y, x + y };}Массивы переменного размера, однако, не могут быть проинициализированы.4void func(int n){int a[n] = { 1 }; // неверно!!!}В стандарте C99 поддерживается явное указание имени поля или индекса массива приинициализации.

Свежие статьи
Популярно сейчас
Как Вы думаете, сколько людей до Вас делали точно такое же задание? 99% студентов выполняют точно такие же задания, как и их предшественники год назад. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
5224
Авторов
на СтудИзбе
427
Средний доход
с одного платного файла
Обучение Подробнее