6.2.Глобальные переменные
Глобальными называют переменные, которые объявлены за пределами функций. Они доступны всем функциями программы, в которых не объявлены локальные переменные с теми же именами. С помощью глобальных переменных можно передавать в функцию исходные данные и возвращать результаты, создавая, таким образом, функции без параметров. Пример функции без параметров. В данном примере с помощью функции из матрицы выбираются и запоминаются в одномерном массиве все положительные элементы матрицы, а также вычисляются сумма и произведение всех элементов матрицы.
// функция без параметров
#include "stdafx.h"
#include "stdio.h"
#include "conio.h"
const int mmax=10,nmax=15;
float a[mmax][nmax], b[mmax*nmax],sum,pr;
int m,n,k;
void fun();
int _tmain(int argc, _TCHAR* argv[])
{ int i,j;
printf("wwedit m i n\n");
scanf("%d%d",&m,&n);
printf("\nwwedie matrizu\n");
for(i=0;i<m;i++)
for (j=0;j<n;j++)
scanf("%f",&a[i][j]);
fun();
if (k>0)
{printf("\nmassiw poloshitelnix\n");
for(i=0;i<k;i++)
printf("%6.2f ",b[i]);
} else printf("\npoloshitelnix net");
printf("\n sum=%6.2f pr=%6.2f",sum,pr);
getch();
return 0;
}
void fun()
{int i,j;
k=0;
sum=0.0;
pr=1.0;
for(i=0;i<m;i++)
for (j=0;j<n;j++)
{sum+=a[i][j];
pr*=a[i][j];
if (a[i][j]>0)
{b[k]=a[i][j];
k++;
}
}
}
Однако использование глобальных переменных не соответствует принципам структурного программирования, затрудняет отладку программ, препятствует помещению функций в библиотеки общего пользования. Необходимо стремиться к тому, чтобы функции были максимально независимы, а их интерфейс полностью определялся прототипом функции. Использование глобальных переменных может приводить к возникновению побочных эффектов. Побочным эффектом называют изменение (перевычисление) глобальной переменной в функции. Если такое изменение не должно производиться, то дальнейшее использование глобальной переменной в основной функции приведет к ошибке, которую трудно будет обнаружить.
Следующая программа демонстрирует побочный эффект. Результат работы зависит от последовательности вычисления суммы, сохраняемой в переменной y. В первом варианте сначала переменной y присваивается значение переменной x, а затем дважды производится обращение к функции sum, в итоге получим y=22. Во втором варианте сначала переменной y присваивается сумма значений, возвращаемых при двух обращениях к функции sum, а затем прибавляется значение переменной x. Поскольку значение глобальной переменной x изменяется в функции, то к y прибавится дважды измененное значение x, равное 9 и результат будет равен 26, а в первом случае в y заносится исходное значение x (до обращения к функции), результат будет равен 22.
// побочные эффекты
#include "stdafx.h"
#include "stdio.h"
#include "conio.h"
#include "math.h"
float x=5;
float sum(float a,float b);
int _tmain(int argc, _TCHAR* argv[])
{ float a=8,b=2,y=0;
printf("x=%5.1f",x);
y=x; // 1-ый вариант
y+=sum(a,b)+sum(3,4);
//2-ой вариант y+=x;
printf(" y=%5.1f",y);
getch();
return 0;
}
float sum( float a,float b)
{ x=x+2;
printf("\nx=%5.1f a=%5.1f b=%5.1f",x,a,b);
return a+b;
}