Основы программирования


Операции увеличения и уменьшения - часть 2


В префиксной форме операция записывается перед переменной, как в приведенных выше примерах. В суффиксной форме операция записывается после переменной:

++x; // Префиксная форма x--; // Суффиксная форма

Разница между префиксной и суффиксной формами проявляется только при вычислении сложных выражений. Если используется префиксная форма операции ++, то сначала переменная увеличивается, и только после этого ее новое значение используется в выражении. При использовании суффиксной формы значение переменной сначала используется в выражении и только затем увеличивается. Примеры:

int x = 5, y = 5, a, b; a = (++x) + 2; // переменной a присваивается значение 8 b = (y++) + 2; // переменной b присваивается значение 7

С логической точки зрения, префиксная операция более естественна (при использовании суффиксной формы надо сперва вычислить сложное выражение и только затем вернуться к увеличению переменной, т.е. операция ++ выполняется не в момент ее использования, а как бы откладывается на потом). Забегая вперед, отметим, что это различие весьма существенно при программировании на C++ в случае переопределения операторов увеличения для классов. Тем не менее, в большинстве книг по Си суффиксная форма используется чаще (скорее всего, эта традиция, связаная с эстетикой текста).

Дадим два совета (возможно, не бесспорные) по использованию операций ++ и --:

  • никогда не применяйте эти операции в сложных выражениях! Ничего, кроме путаницы, это не дает. Например, вместо фрагмента

    double *p, x, y; . . . y = *p++ + x;

    лучше использовать фрагмент double *p, x, y; . . . y = *p + x; ++p;

    С точки зрения компилятора, они абсолютно эквивалентны, но второй фрагмент проще и понятнее (и, значит, вероятность ошибки программирования меньше);

  • всегда отдавайте предпочтение префиксной форме операций ++ и --. Например, вместо фрагмента

    int x, y; . . . x++; y--; // Используется суффиксная форма

    лучше использовать фрагмент

    int x, y; . . . ++x; --y; // Лучше применять префиксную форму




Начало  Назад  Вперед