netlib.narod.ru< Назад | Оглавление | Далее >

4.8. Блочная структура

Поскольку функции в Си нельзя определять внутри других функций, язык не допускает блочную структуру программы в том смысле, как это реализовано в Паскале и подобных ему языках. Но переменные внутри функций можно определять в блочно-структурной манере. Объявления переменных (вместе с инициализацией) разрешено помешать не только в начале функции, но и после любой открывающей фигурной скобки, начинающей блок инструкций. Переменная, описанная таким способом, перекрывает переменные с тем же именем, расположенные в блоках верхнего уровня, и существует вплоть до соответствующей закрывающей фигурной скобки. Например, в

    if (n > 0) {
        int i; /*описание новой переменной i */

        for (i = 0; i < n; i++)
            ...
    }

областью видимости переменной i является ветвь if, выполняемая при n > 0; и эта переменная никакого отношения к любым переменным i, расположенным вне данного блока, не имеет. Автоматические переменные, объявленные и инициализируемые в блоке, инициализируются каждый раз при входе в блок. Переменные, помеченные словом static инициализируются только один раз при первом входе в блок.

Автоматические переменные и формальные параметры также перекрывают внешние переменные и функции с теми же именами. Например, в

    int x;
    int y;

    f(double x)
    {
        double y;
        ...
    }

x внутри функции f рассматривается как параметр типа double, в то время как вне f это внешняя переменная типа int. То же самое можно сказать и о переменной y.

С точки зрения стиля программирования, лучше не пользоваться одними и теми же именами для разных переменных, поскольку слишком велика возможность путаницы и появления ошибок.


netlib.narod.ru< Назад | Оглавление | Далее >

Сайт управляется системой uCoz