КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Приоритет переменных с файловой и локальной областями действия. 3 страница
float farray[7]={3.3,5.2,0.05,1.49,3.12345,31.0,2.007}; int isum; float fsum; isum=adder(iarray); fsum=adder(farray); // Сумма целых чисел равна cout << "The sum of the integer numbers is: " << isum << endl; // Сумма чисел с плавающей точкой равна cout << "The sum of the float numbers is: " << fsum << endl;
printf ("\n\nPress any key to finish\n"); _getch(); return(0); }
int adder(int iarray[]) { int i; int ipartial; ipartial=iarray[0]; for (i=1;i<7;i++) ipartial+=iarray[i]; return (ipartial); }
float adder(float farray[]) { int i; float fpartial; fpartial=farray[0]; for (i=1;i<7;i++) fpartial+=farray[i]; return (fpartial); }
7.36.3. Многоточие (..). Многоточие используется тогда, когда количество аргументов неизвестно. Неопределенное количество аргументов может быть указано в операторе функции с формальными параметрами. Например:
void yourfunction{int t,float u,...);
Такая запись указывает компилятору С, что за обязательными переменными t и u могут следовать, а могут и не следовать другие аргументы. Конечно же, многоточие приостанавливает проверку типов.
7.37. Сложности в правилах области действия (scope rules). Если используются переменные с различной областью действия, то можно столкнуться с совершенно неожиданными результатами программирования, называемыми побочными эффектами. Например, как вы уже знаете, может существовать переменная (вернее две переменные с одинаковым именем) как с файловой, так и с локальной областью действия. Правила области действия констатируют, что переменная с локальной областью действия (называемая локальной переменной) имеет приоритет по сравнению с переменной с файловой областью действия (называемой глобальной переменной). Хотя это выглядит достаточно просто, давайте рассмотрим несколько проблем, которые не так очевидны и с которыми вы можете столкнуться при программировании.
7.37.1. Неопределенные символы в программе на С. В следующем примере четыре переменные имеют локальную область действия внутри функции main(). Копии переменных il и im передаются в функцию iproduct(). Это не нарушает правила области действия. Однако, когда функция iproduct() пытается обратиться к переменной in, она ее не находит. Почему? Потому что область действия этой переменной локальна для функции main().
/*08SCOPEP.C Программа на С иллюстрирует проблемы, связанные с правилами области действия. Предполагается, что функция вычисляет произведение трех чисел. Компилятор выдает ошибку, поскольку переменная in не известна функции, вычисляющей произведение*/
#include "stdafx.h" #include <iostream> #include <conio.h> #include <stdio.h> #include <process.h> #include <ctype.h> #include <stdlib.h> #include <math.h> #include <stdarg.h> #include <string.h> using namespace std;
int iproduct(int iw,int ix); /* int in=10; */
main () { int il=3; int im=7; int in=10; int io; io=iproduct(il,im); /* Произведение чисел равно */ printf("The product of the numbers is: %d\n", io);
printf ("\n\nPress any key to finish\n"); _getch(); return(0); }
int iproduct(int iw,int ix) { int iy; iy=iw*ix; /* iy=iw*ix*in; */ return (iy); }
7.37.2. Использование переменной с файловой областью действия. В следующем примере переменной in определена файловая область действия. Глобальная видимость переменной in во всем файле позволяет ее использовать как функции main(), так и функции iproduct(). Также надо заметить, что обе функции, main() и iproduct(), могут изменять значение переменной. Существует хорошее программистское правило: если функции должны быть действительно переносимыми, не следует позволять им менять глобальные переменные.
/*08FSCOPE.C Программа на С иллюстрирует проблемы, связанные с правилами области действия. Предполагается, что функция вычисляет произведение трех чисел. Предыдущая проблема решена: третьей переменной задана файловая область действия*/
#include "stdafx.h" #include <iostream> #include <conio.h> #include <stdio.h> #include <process.h> #include <ctype.h> #include <stdlib.h> #include <math.h> #include <stdarg.h> #include <string.h> using namespace std;
int iproduct(int iw,int ix); int in=10;
main() { int il=3; int im=7; int io; io=iproduct(il,im); printf("The product is: %d\n", io);
printf ("\n\nPress any key to finish\n"); _getch(); return(0); }
int iproduct(int iw,int ix) { int iy; iy=iw*ix*in; return(iy); }
Эта программа будет компилироваться без ошибок и напечатает на экране значение произведения 210.
7.37.3. Приоритет переменных с файловой и локальной областями действия. Правила области действия констатируют, что у переменной, имеющей как локальную, так и файловую область действия, используется ее локальное, а не глобальное значение. Это положение иллюстрирует следующая небольшая программа: // 08SCOPEP.CPP /*Программа на С иллюстрирует проблемы, связанные с правилами области действия. Предполагается, что функция вычисляет произведение трех чисел, но каких чисел? Две переменные задаются как параметры функции. Третья переменная имеет и файловую и локальную область действия*/ #include "stdafx.h" #include <iostream> #include <conio.h> #include <stdio.h> #include <process.h> #include <ctype.h> #include <stdlib.h> #include <math.h> #include <stdarg.h> #include <string.h> using namespace std;
int iproduct(int iw,int ix); int in=10;
main() { int il=3; int im=7; int io; io=iproduct(il,im); printf("The product of the numbers is: %d\n", io);
printf ("\n\nPress any key to finish\n"); _getch(); return(0); }
int iproduct(int iw,int ix) { int iy; int in=2; iy=iw*ix*in; return(iy); }
7.37.4. Проблемы области действия в C++. Следующий пример на C++ работает нормально до момента вывода информации на экран. Оператор cout правильно распечатывает значения переменных il и im. Но при обращении к переменной in он выбирает глобальную переменную с файловой областью действия. Результат, выдаваемый программой, 3*7*10 = 42, является явной ошибкой. Как вы знаете, в подобной ситуации функция iproduct() использует локальное значение переменной in.
// 08SCOPEP.CPP // Программа на C++ иллюстрирует проблемы, связанные с правилами // области действия. Предполагается, что функция вычисляет // произведение трех чисел. Переменная in имеет локальную область // действия и используется в функции для вычисления произведения. // Однако, в главной функции определено, что значение этой переменной // равно 10. Что здесь неправильно?
#include "stdafx.h" #include <iostream> #include <conio.h> #include <stdio.h> #include <process.h> #include <ctype.h> #include <stdlib.h> #include <math.h> #include <stdarg.h> #include <string.h> using namespace std;
int iproduct(int iw,int ix); int in=10;
main() { int il=3; int im=7; int io; io=iproduct(il,im); cout << "The product of " << il <<" * " << im << " * " << in << " is: " << io << endl;
printf ("\n\nPress any key to finish\n"); _getch(); return(0); }
int iproduct(int iw,int ix) { int iy; int in=2; iy=iw*ix*in; return (iy); }
7.37.5. Операция уточнения области действия в C++. В следующем примере для того, чтобы избежать конфликтов между переменными как с файловой, так и с локальной областями действия, используется операция уточнения области действия (scope resolution operator::). Предыдущая программа выдавала неправильное значение произведения, так как в вычислениях использовалось локальное значение. Обратите внимание на то, как в приведенном листинге в функции iproduct() используется операция уточнения области действия.
// 08GSCOPE.CPP // Программа на C++ иллюстрирует проблемы, связанные с правилами // области действия, и использование операции уточнения области // действия. При вычислении произведения с помощью этой операции, // в функции используется переменная с файловой областью действия
#include "stdafx.h" #include <iostream> #include <conio.h> #include <stdio.h> #include <process.h> #include <ctype.h> #include <stdlib.h> #include <math.h> #include <stdarg.h> #include <string.h> using namespace std;
int iproduct(int iw,int ix); int in=10;
main() { int il=3; int im=7; int io; io=iproduct(il,im); cout << "The product of " << il <<" * " << im << " * " << in << " is: " << io;
printf ("\n\nPress any key to finish\n"); _getch(); return(0); }
int iproduct(int iw,int ix) { int iy; int in=2; iy=iw*ix*(::in); return(iy); }
7.38. Равноправность функций в языке Си. Все функции в программе, написанной на языке Си, равноправны: каждая из них может вызывать любую другую функцию и в свою очередь каждая может быть вызвана любой другой функцией. Это делает функции языка Си несколько отличными от процедур Паскаля, поскольку процедуры в Паскале могут быть вложены в другие процедуры (причем, процедуры, содержащиеся в одном гнезде, являются недоступными для процедур, расположенных в другом). Нет ли у функции main() какой-то специфики? Безусловно, есть. Она заключается в том, что после «сборки» программы, состоящей из нескольких функций, ее выполнение начинается с первого оператора функции main(). Но этим ее исключительность и ограничивается. Даже функция main() может быть вызвана другими функциями.
7.39. Компиляция программ, состоящих из двух или более функций. Простейший способ использования нескольких функций в одной программе заключается в том, чтобы поместить их в один файл, после чего осуществить компиляцию программы, содержащейся в этом файле так, как будто она состояла из одной функции Второй способ заключается в применении директивы #include Если одна функция содержится в файле с именем filel.c, а вторая в файле file2.c, поместите эту директиву в файл filel.c 10. Выбор вариантов. 10.1. Операции отношения и выражения. 10.2. Понятие «истина». 10.3. Условные операторы.
Дата добавления: 2015-01-03; Просмотров: 1207; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |