Статические глобальные переменные 


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



ЗНАЕТЕ ЛИ ВЫ?

Статические глобальные переменные



Когда оператор static применяется к глобальной переменной, он сообщает компилятору о необходимости создания глобальной переменной, которая будет известна только в файле, где она объявлена. Это означает, что, даже если переменная является глобальной, другие подпрограммы в других файлах не будут знать о ней. Таким образом, не возникает побочных эффектов.

 


Auto

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

 

Register

Спецификатор register просит, чтобы компилятор сохранил переменную способом, позволяющим осуществлять наибыстрейший доступ. Для целых чисел и символов это обычно подразумевает размещение не в памяти, а в регистрах процессора. Для других типов переменных компилятор может использовать другие способы для уменьшения времени доступа. Компилятор может просто проигнорировать данную просьбу.

Нельзя применять register к глобальным переменным. Также, поскольку регистровая переменная может быть сохранена в регистре процессора, нельзя получить адрес регистровой переменной. (Данное ограничение присутствует только в С, но не в С++.)

 

Оператор присваивания

 

Общий вид оператора присваивания следующий:

 

имя_переменной = выражение;


где выражение может быть как простой одиночной константой, так и сложной комбинацией переменных, операторов и констант. В левой части оператора присваивания должна стоять переменная, а не функция или константа.

 

Многочисленное присваивание

 

С позволяет присваивать нескольким переменным одни и те же значения путём использования многочисленных присваиваний в одном операторе. Например, данный фрагмент программы присваивает переменным x, y, z значение 0:

 

x = y = z = 0;

 

В профессиональных программах переменным часто присваиваются стандартные значения с использованием данного метода.

 


Преобразование типов при присваивании

 

Преобразование типов предназначено для ситуации, в которой переменные одного типа смешиваются с переменными другого типа. Когда возникает подобная ситуация в операторе присваивания, используется следующее правило: значение справа от оператора присваивания преобразуется к типу объекта, стоящего слева.

 

Инициализация переменных

 

Во время объявления переменных можно сообщить им значение путём помещения знака равенства и константы после имени переменной. Этот процесс называется инициализацией и в общем случае имеет вид:

 

тип имя_переменной = константа;

 

Ниже приведено несколько примеров

 

char ch = ‘a’;

int first = 0;

float balance = 123.23;

 

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

 

Строковые константы

 

C поддерживает ещё один тип констант в дополнение к предопределённым типам данных. Это строковые константы. Все строковые константы заключаются в двойные кавычки, например: “this is a test”. Не следует путать строковые константы с символами. Одиночный символ заключается в одинарные кавычки, как например: 'a'. Строки мы рассмотрим позже.

 

Символьные константы с обратным слэшем

Заключение символов в одинарные кавычки применимо для большинства печатаемых символов, но некоторые, как например звонок, невозможно ввести с клавиатуры. С этой целью С использует специальные константы с обратным слэшем, показанные в таблице.

 

Код Значение
\b Забой
\f Перевод формата
\n Новая строка
\r Возврат каретки
\t Горизонтальная табуляция
\” Двойная кавычка
\’ Одинарная кавычка
\0 Нулевой символ
\\ Обратный слэш
\v Вертикальная табуляция
\a Звонок
\N Восьмеричная константа (N – значение)
\xN Шестнадцатеричная константа (N – значение)

 

Символы с обратным слэшем следует использовать таким же образом, как и обычные символы.


Лекция 3.

План

1. Арифметические операторы

2. Операторыотношения и логические операторы

3. Битовые операторы

4. Операторы указания

5. Выражения

6. Операторы управления программой

 

 

Операторы

С имеет множество встроенных операторов. Оператор – это символ, который сообщает компилятору о необходимости выполнения некоторых математических или логических действий. Имеется три больших класса операторов: арифметические, отношения, логические и битовые. Кроме этого, С имеет несколько специальных операторов для частных задач.

 

Арифметические операторы

Приоритет выполнения арифметических операций следующий:

 

высший +(унарный плюс) – (унарный минус) ++ -- * / %

низший + - (бинарные операторы)

 

Операторы, обладающие одним приоритетом, вычисляются компилятором слева направо. Круглые скобки в С устанавливают наивысший приоритет операций.

 

Операторы отношения и логические операторы

Ключевой концепцией операторов отношения и логических операторов является понятие истины и лжи. В С истине соответствует любое значение кроме 0, лжи – 0. Выражение, использующее операторы отношения или логические операторы, возвращает 0 для лжи и 1 для истины.

 

Операция Значение Пример
! Логическое НЕ !EOF
= = Равно value==0
!= Не равно value!=0
< Меньше i<count
> Больше i>count
> = Больше или равно i>=count
< = Меньше или равно i<=count
|| Логическое ИЛИ !a || b
&& Логическое И a>8 && c<5

 

Таблица истинности для логических операторов образована с использованием на входах 1 и 0:

 

P q p&&q p||q !p
         
         
         
         

 

