2.8  Пунктуаторы

Пунктуаторы, также называемые разделителями, определяются следующим образом:

пунктуатор: одно из  [ ] ( ) { } , ; : … * = #

Открывающая и закрывающая квадратные скобки – [ ] содержат индексы одно- и многомерных массивов, например:

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  */