Глобальные и локальные переменные
Вызов логических функций
Некоторые трудности часто бывают связаны с вызовом функций, возвращающих тип логический тип bool, хотя ничего сложного здесь нет. Пример проверки, является ли число простым:
boolisPrime(intn){
for(inti=2;i<=n-1;i++){
if(n%i==0){
returnfalse;
}
}
returntrue;
}
intmain()
{
//Можно так
isPrime(17)?cout<<"Yes":cout<<"No";
//Или так
for(inti=2;i<100;i++){
if(isPrime(i)){
cout<<i<<endl;
}
}
Посмотрите на следующий пример:
int x = 10;
int summa(int y) {
result = x+y;
return x + y;
}
А теперь еще один:
int summa_version2(int y) {
int x = 10;
result = x+y;
return result;
}
В чем отличие этих двух фрагментов кода? Нетрудно заметить, что отличие заключается в объявлении переменной x: в первом случает она объявлена до функции, а во втором – после. Во что выльется такая разница?
В первом случае переменная является глобальной, т.е. доступной во всех функциях программы, а во втором – локальной, т.е. доступной только внутри функции, где она объявлена. Константы, заданные при помощи директивы #define являются глобальными.
Как Вы думаете, какой вариант правильный? С точки зрения языка программирования правильны оба варианта, поскольку обе программы успешно откомпилируются и при запуске приведут к одному результату. Но с точки зрения хорошего стиля программирования, который, в конечном счете, приводит к более понятным и легко отлаживаемым программам.
Обратите внимание, что данная запись является неправильной:
summa_version2(4,7);
cout << result;
Функция, как и любая другая конструкция языка Си, делит переменные на глобальные и локальные. Локальными являются те переменные, которые описаны внутри функции и, значит, доступны только внутри этой функции. Например, в следующем фрагменте кода переменная result – локальная:
int summa(int a, int b) {
int result = a+b;
return result;
}
Понятие локальной переменной относится не только к функциям, но и к другим конструкциям языка. Например, в следующем фрагменте переменная i является локальной для цикла:
for (int i=0; i<10; i++) {
…
}
Переменная, описанная внутри некоторого блока, ограниченного фигурными скобками, является локальной для этого блока:
if (…) {
…
int x;
…
}
Обращение к локальной переменной за пределами блока, где она описана, приведет к ошибке компиляции, однако можно описать переменную с таким же именем за пределами этого блока, и это будет уже другая переменная.
Внимание – частая ошибка!
Определять или объявлять функции внутри других функций нельзя! Вызывать можно, но определять или объявлять – нет. Например, следующая программа ошибочна:
int main() {
//Локальное определение недопустимо!
void say_hello() {
cout << "Hello!" << endl;
cout << "Bonjour!" << endl;
cout << "Привет!" << endl;
}
}
int main() {
//Локальное объявление недопустимо!
void say_hello();
}