2013-06-23 3 views
1

Я начинаю учиться на C, и в настоящее время я изучаю пересмотренную главу типов данных. Я решил много программ статического класса хранения. Класс статического хранения имеет локальную область. В приведенном ниже коде статическая переменная объявляется выше основной переменной i.e. Это возможно ? И o/p в соответствии с особенностями статического класса хранения является правильным.Статический класс хранения

static int y ; 
main() 
{ 
static int z ; 
printf ("%d %d", y, z) ; 
} 

Может кто-нибудь, пожалуйста, сообщите мне, что объявление статической переменной выше основного правильное? Если это правильно, попробуйте объяснить на непрофессиональном языке.

ответ

6

Класс хранения и область действия - это разные вещи. Ключевое слово static не влияет на область видимости.

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

Класс хранения - это свойство объекта: Фактическая вещь (значение) хранится. Scope - это свойство идентификатора: имя, используемое для ссылки на объект (или тип или функция).

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

Если вы определяете объект как static, его время жизни - это полное выполнение программы. По умолчанию обычный объект, объявленный внутри тела функции, имеет автоматическую продолжительность хранения. Его время жизни зависит от выполнения временной программы в том блоке, в котором он находится, пока выполнение программы не выйдет из блока, в котором он находится. Каждый раз, когда выполнение входит в блок, создается новый экземпляр объекта. Как вы можете видеть, срок службы - это свойство, которое применяется, когда программа запущена.

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

Имя внутри тела функции имеет область видимости блока, но может относиться к объекту с автоматическим (блочным) хранением или к объекту со статическим (целым программным) хранилищем продолжительность.

Когда вы объявляете объект вне тела функции, его идентификатор имеет область действия. Он отображается всем последующим исходным кодом в файле.

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

+0

Asterisk - внешние эффекты внешнего вида (другие файлы), но не Внутренний (текущий файл 0. Очень важно отметить это. –

+0

@ RichardJ.RossIII Это называется * linkage * идентификаторов, а не области. – Jens

+0

@Jens, конечно, это связано с привязкой, но вполне возможно, что C, t связан (работает как скрипт), тем самым делая его * внешним * областью более технически. –

3

y - глобальная переменная, но поскольку она объявлена ​​static, она видна только в модуле компиляции, то есть в том же C-файле. Он не будет доступен из других блоков, если вы компилируете несколько объектов и связываете их вместе. В этом простом примере не имеет значения, объявлена ​​ли глобальная переменная static.

+2

s/global/file scope – Jens