Т.В. Руденко - Сборник задач и упражнений по языку Си (1114664), страница 14
Текст из файла (страница 14)
постфиксные ++ и - слева направо ( → )! ~ префиксные ++ и - - унарные + - ∗ & (тип) sizeof←)∗ / %<<<слева направо ( → )−+слева направо ( → )слева направо ( → )>><===справа налево (>слева направо ( → )>=слева направо ( → )!=&слева направо ( → )^слева направо ( → )|слева направо ( → )&&слева направо ( → )||слева направо ( → )?:справа налево ( ← )=+= −=∗=/=%=&=^=|=<<=>>=справа налево ( ← )слева направо ( → ),Несмотря на строго определенный приоритет операций, при вычислении выражения существует некоторая свобода в выборе порядка вычисленияего подвыражений.Например, y = *p++; может быть вычислено какtemp = p; p += 1; y = *temp; либо какy = *p; p += 1;66Порядок вычислений важен для понимания того, когда проявляется побочный эффект. Побочный эффект при вычислении выражения - это занесение впамять значений объектов, изменение состояния файла либо доступ к volatile объектам.Точка последовательных вычислений ( sequence point ) - это точка впрограмме, где можно точно определить, какие из побочных эффектов уже проявились, а какие - еще нет.Если выражение является частью оператора, то точкой, где заведомовыполнились все побочные эффекты его вычисления - это конец этого оператора.
Например, в y = 37; x += y; можно быть уверенным, что 37 будет занесено вy раньше, чем значение y будет извлечено из памяти при вычислении суммы x +y.Кроме того, точки последовательных вычислений могут быть расположены внутри самого выражения: при выполнении операции x , y такая точка находится между вычислением x и y; при выполнении операции z ? x : y такая точка находится междувычислением z и вычислением x либо y; при вызове функции все побочные эффекты вычисления значений ееаргументов проявятся перед выполнением ее тела; при выполнении операций x && y и x || y такая точка находитсямежду вычислением x и вычислением y.Например, в if ( ( c = getchar() ) != EOF && isprint(c) ) вызов функцииisprint(c) произойдет только после того, как переменная c получит новое значение.Между двумя точками последовательных вычислений изменение значения переменной возможно не более одного раза.Например, верно val = 10 * val + (c - ‘0’); но неверно i = ++i + 2;Выражение может содержать точки последовательных вычислений, итем не менее, порядок вычислений не будет однозначным.
Например, f(x) + g(x)содержит такие точки, однако операция + допускает произвольный порядок вычисления ее операндов.10.2.3 Арифметические преобразования при выполненииарифметических операций вида X op Y1. если есть операнд типа short или signed char, то он преобразуется кint; если есть операнд типа char, unsigned char или unsigned short, и все значенияэтого типа могут быть представлены как int, то он преобразуется к int; иначе - кunsigned int. Это преобразование называется «целочисленное расширение»(promoting ).2. если после выполнения п.1 операнды имеют различные типы, тоосуществляется их приведение к общему типу. Общим для двух типов ( кромеслучая «unsigned int - long» ) является тот, который расположен позже в последовательности int, unsigned int, long, unsigned long, float, double, long double.Если операнды имеют типы unsigned int и long, и все значения типаunsigned int могут быть представлены как long, то общим типом является long;67иначе - unsigned long.
Это преобразование называют «согласование типов»(balansing).3. после этого выполняется арифметическая операция; тип результата это тип, к которому были приведены оба операнда.10.2.4 Арифметические преобразования при выполненииприсваивания и явного приведенияM-битового представления величины X к N-битовому представлениюпреобразованиеN<MN == MN>M------------------------------------------------------------------------------------------------------знаковое целоеотсечениезначениезначениекстаршихсохраняетсясохраняетсязнаковому целомуN-M бит-----------------------------------------------------------------------------------------------------------беззнаковое целоезависит отесли x ≥0,знач.сохр.значениекреализациииначе зависит отсохраняетсязнаковому целомуреализации-----------------------------------------------------------------------------------------------------------вещественноеесли |x|<2N-1,тоесли |x|<2N-1,тоесли |x|<2N1,токtrunc(x)trunc(x)trunc(x)знаковому целомуиначе зависитиначе зависитиначе зависитот реализацииот реализацииот реализации----------------------------------------------------------------------------------------------------------знаковое целоеесли x≥0, то x%2Nесли x≥0если x≥0киначе зависитзнач.
сохр.знач. сохр.беззнаковому целому от реализациииначе x+2Nиначе x+2N-----------------------------------------------------------------------------------------------------------беззнаковое целоезначениезначениеNкx%2сохраняетсясохраняетсябеззнаковому целому----------------------------------------------------------------------------------------------------------вещественноеесли 0≤x<2Nесли 0≤x<2Nесли 0≤x<2Nкtrunc(x)trunc(x)trunc(x)беззнаковомуиначе зависитиначе зависитиначе зависитцеломуот реализацииот реализацииот реализации----------------------------------------------------------------------------------------------------------знаковое целоесохр. знак,значениезначение68ксохр. старшиесохраняетсясохраняетсявещественномуN-1 бит----------------------------------------------------------------------------------------------------------беззнаковое целоезнак +,знак +,значениексохр.
старшиесохр. старшиесохраняетсявещественномуN-1 битN-1 бит----------------------------------------------------------------------------------------------------------вещественноесохр. старшиезначениезначениекN-1 битсохраняетсясохраняетсявещественному10.2.5 Неявное приведение типов в операторе присваивания X = Yтип Xтип Yтип результата-----------------------------------------------------------------------------------------------------------арифметическийарифметическийтип X-----------------------------------------------------------------------------------------------------------указатель, структуратип Xтип Xлибо объединение-----------------------------------------------------------------------------------------------------------указатель на const Tуказатель на T либотип Xна const T-----------------------------------------------------------------------------------------------------------указатель на volatile Tуказатель на T либотип Xна volatile T-----------------------------------------------------------------------------------------------------------указатель на const volatile Tуказатель на T, либо натип Xconst T, либо на volatile T,либо на const volatile T-----------------------------------------------------------------------------------------------------------указатель на voidуказатель на Tтип X-----------------------------------------------------------------------------------------------------------указатель на Tуказатель на voidтип X-----------------------------------------------------------------------------------------------------------указатель на Tцелое значение 0тип X6910.2.6 Явное приведение ( тип Т ) Xтип Xтип Ттип результата-----------------------------------------------------------------------------------------------------------скалярныйцелочисленныйтип Т-----------------------------------------------------------------------------------------------------------арифметическийплавающийтип Т-----------------------------------------------------------------------------------------------------------целочисленныйуказатель на любой типтип Т-----------------------------------------------------------------------------------------------------------указатель на T1указатель на T2тип Т-----------------------------------------------------------------------------------------------------------указатель на функциюуказатель на функциютип Т-----------------------------------------------------------------------------------------------------------скалярныйvoidvoid10.2.7 Адресная арифметикаоперациятип Xтип Yтип результата-----------------------------------------------------------------------------------------------------------X+Yуказатель_на_данныецелочисленныйтип X-----------------------------------------------------------------------------------------------------------X+Yцелочисленныйуказатель_на_данныетип X-----------------------------------------------------------------------------------------------------------X+=Yуказатель_на_данныецелочисленныйтип X-----------------------------------------------------------------------------------------------------------X−Yуказатель_на_данныецелочисленныйтип X-----------------------------------------------------------------------------------------------------------70X−Yуказатель_на_данныеуказатель_на_данныеptrdiff_t-----------------------------------------------------------------------------------------------------------X−=Yуказатель_на_данныецелочисленныйтип X-----------------------------------------------------------------------------------------------------------X&&Yуказательуказательint-----------------------------------------------------------------------------------------------------------!Xуказательint-----------------------------------------------------------------------------------------------------------X || Yуказательуказательint-----------------------------------------------------------------------------------------------------------X++указательуказатель-----------------------------------------------------------------------------------------------------------X−−указательуказатель-----------------------------------------------------------------------------------------------------------++Xуказательуказатель-----------------------------------------------------------------------------------------------------------−−Xуказательуказатель-----------------------------------------------------------------------------------------------------------sizeof Xуказательsize_t-----------------------------------------------------------------------------------------------------------X [Y]указатель на Тцелочисленныйтип Т-----------------------------------------------------------------------------------------------------------X [Y]целочисленныйуказатель на Ттип Т-----------------------------------------------------------------------------------------------------------X −>Yуказатель на структуруимя поля этойтип поля Yили объединениеструктуры илиобъединения-----------------------------------------------------------------------------------------------------------∗Xуказатель_на_данные типа Ттип Т-----------------------------------------------------------------------------------------------------------∗Xуказатель_на_функцию типа Ттип Т-----------------------------------------------------------------------------------------------------------∗Xуказатель_на voidvoid7110.3 Системные функции UNIX10.3.1 Базисные средства ввода-выводаcreat ( char ∗name , int perms)системная функция creat создает новый файл либо подготавливает дляперезаписи существующий файл с именем name.