Локальные и глобальные переменные. Область видимости переменной 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Локальные и глобальные переменные. Область видимости переменной



В языке Си имеет очень важное значение имеет место в программе, в котором происходит объявление переменной. Это определяет область существования переменной (эту область называют областью видимости). Программа не будет компилироваться, если не описать все используемые переменные.

Различают локальные и глобальные переменные. Локальные переменные существуют и в теле функции или оператора управления. Локальные переменные на языке Си (но не С++) объявляются в начале блока – после открывающей фигурной скобки. Только после этого можно использовать их имена в выражениях и операторах. Область видимости локальной переменной – до соответствующей закрывающей фигурной скобки.

Глобальные переменные объявляются вне функций и существуют от точки объявления до конца программы. Соответственно, значение глобальной переменной можно использовать во любом месте программы.

Рассмотрим пример

#include <stdio.h>

int i=1; /* объявление и инициализация глобальной переменной */

float f; /* объявление глобальной переменной */

void fun(void); /* прототип функции пользователя */

void main(void)

{

int k,n; /* объявление локальных переменных */

float g1; /* объявление локальной переменной */

...

}

void fun(void) /* описание функции пользователя */

{

int j=5; /* объявление локальной переменной */

char ch; /* объявление локальной переменной */

...

}

В программе объявлены глобальные и локальные переменные, а также помимо функции main() используется подпрограмма fun(). Глобальные переменные i и f можно использовать в обеих функциях. Значения локальных переменных r, n и g1 можно использовать только в теле функции main(), а переменных j и ch – в теле функции fun().

Константы

В языке Си представляют собой постоянные параметры, константы, которые не изменяются в ходе исполнения программ. Константы могут быть для любого типа данных. Примеры констант приведены в табл. 2.2.

Пример констант различных типов данных

Таблица 2.2.

Имя константы Тип Примеры
символ char ’A’ ‘ч’ ‘\n’
целое int 10 -9345 32000
длинное целое long 100000 5L
вещественное двойной точности double 3.14 1.23456789 –8.9е-40

 

Константы типа символ

Можно задавать в двух формах в виде отдельного символа, который записывается в одиночных кавычках ('А ') или в виде целого числа (55). При этом необходимо помнить, что константы, например, '0' и 0 описывают различные данные.

В языке Си существуют символьные константы, обозначающие специальные управляющие символы, такие как: перевод строки, звуковой сигнал, горизонтальная табуляция. Эти символы нельзя ввести с клавиатуры. Для их использования вначале записывается символ '\' – обратный слеш. Например, символ, означающий перевод строки, описывается так: '\n', горизонтальная табуляция – '\t'. Перечень основных специальных символов приведен в таблице 2.3.

Специальные символы

Таблица 2.3.

Обозначение Назначение
\n перевод строки
\r возврат каретки
\t горизонтальная табуляция
\v вертикальная табуляция
\b стирание символа, возврат на шаг
\f перевод страницы
\” двойная кавычка
\’ апостроф, одиночная кавычка
\\ обратный слеш
\0 нулевой символ, конец строки
звуковой сигнал
\? символ вопроса

 

Целые константы

Эти константы не имеют десятичной точки и порядка числа. В программировании очень часто используются числа, записанные в других системах счисления - двоичной, восьмеричной и шестнадцатеричной. Для двух последних систем в языке Си есть специальная форма записи:

– для восьмеричных целых констант перед числом записывается ноль, и далее используются цифры 0…7;

– для шестнадцатеричных целых констант перед числом устанавливаются два символа 0х и далее используются цифры 0... 9, а также буквы латинского алфавита A, B, C, D, E, F обозначающие соответственно числа от 10 до 15. Примеры целых констант:

восьмеричные: 01 077 012340

шестнадцатеричные: 0х51 0х6А0 0xF59В

Вещественные константы

на языке Си по умолчанию воспринимаются программой как числа типа double. Их можно записать в двух формах:

– в виде числа с десятичной точкой, например, 0.1, 15.189;

– в научном виде (экспоненциальной форме), в котором вместо показателя основания записывается символ Е (или е), например: 1.1Е–10, –5е2 (что эквивалентно математической форме записи чисел 1.1×10–10 и –5×102).

Различие между числами float и double состоит не только в большем диапазоне последних, но и в более точном значении чисел типа double – верными являются 15...16 значащих цифр.

2.6. Макроопределения

Наряду с использованием в тексте программ констант в языке Си существует возможность применения макроопределений (макросов). Макроопределение устанавливает соответствие между именем и определённым значением. Для использования макросов существует несколько предпосылок. Если в программе используется одна и та же константа несколько раз в различных местах программ, то становится желательным использовать соответствующее макроопределение. Другой вариант применения макросов - использование хорошо понимаемых имен.

В общем случае форма записи макроопределения следующая:

#define <ИмяМакроса> <3аменяемоеВыражение>