Как операторы отношения, так и логические операторы имеют более низкий приоритет по сравнению с арифметическими операторами. Это означает, что выражение 10 > 1 + 12 вычисляется как 10 > (1 + 12). Результатом будет ложь.

Ниже показаны приоритеты выполнения операторов отношения и логических операторов

 

высший!

> >= < <=

==!=

&&

низший ||

 

Как и в арифметических выражениях, возможно использование круглых скобок для изменения естественного порядка вычисления операторов отношения или логических операторов. Например:

 

!1 && 0

 

даст в результате 0, поскольку! вычисляется первым, а затем вычисляется &&. Если расставить скобки следующим образом:

 

!(1 && 0)

 

то получится истина.

Надо помнить, что все выражения с операторами отношения и логическими операторами дают в результате 0 или 1. Поэтому следующий фрагмент программы не только корректен, но и печатает число 1:

 

int x;

 

x =100;

printf(“%d”, x > 1);

 


Битовые операторы

С поддерживает все существующие битовые операторы. Битовые операции – это считывание, установка или сдвиг битов в байте или слове, которые соответствуют стандартным типам языка С char и int. Битовые операции не могут использоваться с float, double, long double, void и другими сложными типами.

 

Оператор Действие
& И
| ИЛИ
^ Исключающее ИЛИ
~ Дополнение
>> Сдвиг вправо
<< Сдвиг влево

 

Битовые операторы И, ИЛИ, НЕ используют ту же таблицу истинности, что и их логические эквиваленты, за тем исключением, что они работают побитно. Исключающее ИЛИ имеет следующую таблицу истинности:

 

p q p^q

0 0 0

0 1 1

1 0 1

1 1 0

 

Битовое И чаще всего используется для обнуления битов. То есть любой бит установленный в 0, вызывает установку соответствующего бита в другом операнде в также в 0. Например, следующая функция читает символы из порта модема, используя функцию read_modem(), и сбрасывает бит чётности в 0.

 

char get_char_from_modem(void)

{

char ch;

ch = read_modem();

return (ch & 127);

}

 

Чётность отображается старшим битом, который устанавливается в 0 с помощью битового И, поскольку 7 младших бит равны 1.

 

Оператор?

С имеет очень мощный оператор, который можно использовать вместо if-else. Оператор? имеет следующий вид:

 

выражение1? выражение2: выражение3

 

Оператор? работает следующим образом: вычисляется выражение1, если оно истинно, то вычисляется выражение2 и всё выражение получает это значение, если ложно, то вычисляется выражение 3 и всё выражение получает это значение. Например:

 

x = 10;

y = x>9? 100: 200;

 

В данном примере y получает значение 100. Если бы х было меньше либо равно 9, то у получила бы значение 200.

Операторы указания & и *

Указатель – это адрес переменной в памяти. Указатель на переменную – это переменная, специально созданная для хранения указателя на объект определённого типа. Зная адрес переменной, можно существенно упростить работу некоторых программ. Указатели имеют три главных назначения в С:

 

1. Предоставляют быстрое обращение к элементам массива.

2. Позволяют функциям модифицировать передаваемые параметры.

3. Поддерживают динамические структуры данных.

 

Первый оператор - &. Это унарный оператор, возвращающий адрес операнда в памяти. Например:

 

m = &count;


помещает в m адрес переменной count.

Второй оператор – это *, дополняющая &. Это унарный оператор, возвращающий значение переменной по указанному адресу. Например:

 

q = *m;

 

Переменные, содержащие адреса или указатели, должны объявляться путём помещения * перед именем переменной. Например, для объявления указателя ch на символ, следует написать

 

char *ch;

 

Здесь ch - это не символ, а указатель на символ. Тип данных, на который указывает указатель, называется базовым типом указателя.

Ниже операторы * и & используются для занесения числа 10 в переменную target:

 

#include <stdio.h>

 

int main(void)

{

int target, source;

int *m;

source = 10;

m = &source;

target = *m;

printf(“%d”, target);

return 0

}

Оператор sizeof

 

sizeof – это унарный оператор, возвращающий длину в байтах переменной или типа, помещённого в скобки. Например:

 

float f;

 

printf(“%f ”, sizeof f);

printf(“%d”, sizeof(int));

 

выдаёт 4 4. (Предполагается использование 32-битных целых).

 

Выражения

Выражения в С – это любая допустимая комбинация операторов, констант и переменных.

 

Преобразования типов в выражениях.

Компилятор преобразует все выражения к типу большего операнда.

1. Все переменные типа char short int преобразуются к типу int. Все переменные типа float – к типу double.

2. Если один из пары операндов имеет тип long double, другой операнд также преобразуется к типу long double. Иначе, если один из операндов имеет тип double, другой операнд также преобразуется к double. Иначе, если один из операндов имеет тип long, другой операнд также преобразуется к типу long. Иначе, если один из операторов имеет тип unsigned, другой операнд также преобразуется к типу unsigned.



Поделиться:


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

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