Партнерка на США и Канаду по недвижимости, выплаты в крипто
- 30% recurring commission
- Выплаты в USDT
- Вывод каждую неделю
- Комиссия до 5 лет за каждого referral
“Я строковая константа”
Или
“”
Кавычки не входят в строку, а служат только ее ограничителями. Так же, как и в символьные константы, в строки можно включать эскейп-последовательности; \” – представляет из себя двойную кавычку. Фактически строковая константа – это массив символов. Во внутреннем представлении строки в конце обязательно присутствует нулевой символ ‘\0’, поэтому памяти для строки требуется на один байт больше, чем число символов заключенных в кавычки.
Надо понимать, что символьная константа и строка, содержащая один символ, не одно и тоже; Запись ‘x’ обозначает целое значение, равное коду буквы х. А запись “х” – массив символов, который содержит один символ х и ‘\0’.
- Константа с плавающей точкой
Константа с плавающей точкой состоит из целой части, десятичной точки, дробной части, e или E и целого(возможно со знаком), представляющего порядок, и, возможно, суффикса типа, задаваемого одной из букв:f, F,l, L. И целая, и дробная часть представляют собой последовательность цифр. Либо целая часть, либо дробная часть (но не обе вместе) могут отсутствовать; также могут отсутствовать десятичная точка или E с порядком(но не одновременно). Тип определяется суффиксом; F или f определяют тип float, L или l – тип long double; при отсутствии суффикса подразумевается тип double.
Например, 123.4 или 1e-2.
- Константа перечисления
Перечисление – это список целых констант, например, в
Enum Boolean {NO, YES}
Первое имя в enum имеет значение 0, следующее -1 и т. д.( если для значений констант не было явных спецификаций). Если не все значения специфицированы, то они продолжают прогрессию, начиная от последнего специфицированного значения, как в следующих двух примерах:
Enum escapes { BELL =’\a’, BACKSPACE =’\b’, TAB =’\t’, NEWLINE=’\n’, VTAB=’\v’ , RETURN=’\r’}
Enum month { JAN =1 , FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC} /* FEB есть 2, MAR есть 3 и т. д. */
Имена в различных перечислениях должны отличаться друг от друга. Значения внутри одного перечисления могут совпадать.
Средство enum обеспечивает удобный способ присвоить константам имена, причем в отличие от #define значения констант при этом способе могут генерироваться автоматически.
Описание переменных. Классы памяти.
Описание вводит в программу имя, указав его тип и, возможно, начальное значение.
Имя (идентификатор) следует описать прежде, чем оно будет использоваться в программе на С. Это означает, что нужно указать его тип, чтобы транслятор знал, к какого вида объектам относится имя. Ниже приведены несколько примеров, иллюстрирующих все разнообразие описаний:
char ch;
int count = 1;
float eps=1.0e-5;
const double pi = 3.1415926535897932385;
Из этих примеров видно, что роль описаний не сводится лишь к привязке типа к имени. Большинство указанных описаний одновременно являются определениями, т. е. они создают объект, на который ссылается имя. Для ch, count, eps таким объектом является элемент памяти соответствующего размера. Этот элемент будет использоваться как переменная, и говорят, что для него отведена память. Для константы pi объектом будет число 3.1415926535897932385. Инициализация неавтоматической переменной осуществляется только один раз – перед тем, как программа начнет выполняться, при этом начальное значение должно быть константным выражением. Явно инициализируемая автоматическая переменная получает начальное значение каждый раз при входе в функцию или блок, ее начальным значением может быть любое выражение. Внешние и статические переменные по умолчанию получают нулевые значения. Автоматические переменные, явным образом не инициализированные, содержат неопределенные значения.
К любой переменной в объявлении может быть применен квалификатор const для указания того, что ее значение далее не будет изменяться.
const double pi = 3.1415926535897932385;
const char msg[]=”предупреждение:”;
Применительно к массиву квалификатор const указывает на то, что ни один из его элементов не будет меняться. Указание const можно также применить к аргументу-массиву, чтобы сообщить, что функция не изменяет этот массив:
int strl(const char[]);
Существует два класса памяти: автоматический и статический. Несколько ключевых слов в совокупности с контекстом объявлений объектов специфицируют класс памяти для этих объектов.
Автоматические объекты локальны в блоке, при выходе из него они “исчезают”. Объявление, заданное внутри блока, если в нем отсутствует спецификатор класса памяти или указан спецификатор auto, создается автоматический объект. Объект, помеченный в объявлении словом register, является автоматическим и размещается по возможности в регистре машины.
Статические объекты могут быть локальными в блоке или располагаться вне блоков, но в обоих случаях их значения сохраняются после выхода из блока(или функции) до повторного в него входа. Внутри блока(в том числе и в блоке, образующем тело функции) статические объекты в объявлениях помечаются словом static. Объекты, объявляемые вне всех блоков на одном уровне с определениями функции, всегда статические. С помощью ключевого слова static их можно сделать локальными в пределах транслируемой единицы(в этом случае они получают атрибут внутренней связи), и они становятся глобальными для всей программы, если опустить явное указание класса памяти или использовать ключевое слово extern(в этом случае они получают атрибут внешней связи).
Инициализация. Выражения.
Инициализатор определяет начальное значение объекта. Если он не указан, то объекту присваивается нулевое значение соответствующего типа. Например:
int a; /*означает int a = 0*/
double d; /*означает double d = 0.0*/
Локальные переменные и объекты, создаваемые в области свободной памяти, не инициализируются по умолчанию:
void f()
{
int x; /* x не имеет надежно определенного значения */
//…
}
Сложные объекты требуют более одного инициализатора. Для массивов и структур используется синтаксис списков инициализаторов. Список значений заключается в фигурные скобки. Для инициализации типов, определяемых пользователем, применяются конструкторы с синтаксисом вызова функции. Примеры:
int a[] = {1, 2};
В языке не определен контроль за переполнением, делением на нуль и другими исключительными ситуациями, возникающими при вычислении выражения. В большинстве существующих реализаций Си при вычислении знаковых целочисленных выражений и присваивании переполнение игнорируется, но результат таких вычислений не определен. Трактовки деления на нуль и всех исключительных ситуаций, связанных с плавающей точкой, могут не совпадать в разных реализациях;
Порядок, приоритет и правила вычислений. Преобразование типов.
В таблице показаны приоритеты и очередность вычислений всех операторов. Операторы, перечисленные на одной строке, имеют одинаковый приоритет; строки упорядочены по убыванию приоритетов; так, например, *, / и % имеют одинаковый приоритет, который выше, чем приоритет бинарных + и -. “Оператор” () относится к вызову функции. Операторы -> и. (точка) обеспечивают доступ к элементам структур; Оператор *(косвенное обращение по указателю) и & (получение адреса объекта).
Операторы | Выполняются |
() [] -> | Слева направо |
! ~ ++ -- + - * & sizeof | Справа на лево |
* / % | Слева направо |
+ - | Слева направо |
<< >> | Слева направо |
< <= > => | Слева направо |
== != | Слева направо |
& | Слева направо |
^ | Слева направо |
| | Слева направо |
&& | Слева направо |
|| | Слева направо |
?: | Справа налево |
= += -+ *= /= %= &= ^= |= <<= >>= | Справа налево |
, | Слева направо |
Заметим, что приоритеты побитовых операторов &,^ и | ниже, чем приоритетов == и!=, из за чего в побитовых проверках, таких как
If ((x&MASK == 0) …
чтобы получить правильный результат, приходится использовать скобки.
Си подобно многим языкам не фиксирует очередность вычисления операндов оператора(за исключением &&, //, ?:, и,). Например, в инструкции вида
x=f() + g();
f может быть вычислена раньше чем g или наоборот. Из этого следует, что если одна из функций изменяет значение переменной, от которой зависит другая функция, то помещаемый в x результат может зависеть от очередности вычислений.
Очередность вычисления аргументов функции также не определена, поэтому на разных компиляторах
Printf(“%d %d\n”, ++n, power(2,n)); /*НЕВЕРНО*/
Может давать несовпадающие результатыю Результат вызова функции зависит от того, когда компилятор сгенерирует команды увеличения n – до или после обращения к power. Чтобы обезопасить себя от возможности побочного эффекта, достаточно написать
++n;
Printf(“%d %d\n”, n, power(2,n));
Если лперанды оператора принадлежат к разным типам, то они приводятся к некоторому общему типу. Приведение выполняются в соответствии с небольшим числом правил. Обычно автоматически производятся лишь те преобразования, которые без какой-либо потери информации превращают операнды с меньшим диапазоном значений в операнды с большим диапазоном, как, например, преобразование целого в число с плавающей точкой в выражении вроде f + i. Выражения, не имеющие смысла, например число с плавающей точкой в роли индекса, не допускаются. Выражения, в которых могла бы теряться информация( скажем, при присваивании длинных целых переменным более коротких типов или при присваивании значении с плавающей точкой целым переменным), могут повлечь за собой предупреждение, но они допустимы.
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 |