где <ИмяМакроса> – любое разрешенное имя переменной, при этом желательно использовать заглавные буквы (что облегчает чтение программы). Примеры макросов:

#define NUNBER 1OO

#define LEFT 75

#define RIGHT 77

#define ENTER 13

#define SPACE 0x20

#define PI 3.14159

После определения этих макросов в заголовке, в тексте программы можно использовать имена NUMBER, LEFT, RIGHT и т.д. На этапе создания исполняемого файла (точнее в фазе препроцессора, выполняемой до компиляции) происходит замена имен макросов на соответствующие им значения. Например, если в тексте программы встречаются имена NUMBER, то происходит замена этого имени на значение 100.

2.7. Преобразование типов данных

Исходно предполагается, что пользователь правильно использует типы констант и переменных. Что произойдет, если в выражениях присутствуют данные различных типов? В этом случае язык Си выполняет автоматическое приведение типов данных. Например, какое число будет записано в переменной а после инициализации

int а=11.54;

Так как переменная а определяется как переменная целого типа, то дробная часть вещественной константы 11.54 будет отброшена без округления и в ячейке переменной а будет записано целое число 11.

То же самое произойдет, т.е. не будет учитываться дробная часть числа, если исполнить следующие операторы:

float i;

i=1/10;

Это происходит, потому что в начале вычисляется правая часть выражения, а она содержит только целые константы 1 и 10, следовательно, результат тоже будет целое число: 1/10=0, а не 0.1 как ожидалось. Окончательно переменной i будет присвоено значение 0 и это несмотря на то, что она определяется вещественной.

В общем случае при расчете арифметических выражений приведение типов данных в языке Си происходит следующим образом:

1) все переменные типа char преобразуются в тип int, переменные типа float - в тип double.

2) для любой пары операндов (т.е. в результате вычисления, например, суммы или произведения двух чисел) происходит следующее преобразование:

– если хотя бы один из операндов double, то и второй преобразуется в этот тип;

– если хотя бы один из операндов long, то и другой преобразуется в long;

– если хотя бы один из операндов unsigned, то и другой преобразуется в unsigned.

3) конечный результат после операции присваивания приводится к типу переменной в левой части выражения.

Рассмотрим пример вычисления арифметического выражения:

char а=25, b=20;

int i,j,

long k;

double d=l.55;

i=a*b;

k=10000*b;

j = b*d;

printf(“i=%d k=%ld j=%d”,i,k,j);

При вычислении значения переменной i хотя обе переменные имеют тип char и как будто бы результат перемножения должен выйти за максимальные размеры, но по первому правилу обе переменные приводятся к целому типу. В этом случае результат за допустимые пределы не выйдет i=25*20=500. Для второй переменной k целого типа результат выходит за пределы целого, хотя переменная k объявлена типа длинного целого, поэтому результат перемножения будет неверный. Чтобы исправить эту ошибку необходимо строчку переписать следующим образом:

k=(long)10000*b;

Для третьей переменной j результатом перемножения будет вещественное число двойной точности, при присвоении этого результата происходит приведение типа (double)®(int) и при этом происходит потеря дробной части полученного произведения. пределы.

Задания для решения

2.8.1. Составьте программу, в которой объявляются две целые переменные a1 и a2, вещественная переменная b и переменные типа символ c и d. Переменная a2 инициализирована значением 10.

2.8.2. Найдите ошибки в приведенной программе

#include <conio.h>

#include <studio.h>

void main() {

int printf=5; /* объявление целой переменной */

long number-one; объявление переменной типа длинное целое

double f=1e,

scanf=3.14;/* объявление вещественных переменных */

char if_else='a',

red%bull=100;/* объявление переменных типа символ */

unsigned float a=5,

void=1.e-10;;/* объявление вещественных переменных */

getch(); /* ожидание нажатия любой клавиши */

}

2.8.2. Напишите программу, в которой вводится переменная типа символ, она инициализируется значением 125. Прибавьте единицу к переменной и выведите новое значение переменной на экран. Повторите эти операции (увеличения на единицу и вывода на экран) еще 3 раза. Какие значения переменной будут выведены? Объясните результат.

2.8.4. Составьте программу, в которой сообщение "Привет мир" на экран бы выводилось в кавычках.

2.8.5. Запишите в тетради с указанием всех пробелов и созданных новых строк, что будет выведено на экран следующими функциями (символ V означает символ пробела):

printf(“Это\nVПростоVV\nСтрока\n\n”);

printf(“H\nVE\nVVL\nVVVL\nVVVVO\n”);

printf(“\t\tИванов\n\tПетров\n\Сидоров\n”);

 


ФУНКЦИИ ВВОДА-ВЫВОДА



Поделиться:


Последнее изменение этой страницы: 2016-08-15; просмотров: 683; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.14.130.24 (0.016 с.)