Студопедия

КАТЕГОРИИ:


Архитектура-(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; Просмотров: 1176; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.07 сек.