Пунктуаторы, также называемые разделителями, определяются следующим образом:
пунктуатор: одно из [ ] () { },;:... * = #
Открывающая и закрывающая квадратные скобки – [ ] содержат индексы одно- и многомерных массивов, например:
char ch, str[ ] = "Stan"; /* объявлена строка символов */
int mat[3][4]; /* объявлена матрица 3 x 4 */
ch = str[3]; /* переменной ch присваивается 4 – й символ из строки str */
Открывающая и закрывающая круглые скобки – () меняют приоритеты операций в выражении, содержат условия условных выражений и указывают на вызовы функций и параметры функций, например:
d = c * (a + b); /* изменение приоритета */
if (d == z) ++x; /* содержит условие условного оператора */
func(); /* вызов функции без аргументов */
int (*fptr)(); /* объявление указателя функции */
fptr = func; /* отсутствие () означает указатель функции */
void func2(int n); /* объявление функции с аргументами */
Рекомендуется использовать круглые скобки в макроопределениях, что позволяет избежать возможных проблем с приоритетами операций во время расширения, например:
|
|
#define CUBE(x) ((x) * (x) * (x))
Открывающие и закрывающие фигурные скобки – { } обозначают начало и конец составного оператора, например:
if (d == z)
{
++x;
func();
}
Закрывающая фигурная скобка служит концом составного оператора, поэтому точка с запятой (;) после фигурной скобки (}) не требуется, за исключением структур или объявлений классов. Часто точка с запятой не допустима, как, например, в следующем случае
if ( оператор )
{}; /* недопустимое использование точки с запятой */
else …
Запятая (,) отделяет элементы списка аргументов функции, например:
void func(int n, float f, char ch);
Запятая часто используется как операция в выражениях. Смешивание различного использования запятой допустимо, но чтобы их различать, необходимо применять круглые скобки. Например:
func(i, j); /* вызов функции с двумя аргументами */
func((exp1, exp2), (exp3, exp4, exp5)); /* вызов функции с 2 аргументами */
Точка с запятой (;) указывает на конец оператора (конец предложения). Любое допустимое выражение языка С или С++ (включая и пустое выражение), за которым следует (;), интерпретируется как оператор, называемый оператором выражения. Выражение вычисляется, а его значение отбрасывается. Если такое выражение не имеет побочных эффектов, то компилятор языка C++ может его проигнорировать. Например:
a + b; /* a + b вычисляется, но полученное значение теряется */
++a; /* имеется побочный эффект для a */
; /* пустое выражение = нулевой оператор */
Точки с запятой часто используются для создания пустых операторов:
for (i = 0; i < t; i++)
{
;
}
Двоеточие (:) служит для обозначения метки оператора, например:
start:x=0;
...
goto start;
...
или
switch (a) {
case 1: puts(" Первый "); break;
|
|
case 2: puts(" Второй "); break;
...
default: puts(" Ни тот, ни другой !"); break;
}
Многоточие (...) представляет собой три последовательно расположенные точки без пробелов между ними. Многоточие используется в списках формальных аргументов прототипов функций для обозначения переменного числа аргументов, либо аргументов с изменяющимся типом. Например:
void func(int n, char ch,...);
Данное объявление указывает, что func будет определена таким образом, что вызовы ее должны содержать, как минимум, два аргумента, int и char, но также могут иметь и любое число дополнительных аргументов.
В языке С++ запятую, предшествующую многоточию, можно опустить.
Звездочка (*) в объявлении переменной обозначает создание указателя на тип, например:
char *char_ptr; /* объявление указателя на тип char */
Можно объявить указатели с несколькими уровнями вложенности, что обозначается соответствующим количеством звездочек:
int ** int_ptr; /* указатель на указатель на тип int */
double *** double_ptr /* указатель на указатель на указатель на тип double */
Звездочка также используется в качестве операции обращения по адресу, либо операции умножения:
i = *int_ptr; /* переменной i присваивается значение, содержащееся по адресу int_ptr */
a = b * 3.14; /* операция умножения */
Знак равенства (=) разделяет объявления переменных от списков инициализации:
int x = 5; // инициализация переменной x;
char array[5] = { 1, 2, 3, 4, 5 }; // инициализация массива array;
В языке С++ объявления любого типа могут находиться (с некоторыми ограничениями) в любой точке внутри кода. В функциях языка С никакой код не может предшествовать никаким объявлениям переменных.
В списке аргументов функции С++ знак равенства указывает на значение параметра по умолчанию, например:
int f(int i = 0) {... } /* параметр i имеет значение по умолчанию ноль */
Знак равенства используется также как операция присвоения в выражениях:
a = b + c;
ptr = malloc(sizeof(float)*100);
Знак фунта (#) означает директиву препроцессора, если она является первым непробельным символом в строке.
Двойной знак фунта (##) используется как операция слияния лексем на фазе сканирования кода препроцессором, например:
#define VAR(i,j) (i##j) /* создание нового идентификатора ij */