Хрестоматия по программированию на Си в Unix


Простые программы и алгоритмы. Сюрпризы, советы. Хрестоматия по программированию на Си в Unix


.

В чем ошибка?

файл A.c файл B.c

--------------------------------------------------- extern int x; extern int x; main(){ x=2; f(){ f(); printf("%d\n", x); } }

Ответ: переменная x в обоих файлах объявлена как extern, в результате память для нее нигде не выделена, т.е. x не определена ни в одном файле. Уберите одно из слов extern!

.

В чем ошибка?

файл A.c файл B.c

--------------------------------------------------- int x; extern double x; ... ...

Типы переменных не совпадают. Большинство компиляторов не ловит такую ошибку, т.к. каждый файл компилируется отдельно, независимо от остальных, а при "склейке" файлов в общую выполняемую программу компоновщик знает лишь имена переменных и функций, но не их типы и прототипы. В результате программа нормально скомпилируется и соберется, но результат ее выполнения будет непредсказуем! Поэтому объявления extern тоже полезно выносить в include-файлы:

файл proto.h

----------------- extern int x; файл A.c файл B.c

------------------ ----------------- #include "proto.h" #include "proto.h" int x; ...

то, что переменная x в A.c оказывается описанной и как extern - вполне допустимо, т.к. в момент настоящего объявления этой переменной это слово начнет просто игнорироваться (лишь бы типы в объявлении с extern и без него совпадали - иначе ошибка!).

.

Что печатает программа и почему?

int a = 1; /* пример Bjarne Stroustrup-а */ void f(){ int b = 1; static int c = 1; printf("a=%d b=%d c=%d\n", a++, b++, c++); } void main(){ while(a < 4) f(); }

Ответ:

a=1 b=1 c=1 a=2 b=1 c=2 a=3 b=1 c=3

.

Автоматическая переменная видима только внутри блока, в котором она описана.

Что напечатает программа?

/* файл A.c */ int x=666; /*глоб.*/ main(){ f(3); printf(" ::x = %d\n", x); g(2); g(5); printf(" ::x = %d\n", x); } g(n){ static int x=17; /*видима только в g*/ printf("g::x = %2d g::n = %d\n", x++, n); if(n) g(n-1); else x = 0; } /* файл B.c */ extern x; /*глобал*/ f(n){ /*локал функции*/ x++; /*глобал*/ { int x; /*локал блока*/ x = n+1; /*локал*/ n = 2*x; /*локал*/ } x = n-1; /*глобал*/ }




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



Книжный магазин