Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Операция запятой






Операция запятой повышает гибкость цикла for, позволяя включить в его спецификацию более одного выражения инициализации или обновления. В листинге 6.13 представлена программа, которая выводит тарифы почтового обслуживания первого класса. (В 2013 году тарифы составляли 46 центов за первую унцию и 20 центов за каждую последующую унцию пересылаемого груза.)

Листинг 6.13. Программа postage.с

// postage.c -- first-class postage rates

#include < stdio.h>

int main(void)

{

const int FIRST_OZ = 46; // 2013 rate

const int NEXT_OZ = 20; // 2013 rate

int ounces, cost;

printf(" ounces cost\n");

for (ounces=1, cost=FIRST_OZ; ounces < = 16; ounces++,

cost += NEXT_OZ)

printf(" %5d $%4.2f\n", ounces, cost/100.0);

return 0;

}

Первые пять строк вывода программы выглядят так:

унции тариф

1 $0.46

2 $0.66

3 $0.86

4 $1.06

 

Операция запятой в программе применяется в выражениях инициализации и обновления. Ее наличие в первом выражении приводит к инициализации переменных ounces и cost. Второе ее вхождение вызывает увеличение на 1 переменной ounces и увеличение на 20 (значение константы NEXT_OZ) переменной cost на каждой итерации. Все вычисления делаются в спецификациях цикла for (рис. 6.4).

Использование операции запятой не ограничивается циклами for, но именно здесь она применяется чаще всего. Эта операция обладает еще двумя свойствами. Во-первых, она гарантирует, что разделяемые ею выражения вычисляются в порядке слева направо. (Другими словами, запятая является точкой следования, поэтому все побочные эффекты слева от запятой учитываются до того, как происходит переход вправо от запятой.) Таким образом, переменная ounces инициализируется раньше переменной cost. В рассматриваемом примере порядок не имеет значения, однако он важен в ситуации, когда переменная ounces задействована в выражении для cost. Для примера взгляните на следующее выражение:

ounces++, cost = ounces * FIRST_OZ

Это приводит к инкрементированию переменной ounces и использованию нового значения ounces во втором подвыражении. Операция запятой, будучи точкой следования, гарантирует, что побочные эффекты левого подвыражения проявятся перед тем, как будет вычислено правое подвыражение.

Во-вторых, значение всего выражения, содержащего операцию запятой, является значением операнда в правой части. Результат выполнения оператора

х = (у = 3, (z = ++у +2) + 5);

выглядит так: переменной у присваивается 3, значение у инкрементируется до 4, к этому значению 4 добавляется 2, результирующее значение 6 присваивается переменной z, к z добавляется 5 и, наконец, финальное значение переменной z, равное 11, присваивается переменной х. Объяснение, почему кто-то мог все это делать, выходит за рамки настоящей книги. С другой стороны, предположим, что вы по неосторожности указали запятую при записи числа:

houseprice = 249, 500;

Здесь нет синтаксической ошибки. Взамен компилятор С интерпретирует это как выражение запятой, с houseprice = 24 9 в качестве левого подвыражения и 500 — в качестве правого. Следовательно, значение всего выражения запятой — это выражение в правой части, а подоператор в левой части присваивает переменной houseprice значение 24 9. Таким образом, результат совпадает с результатом выполнения следующего кода:

houseprice = 249;

500;

Вспомните, что любое выражение становится оператором, если в его конце добавить точку с запятой, поэтому 500; является оператором, который ничего не делает. С другой стороны, оператор

houseprice = (249, 500);

присваивает переменной houseprice значение 500.

 

Запятая применяется также в качестве разделителя, так что запятые в выражении

char ch, date;

и в операторе

printf (" %d %d\n", chimps, chumps);

представляют собой разделители, а не операции запятой.

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.