Добавил:
Оставь надежду всяк сюда поступивший Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Синников С++ / IV New hope.doc
Скачиваний:
63
Добавлен:
13.01.2019
Размер:
282.11 Кб
Скачать

12 Операция запятая

Операция запятая (,) позволяет объединить несколько выражений в одно выражение и, таким образом, в Си вводится понятие выражение с запятой, имеющее общий вид записи:

<выражение>, <выражение>, <выражение>, . . .

Пара выражений, разделенных запятой, вычисляется слева направо. Тип и значение результата выражения с запятой есть тип и значение самого правого выражения. Например: k=a+b,d=m+n,5.2+7 это выражение с запятой. Выражение вычисляется слева направо. Его значением является 12.2 типа double. В процессе вычисления этого выражения переменным k и d будут присвоены соответствующие значения.

Для выражения d=(k=5+2,5+3) значение переменной d будет 8, т.к. переменной d присваивается значение выражения с запятой, которое в свою очередь равно значению самого правого выражения-операнда. Запятая в Си используется в двух контекстах: как разделитель списка объектов, например, в операторе описания данных, и как операция, определяющая последовательное вычисление выражений. Поэтому допустимо, например, такое описание с инициализацией: int a,b,c=(1,2,5),d; где переменная c инициализируется константным выражением с запятой 1,2,5 и принимает значение 5. Контекст знака запятая (операция или разделитель) компилятор "чувствует" по скобкам. Внутри скобок – это операция запятая, вне скобок – разделитель.

Забегая вперед, отметим, что аналогичная ситуация может возникнуть в списке фактических аргументов при обращении к функции. Обращение к функции, содержащее три аргумента, причем второй имеет значение 5, может выглядеть так: f(a,(t=3,t+2),c).

Чаще всего операция запятая используется в заголовках циклов, в местах, где синтаксис разрешает записать только одно выражение, а надо записать несколько. Тогда выражения объединяются в одно при помощи операции запятая. Например, когда нужно проинициализировать перед началом цикла или увеличить в конце цикла несколько переменных:

for (i=1, j=2; i<n; j++,i++) …

Преобразование типов

Если в выражении появляются операнды различных типов, то они преобразуются к некоторому общему типу, при этом к каждому арифметическому операнду применяется такая последовательность правил:

Если один из операндов в выражении имеет тип long double, то остальные тоже преобразуются к типу long double.

В противном случае, если один из операндов в выражении имеет тип double, то остальные тоже преобразуются к типу double.

В противном случае, если один из операндов в выражении имеет тип float, то остальные тоже преобразуются к типу float.

В противном случае, если один из операндов в выражении имеет тип unsigned long, то остальные тоже преобразуются к типу unsigned long.

В противном случае, если один из операндов в выражении имеет тип long, то остальные тоже преобразуются к типу long.

В противном случае, если один из операндов в выражении имеет тип unsigned, то остальные тоже преобразуются. к типу unsigned.

В противном случае все операнды преобразуются к типу int. При этом тип char преобразуется в int со знаком; тип unsigned char в int, у которого старший байт всегда нулевой; тип signed char в int, у которого в знаковый разряд передается знак из сhar; тип short в int (знаковый или беззнаковый).

Предположим, что вычислено значение некоторого выражения в правой части оператора присваивания. В левой части оператора присваивания записана некоторая переменная, причем ее тип отличается от типа результата в правой части. Здесь правила преобразования очень простые: значение справа от оператора присваивания преобразуется к типу переменной слева от оператора присваивания. Если размер результата в правой части больше размера операнда в левой части, то старшая часть этого результата будет потеряна.

В языке Си можно явно указать тип любого выражения. Для этого используется операция преобразования ("приведения") типа. Она применяется следующим образом:

(тип) выражение

(здесь можно указать любой допустимый в языке Си тип).

Рассмотрим пример:

int a = 30000;

float b;

........

b = (float) a * 12;

(переменная a целого типа явно преобразована к типу float; если этого не сделать, то результат будет потерян, т.к. a * 12 > 32767).

Преобразование типа также может использоваться для преобразования типов аргументов при вызове функций.

Соседние файлы в папке Синников С++