Новости  Акты  Бланки  Договор  Документы  Правила сайта  Контакты
 Топ 10 сегодня Топ 10 сегодня 
  
14.10.2015

Результаты операции выравнивания

Комбинация знаков операций и операндов, результатом которой является определенное значение, называется выражением. Знаки операций определяют действия, которые должны быть выполнены над операндами. Каждый операнд результаты операции выравнивания выражении может быть выражением. Значение выражения зависит результаты операции выравнивания расположения знаков операций и круглых скобок в выражении, а также от приоритета выполнения операций. В языке СИ присваивание также является выражением, и значением такого выражения является величина, которая присваивается. При вычислении выражений тип каждого операнда может быть преобразован к другому типу. Преобразования типов могут быть неявными, при выполнении операций и вызовов функций, или явными, при выполнении операций приведения типов. Операнд - это константа, литерал, идентификатор, вызов функции, индексное выражение, выражение выбора элемента или более сложное выражение, сформированное комбинацией операндов, знаков операций и круглых скобок. Любой операнд, который имеет константное значение, называется константным выражением. Каждый операнд имеет тип. Если в качестве операнда используется константа, то ему соответствует значение и тип представляющей его константы. Целая константа может быть типа int, long, unsigned int, unsigned long, в зависимости от ее значения и от формы записи. Символьная константа имеет тип int. Константа с плавающей точкой всегда имеет тип double. Строковый литерал состоит из последовательности символов, заключенных в кавычки, и представляется в памяти как массив элементов типа char, инициализируемый указанной последовательностью символов. Результаты операции выравнивания строкового литерала является адрес первого элемента строки и синтаксически строковый литерал является немодифицируемым указателем на тип char. Строковые литералы могут быть использованы в качестве операндов в выражениях, допускающих величины типа указателей. Однако так как строки не являются переменными, их нельзя использовать в левой части операции присваивания. Следует помнить, что последним символом строки всегда является нулевой символ, который автоматически добавляется при хранении строки в памяти. Идентификаторы переменных и функций. Каждый идентификатор имеет тип, который устанавливается при его объявлении. Значение идентификатора зависит от типа следующим образом: - идентификаторы объектов целых и плавающих типов представляют значения соответствующего типа; - идентификатор объекта типа enum представлен значением одной константы из множества значений констант в перечислении. Значением идентификатора является константное значение. Тип значения есть int, что следует из определения перечисления; - идентификатор объекта типа struct или результаты операции выравнивания представляет значение, определенное структурой или объединением; - результаты операции выравнивания, объявляемый как указатель, представляет указатель на значение, заданное в объявлении типа; - идентификатор, объявляемый как массив, представляет указатель, значение которого является адресом первого элемента массива. Тип адресуемых указателем величин - это тип элементов массива. Отметим, что адрес массива не может результаты операции выравнивания изменен во время выполнения программы, хотя значение отдельных элементов может изменяться. Значение указателя, представляемое идентификатором массива, не является переменной и поэтому идентификатор массива не может появляться в левой части оператора присваивания. Адрес функции не изменяется во время выполнения программы, меняется только возвращаемое значение. Таким образом, идентификаторы функций не могут появляться в левой части операции присваивания. Значения каждого выражения из списка выражений передается в функцию в качестве фактического аргумента. Операнд, являющийся вызовом функции, имеет тип и значение возвращаемого функцией значения. Обычно выражение-1 - это указатель, например, идентификатор массива, а выражение-2 - это целая величина. Однако требуется только, чтобы одно из выражений было указателем, а второе целочисленной величиной. Поэтому выражение-1 может быть целочисленной величиной, а выражение-2 указателем. В любом случае выражение-2 должно быть заключено в квадратные скобки. Хотя индексное выражение обычно используется для ссылок на элементы массива, тем не менее индекс может появляться с любым указателем. Так как одно из выражений, указанных в индексном выражении, является указателем, то при сложении используются правила адресной арифметики, согласно которым целая величина преобразуется результаты операции выравнивания адресному представлению, путем умножения ее на размер типа, адресуемого указателем. Пусть, например, идентификатор arr объявлен как массив элементов типа double. При этом величина i умножается на размер типа double и представляет собой результаты операции выравнивания i-го элемента массива arr от его начала. Затем это значение складывается со значением указателя arr, что в свою очередь дает адрес i-го элемента массива. К полученному адресу применяется операция разадресации, т. Выражение с несколькими индексами ссылается на элементы многомерных массивов. Многомерный массив - это массив, элементами которого являются массивы. Например, первым элементом трехмерного массива является массив с двумя измерениями. Такое индексное выражение интерпретируется слева направо, т. Операция разадресации осуществляется после вычисления последнего индексного выражения. Отметим, что операция разадресации не применяется, если значение последнего указателя адресует величину типа массива. Ссылка индекс 1 умножается на размер элемента этого массива, элементом же этого массива является двухмерный массив содержащий 5х3 элементов, имеющих тип int. Получаемое значение складывается со значением результаты операции выравнивания mass. Результат является указатель на второй двухмерный массив размером 5х3 в трехмерном массиве mass. Наконец, выполняется разадресация полученного указателя. Результирующим выражением будет элемент типа int. Выражение выбора элемента применяется, если в качестве операнда надо использовать элемент структуры или объединения. Такое выражение имеет значение и тип выбранного элемента. Рассмотрим две формы выражения выбора элемента: выражение. В первой форме выражение представляет величину типа struct или union, а идентификатор - это имя элемента структуры или объединения. Во второй форме выражение должно иметь значение адреса структуры или объединения, а идентификатор - именем выбираемого элемента структуры или объединения. Обе формы выражения выбора элемента дают одинаковый результат. Таким образом элементу left структурной переменной elem присваивается адрес самой переменной elem, т. Приведение типов это изменение преобразование типа объекта. Для выполнения преобразования необходимо перед объектом записать в скобках нужный тип: имя-типа операнд. Приведение типов используются для преобразования объектов одного скалярного типа в другой скалярный тип. Однако выражению с приведением типа не может быть присвоено другое значение. Константное выражение - это выражение, результатом которого является константа. Операндом константного выражения могут быть целые константы, символьные константы, константы с плавающей точкой, константы перечисления, выражения приведения типов, выражения с операцией sizeof и другие результаты операции выравнивания выражения. Однако на использование знаков операций в константных выражениях налагаются следующие ограничения: 1. В константных выражениях нельзя использовать операции присваивания и последовательного вычисления. Выражения со знаками результаты операции выравнивания могут участвовать результаты операции выравнивания выражениях как операнды. Выражения со знаками операций могут быть унарными с одним операндомбинарными с двумя операндами и тернарными с тремя операндами. Унарное выражение состоит из операнда и предшествующего ему знаку унарной операции имеет следующий формат: знак-унарной-операции операнд. Бинарное выражения состоит из двух операндов, разделенных знаком бинарной операции: результаты операции выравнивания знак-бинарной-операции операнд2. Тернарное выражение состоит из трех операндов, разделенных знаками тернарной операции? По количеству операндов, участвующих в операции, операции результаты операции выравнивания на унарные, бинарные и тернарные. В языке Си имеются следующие унарные операции: - арифметическое отрицание отрицание и дополнение ; ~ побитовое логическое отрицание дополнение ;! Унарные операции выполняются справа налево. Операции увеличения и уменьшения увеличивают или уменьшают значение операнда на результаты операции выравнивания и могут быть записаны как справа так и слева от операнда. Если знак операции записан перед операндом префиксная формато изменение операнда происходит до его результаты операции выравнивания в выражении. Если знак операции записан после операнда постфиксная формато операнд вначале используется в выражении, а затем происходит его изменение. В отличие от унарных, бинарные операции, список которых приведен в табл. При выполнении операций производится автоматическое преобразование типов, чтобы привести операнды выражений к общему типу или чтобы расширить короткие величины до размера целых величин, используемых в машинных результаты операции выравнивания. Выполнение преобразования зависит от специфики операций и от типа операнда или операндов. Рассмотрим общие арифметические преобразования. Операнды типа float преобразуются к типу double. Если один операнд long double, то второй преобразуется к этому же типу. Если один операнд double, то второй также преобразуется к типу double. Любые операнды типа char и short преобразуются к типу int. Любые операнды unsigned char или unsigned short преобразуются к типу unsigned int. Если один операнд типа unsigned long, то второй преобразуется к типу unsigned long. Если один операнд типа long, то второй преобразуется к типу long. Если один операнд типа unsigned int, то второй операнд преобразуется к этому же типу. Таким образом, можно отметить, что при вычислении выражений операнды преобразуются к типу того операнда, который имеет наибольший размер. Пример: double ft,sd; unsigned char ch; unsigned long in; int i. Операнд ch преобразуется к unsigned int правило 5. Затем он преобразуется к типу unsigned long правило 6. По этому же правилу i преобразуется к unsigned long и результат операции, заключенной в круглые скобки будет иметь тип unsigned long. Затем он преобразуется к типу double правило 3 и результат всего выражения будет иметь тип double. Операция арифметического отрицания - вырабатывает отрицание своего операнда. Операнд должен быть целой или плавающей величиной. При выполнении осуществляются обычные арифметические преобразования. Результат имеет результаты операции выравнивания int. Операнд должен быть целого или плавающего результаты операции выравнивания или типа указатель. Операция двоичного дополнения ~ вырабатывает двоичное дополнение своего операнда. Операнд должен быть целого типа. Осуществляется обычное арифметическое преобразование, результат имеет тип операнда после преобразования. В результате операции ~f будет получено шестнадцатеричное значение С6, что соответствует символу 'ц'. Эти операции используются для работы с переменными типа указатель. Операнд должен результаты операции выравнивания указателем. Результатом операции является величина, на которую указывает операнд. Типом результата является тип величины, адресуемой указателем. Результат не определен, если указатель содержит недопустимый адрес. Рассмотрим типичные ситуации, когда указатель содержит недопустимый адрес: - указатель является нулевым; - указатель определяет адрес такого объекта, который не является активным в момент ссылки; - указатель определяет адрес, который не выровнен до типа объекта, на который он указывает; - указатель определяет адрес, не используемый выполняющейся программой. Операндом может быть любое именуемое выражение. Имя функции или массива также может быть операндом операции "адрес", хотя в этом случае знак операции является лишним, так как имена массивов и функций являются адресами. Результатом операции адрес является указатель на операнд. Тип, адресуемый указателем, является типом операнда. Операция адрес не может применятся к элементам структуры, являющимися полями битов, и к объектам с классом памяти register. Операция sizeof имеет следующий формат: sizeof выражение. В качестве выражения может быть использован любой результаты операции выравнивания, либо результаты операции выравнивания типа, заключенное в скобки. Отметим, результаты операции выравнивания не может быть использовано имя типа void, а идентификатор не может относится к полю битов или быть именем функции. Если в качестве выражения указанно имя массива, то результатом является размер всего массива т. Когда sizeof применяются к имени типа результаты операции выравнивания или объединения или к идентификатору имеющему тип структуры или объединения, то результатом является фактический размер структуры или объединения, который может включать участки памяти, используемые для выравнивания элементов структуры или объединения. Таким образом, этот результат может не соответствовать размеру, получаемому путем сложения размеров элементов структуры. В связи с этим целесообразно рекомендовать при объявлении структур и объединения располагать их элементы в порядке убывания длины типов, т. Операндами операции % должны быть целые числа. Отметим, что типы операндов операций умножения и деления могут отличаться, и для них справедливы правила преобразования типов. Типом результата является тип операндов после преобразования. Если две целые величины не делятся нацело, то результат округляется в сторону нуля. При попытке деления на ноль выдается сообщение во время выполнения. Знак результата зависит от конкретной реализации. В данной реализации знак результата совпадает со знаком делимого. Если второй операнд равен нулю, то выдается сообщение. Операнды могут быть целого или плавающего типов. В некоторых случаях над операндами аддитивных операций выполняются общие арифметические преобразования. Однако преобразования, выполняемые при аддитивных операциях, не обеспечивают обработку ситуаций переполнения и потери значимости. Информация теряется, если результат аддитивной операции не может быть представлен типом результаты операции выравнивания после результаты операции выравнивания. При этом сообщение об ошибке не выдается. Результатом выполнения операции сложения является сумма двух операндов. Операнды могут быть целого или плавающего типа или один результаты операции выравнивания может быть указателем, а второй - целой величиной. Когда целая величина складывается с указателем, то целая величина преобразуется путем умножения результаты операции выравнивания на размер памяти, занимаемой величиной, адресуемой указателем. Когда преобразованная целая величина складывается с величиной указателя, то результатом является указатель, адресующий ячейку памяти, расположенную на целую величину дальше от исходного адреса. Новое значение указателя адресует тот же самый тип данных, что исходный указатель. Операция вычитания - вычитает второй операнд из первого. Возможна следующая комбинация операндов: 1. Оба операнда целого или плавающего типа. Оба операнда являются указателями на один и тот же тип. Первый операнд результаты операции выравнивания указателем, а второй - целым. Отметим, что операции сложения и вычитания над адресами в единицах, отличных от длины типа, могут привести к непредсказуемым результатам. Оба операнда должны быть целыми величинами. Выполняются обычные арифметические преобразования. При сдвиге влево правые освобождающиеся биты устанавливаются в нуль. При сдвиге вправо метод заполнения освобождающихся левых результаты операции выравнивания зависит от типа первого операнда. Если тип unsigned, то свободные левые биты устанавливаются в результаты операции выравнивания. В противном случае они заполняются копией знакового бита. Результат операции сдвига результаты операции выравнивания определен, если второй операнд отрицательный. Преобразования, выполненные операциями сдвига, не обеспечивают обработку ситуаций переполнения и потери значимости. Информация теряется, если результат операции сдвига результаты операции выравнивания может быть представлен типом первого операнда, после преобразования. Отметим, что сдвиг влево соответствует умножению первого операнда на степень числа 2, равную второму операнду, а сдвиг вправо соответствует делению первого операнда на 2 в степени, равной второму операнду. Операнды поразрядных результаты операции выравнивания могут быть любого целого типа. При необходимости над операндами выполняются преобразования по умолчанию, тип результата - это тип операндов после преобразования. Если оба сравниваемых бита единицы, то соответствующий бит результата устанавливается в 1, в противном случае в 0. Операция поразрядного логического ИЛИ сравнивает каждый бит первого операнда с соответствующим битом второго операнда. Если любой или оба из сравниваемых битов результаты операции выравнивания 1, то соответствующий бит результата устанавливается результаты операции выравнивания 1, в противном случае результирующий бит равен 0. Если один из сравниваемых битов равен 0, а второй бит равен 1, то соответствующий бит результата устанавливается в результаты операции выравнивания, в противном случае, т. Операнды логических операций могут быть целого типа, плавающего типа или типа указателя, при этом в каждой операции могут участвовать операнды различных типов. Операнды логических выражений вычисляются слева направо. Если значения первого операнда достаточно, чтобы определить результат операции, то второй операнд не вычисляется. Логические операции не вызывают стандартных арифметических преобразований. Они оценивают каждый операнд с точки зрения его эквивалентности нулю. Результатом логической операции является 0 или 1, тип результата int. Если один из операндов равен 0, то результат также равен 0. Если значение первого операнда равно 0, то второй операнд не вычисляется. Операция логического ИЛИ выполняет над операндами операцию включающего ИЛИ. Она вырабатывает значение 0, если оба операнда имеют значение 0, если какой-либо из операндов имеет ненулевое значение, то результат операции равен 1. Если первый операнд имеет ненулевое значение, то второй операнд не вычисляется. Операция последовательного вычисления обозначается запятойи используется для вычисления двух и более выражений там, где по синтаксису допустимо только одно выражение. Результаты операции выравнивания операция вычисляет два результаты операции выравнивания слева направо. При выполнении операции последовательного вычисления, преобразование типов не производится. Операнды могут быть любых типов. Результат операции имеет значения и тип второго операнда. Отметим, что запятая может использоваться также как символ разделитель, результаты операции выравнивания необходимо по контексту различать, запятую, используемую в качестве разделителя или знака операции. В языке СИ имеется одна тернарная операция - условная операция, которая имеет следующий формат: операнд-1? Он оценивается с точки зрения его эквивалентности 0. Если операнд-1 не равен 0, то вычисляется операнд-2 и его значение является результатом операции. Если операнд-1 равен 0, то результаты операции выравнивания операнд-3 и его значение является результатом операции. Следует отметить, что вычисляется либо операнд-2, либо операнд-3, но не оба. Тип результата зависит от типов операнда-2 и операнда-3, следующим образом. Если операнд-2 или операнд-3 имеет целый или плавающий тип отметим, что их типы могут отличатьсято выполняются обычные арифметические преобразования. Типом результата является тип операнда после преобразования. Если операнд-2 и операнд-3 имеют один и тот же тип результаты операции выравнивания, объединения или указателя, то тип результата будет тем же самым типом структуры, объединения или указателя. Если оба операнда имеют тип void, то результат имеет тип void. Если один операнд является указателем на объект любого типа, а другой операнд является указателем на vold, то указатель на объект преобразуется к указателю на vold, который и будет типом результата. Если один из операндов является указателем, а другой константным выражением со значением 0, то типом результата будет тип указателя. Операции увеличения ++ и уменьшения - являются унарными операциями присваивания. Они соответственно увеличивают или уменьшают значения операнда на единицу. Операнд может быть целого или плавающего типа или типа указатель и должен результаты операции выравнивания модифицируемым. Операнд целого результаты операции выравнивания плавающего типа увеличиваются уменьшаются на единицу. Тип результата соответствует типу операнда. Операнд адресного типа увеличивается или уменьшается на размер объекта, который он адресует. В языке допускается префиксная или постфиксная формы операций результаты операции выравнивания уменьшенияпоэтому значения выражения, использующего операции увеличения уменьшения зависит от того, какая из форм указанных операций используется. Если знак операции результаты операции выравнивания перед операндом префиксная форма записито изменение операнда происходит до его использования в выражении и результатом операции является увеличенное или уменьшенное значение операнда. В том случае если знак операции стоит после операнда постфиксная форма записито операнд вначале используется для вычисления выражения, а затем происходит изменение операнда. В случае, если операции увеличения и уменьшения используются как самостоятельные операторы, префиксная и постфиксная формы записи становятся эквивалентными. Простое присваивание Операция простого присваивания используется для замены значения левого операнда, значением правого операнда. При присваивании производится преобразование типа правого операнда к типу левого операнда по правилам, упомянутым раньше. Левый операнд должен быть модифицируемым. Кроме простого присваивания, имеется целая группа операций присваивания, которые объединяют простое присваивание с одной из бинарных операций. Отметим, что выражение составного присваивания с точки зрения реализации не эквивалентно простому присваиванию, так как в последнем операнд-1 вычисляется дважды. Каждая операция составного присваивания выполняет преобразования, которые осуществляются соответствующей бинарной операцией. В языке СИ операции с высшими приоритетами вычисляются первыми. Наивысшим приоритетом является приоритет равный 1. Приоритеты и результаты операции выравнивания операций приведены в табл. Побочный эффект может возникать и при вызове функции, если он содержит прямое или косвенное присваивание через указатель. Это связано с тем, что аргументы функции могут вычисляться в любом порядке. Порядок вычисления операндов некоторых операций зависит от реализации и поэтому могут возникать разные побочные эффекты, если в одном из операндов используется операции увеличения или уменьшения, а также другие операции присваивания. Чтобы избежать недоразумений при выполнении побочных эффектов необходимо придерживаться следующих правил. Не использовать операции присваивания переменной в вызове функции, если эта переменная участвует в формировании других аргументов функции. Не использовать операции присваивания переменной в выражении, если эта переменная используется в выражении более одного раза. При выполнении операций происходят неявные преобразования типов в следующих случаях: - при выполнении операций осуществляются результаты операции выравнивания арифметические преобразования которые были рассмотрены выше ; - при выполнении операций присваивания, если значение одного типа присваивается переменной другого типа; - при передаче аргументов функции. Кроме того, в Си есть возможность явного приведения значения одного типа к другому. В операциях присваивания тип значения, которое присваивается, преобразуется к типу переменной, получающей это значение. Допускается преобразования целых и плавающих типов, даже если такое преобразование ведет к потере информации. Преобразование целых типов со знаком. Целое со знаком преобразуется к более короткому целому со знаком, посредством усечения старших битов. Целая со знаком преобразуется к более длинному целому со знаком, путем размножения знака. Результаты операции выравнивания преобразовании целого со знаком к целому без знака, целое со знаком преобразуется к размеру целого без знака и результат рассматривается как значение без знака. Преобразование целых типов без знака. Целое без знака преобразуется к более короткому целому без знака или со знаком путем усечения старших битов. Целое без знака преобразуется к более длинному целому без знака или со знаком путем дополнения нулей слева. Когда целое без знака преобразуется к целому со знаком того же размера, битовое представление не изменяется. Поэтому значение, которое оно представляет, изменяется, если знаковый бит установлен равен 1т. Целые значения без знака преобразуются к плавающему типу, путем преобразования целого без знака к значению типа signed long, а затем значение signed long преобразуется в плавающий тип. Преобразования из unsigned long к типу float, double или long double производятся с потерей информации, если преобразуемое значение больше, чем максимальное положительное значение, которое может результаты операции выравнивания представлено для типа long. Величины типа float преобразуются к типу double без изменения значения. Величины double и long double преобразуются к float c некоторой потерей точности. Если значение слишком велико для float, то происходит потеря значимости, о чем сообщается во время выполнения. При преобразовании величины с плавающей точкой к целым типам она сначала преобразуется к типу long дробная часть плавающей величины при этом отбрасываетсяа затем величина типа long преобразуется к требуемому целому типу. Если значение слишком велико для long, то результат преобразования не определен. Преобразования из float, результаты операции выравнивания или long double к типу unsigned long производится с потерей точности, если преобразуемое значение больше, чем максимально возможное положительное значение, представленное типом long. Указатель на величину одного типа может быть преобразован к указателю на величину другого типа. Однако результат может быть не определен из-за отличий в требованиях к выравниванию и размерах для различных типов. Указатель на тип void может быть преобразован к указателю на любой тип, и указатель на любой тип может быть преобразован к указателю на тип void без ограничений. Значение указателя может быть преобразовано к целой величине. Метод преобразования зависит от размера указателя и размера целого типа следующим образом: - если размер указателя меньше размера целого типа или равен ему, то указатель преобразуется точно так же, как целое без знака; - если указатель больше, чем размер целого типа, то указатель сначала преобразуется к указателю с тем же размером, что и целый тип, и затем преобразуется к целому типу. Целый тип может быть преобразован к адресному типу по следующим правилам: - если целый тип того же размера, что и указатель, то целая величина просто рассматривается как указатель целое без знака ; - если размер целого типа отличен от размера указателя, то целый тип сначала преобразуется результаты операции выравнивания размеру указателя используются способы преобразования, описанные вышеа затем полученное значение трактуется как указатель. Преобразования при вызове функции. Преобразования, выполняемые над аргументами при вызове функции, зависят от того, был ли задан прототип функции объявление "вперед" со списком объявлений типов аргументов. Если задан прототип функции и он включает объявление типов аргументов, то над аргументами в вызове функции выполняются только обычные арифметические преобразования. Эти преобразования выполняются независимо для каждого аргумента. Величины типа float преобразуются к double, величины типа char и short преобразуются к int, величины результаты операции выравнивания unsigned char и unsigned short преобразуются к unsigned int. Могут быть также выполнены неявные преобразования переменных типа указатель. Задавая прототипы функций, можно переопределить эти неявные преобразования и позволить компилятору выполнить контроль типов. Преобразования при приведении типов. Явное преобразование типов может быть осуществлено посредством операции результаты операции выравнивания типов, которая имеет формат: имя-типа операнд. В приведенной записи имя-типа задает тип, к которому должен быть преобразован операнд. Пресс-релизы — This Web server launched on February 24, 1997 Copyright © 1997-2000 CIT, © 2001-2015 Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было результаты операции выравнивания без письменного разрешения владельцев авторских прав.

  Комментарии к новости 
 Главная новость дня Главная новость дня 
Презентация 5 класс доли
Маршрут автобуса 654 на карте
Печень жареная калорийность
Схема вязания рейтуз спицами
Контрольная по русскому
Управление образования города чебоксары
Статья 174 уголовного кодекса рф
Расписание электричек новосибирск матвеевка
Умерла девочка стих
 
 Эксклюзив Эксклюзив 
Уаз патриот 2015 технические характеристики
Про ресурсну базу банку наукова стаття
Неверный признак юридической ответственности
Характеристика стальных труб
Поселок лесной на карте
Образец истории болезни по хирургии
Керчь ленино расписание автобусов