Int i,j,k; //переменные i, j, k – целого типа

Float x,y; //переменные x, y – вещественного типа

Char a; //переменная a – символьного типа

Желательна инициализация переменных при их описании:

int i=1, j=0, k=2;

float x=0.25, y=-1.5;

char a=’W’;

Если при описании переменной использован модификатор const, то это означает, что значение переменной нельзя изменять в программе. Такую переменную называют именованнойконстантой. Она обязательно должна быть инициализирована:

const int i=1; //именованная целая константа i

const float x=0.25; //именованная вещественная константа x

const char a=’W’; //именованная символьная константа a

Класс памяти определяет время жизни и область видимости переменной:

auto – автоматическая переменная. Память под нее выделяется в стеке и при необходимости инициализируется каждый раз при выполнении оператора, содержащего ее описание. Освобождение памяти происходит при выходе из блока, в котором описана переменная. Время ее жизни – от момента описания до конца блока. Для локальных (описанных внутри блока) переменных спецификатор auto применяется по умолчанию, поэтому задавать его явным образом смысла не имеет;

extern – внешняя переменная. Эта переменная определяется в другом месте программы (в другом файле или дальше по тексту программы). Используется для создания переменных, доступных во всех модулях программы, в которых они объявлены. Если переменная в этом же описании инициализируется, то спецификатор extern игнорируется;

static – статическая переменная. Время ее жизни – постоянное. Инициализируется один раз при первом выполнении оператора, содержащего описание переменной. В зависимости от расположения оператора описания статические переменные могут быть глобальными (описаны вне любого блока, область их действия – весь файл, в котором они описаны) и локальными (описаны внутри блока). Глобальные статические переменные видны только в том модуле, в котором они описаны;

register – регистровая переменная. Память для нее выделяется в регистрах процессора. Если такой возможности у компилятора нет, переменные обрабатываются как auto:

int a; //глобальная переменная a

void main() //заголовок головной программы

{ //начало блока головной программы

int b=1; //локальная переменная b

extern float x;//переменная x определена в другом месте

static int c=0;//локальная статическая переменная c

register char d=’W’; //регистровая переменная d

a=1; //присваивание значения глобальной переменной a

int a; //описание локальной переменной a

//с этого момента и до конца блока действует

//только локальная переменная a

a=0; //присваивание значения локальной переменнойa

. . . . . . . . .

return 0;

} //конец блока головной программы

float x=1.5;//определение и инициализация внешней переменнойx

В этом примере:

глобальная переменная a определена вне всех блоков. Память под нее выделяется в сегменте данных в начале работы программы, областью действия и областью видимости является вся программа до оператора описания одноименной локальной переменной a;

локальные переменные b и c определены внутри блока, поэтому область их видимости – весь блок от момента их описания. Память под b выделяется в стеке при входе в блок и освобождается при выходе из него. Переменная с располагается в сегменте данных и существует все время, пока работает программа.

Если при определении начальное значение переменной явным образом не задано, то компилятор присваивает глобальным и статическим переменным нулевые значения соответствующего типа. Автоматические переменные в этом случае не инициализируются.

Описание переменной может выполняться в форме объявления или определения.

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

extern float x;

является объявлением, но не определением.

Переменная может быть объявлена многократно, но определена только в одном месте программы.

МАТЕМАТИЧЕСКИЕ ФУНКЦИИ

Математические функции служат для вычисления некоторых часто встречающихся тригонометрических и элементарных функций. Они помещены в файл <math.h>, вызываемый из системной библиотеки директивой препроцессора:

#include <math.h>

Аргументы математических функций могут иметь типы double, float или int, причем все функции, кроме abs(), round(), ceil(), floor() и irand() возвращают значения типа double, а эти – типа int. Углы в тригонометрических функциях задаются в радианах:

Sin(x) sin x

Cos(x) cos x

Tan(x) tg x

Asin(x) arcsin x

Acos(x) arccos x

Atan(x) arctg x

Atan2(x,y) arctg x/y

Sinh(x) sh x

Cosh(x) ch x

Tanh(x) th x

exp(x) ex

Log(x) ln x

Log10(x) lg x

pow(x,y) xy ошибка, если x = 0 и y <= 0 или

если x < 0 и y не целое

sqrt(x) Int i,j,k; //переменные i, j, k – целого типа - student2.ru

ceil(x) наименьшее целое, большее или равное х:

ceil(5.0) = 5

ceil(5.4) = 6

ceil(5.8) = 6

floor(x) наибольшее целое, меньшее или равное x –
выделение целой части числа:

floor(5.0) = 5

floor(5.4) = 5

floor(5.8) = 5

round(x) округление аргумента:

round(5.0) = 5

round(5.4) = 5

round(5.8) = 6

fabs(x) |x| x – вещественное

abs(x) |x| x – целое

ldexp(x,n) x•2n

fmod(x,y) остаток от деления x на y
в виде вещественного числа:

fmod(7.8, 5) = 2.8

fmod(7.8, 5.0) = 2.8

fmod(7.8, 5.2) = 2.6

fmod(7.8, 5.5) = 2.3

fmod(7.0, 5.0) = 2.0

fmod(7, 5) = 2.0

fmod(7.5, 5.8) = 1.7

МАТЕМАТИЧЕСКИЕ КОНСТАНТЫ

В Си имеется много предопределенных числовых констант, которые используются в инженерных и научных расчетах:

M_PI число π 3,14159265358979323846

M_E число e 2,7182818284590452354

M_LOG2E log2e 1,4426950408889634074

M_LOG10E lg e 0,43429448190325182765

M_LN2 ln e 0,69314718055994530942

M_LN10 ln 10 2,30258509299404568402

M_PI_2 π/2 1,57079632679489661923

M_PI_4 π/4 0,78539816339744830962

M_1_PI 1/π 0,31830988618379067154

M_2_PI 2/π 0,63661977236758134308

M_2_PI 2/ Int i,j,k; //переменные i, j, k – целого типа - student2.ru 0,63661977236758134308

M_SQRT2 Int i,j,k; //переменные i, j, k – целого типа - student2.ru 1,41421356237309504880

M_SQRT1_2 1/ Int i,j,k; //переменные i, j, k – целого типа - student2.ru 0,70710678118654752440

ВЫРАЖЕНИЯ

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

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

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

Выражения целого типа

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

К арифметическим операциям относятся:

+ сложение 3 + 2 = 5

- вычитания 5 – 2 = 3

* умножение 3 * 2 = 6

/ деление нацело 5 / 3 = 1

% остаток от деления 5 % 3 = 2

5 % 2 = 1

5 % 1 = 0

5 % 5 = 0

2 % 3 = 2

++ инкремент x++ = x + 1

++x = x + 1

-- декремент x-- = x – 1

--x = x – 1

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

‘A’ + 3 = ‘D’

‘A’ + 3 = 68

‘a’ – 32 = ‘A’

‘a’ – 32 = 65

‘0’ + 1 = 49

‘0’ + 1 = ‘1’

В языке Си используются три логические операции:

!НЕ отрицание, инверсия,

||ИЛИ логическое сложение, дизъюнкция,

&&И логическое умножение, конъюнкция

и шесть операций сравнения:

==равно,

!= не равно,

> больше,

>= больше или равно,

< меньше,

<= меньше или равно.

Внимание! Операция равно в Си обозначается не одним, как в Паскале, а двумя знаками равенства: ==

Результатами логических операций и операций сравнения могут быть две константы:

1 – истина,

0 – ложь.

Причем считается, что если операнд в выражении не равен нулю (не ложь), то он имеет значение истина:

5&&3 = 1истинаИистина есть истина

5&&0 = 0 истинаИложь есть ложь

5||3 = 1

5||0 = 1

0||0 = 0

!1 = 0 НЕистина есть ложь

!5 = 0

5==5 = 1 5 равно 5 есть истина

5==3 = 0

5!=5 = 0 5 не равно 5 есть ложь

5!=3 = 1

5>3 = 1

5<=3 = 0

Побитовые операции выполняются над двоичными кодами операндов, над каждым разрядом кода отдельно. К ним относятся:

&И 5&3 = 1 101 = 5

&

011 = 3

___

001 = 1

|ИЛИ 5|3 = 7 101 = 5

|

011 = 3

___

111 = 7

^ исключающее ИЛИ 5^3 = 6 101 = 5

^

011 = 3

___

110 = 6

Приоритет выполнения операций:

!НЕ

- изменение знака

++ инкремент

-- декремент

Эти операции имеют наивысший приоритет и выполняются в выражениях справа налево.

За ними следуют операции:

*, /, % операции типа умножения

+, - операции типа сложения

>, >=, <, <= операции сравнения

==, != операции равенства

& побитовое И

^ исключающее ИЛИ

| побитовое ИЛИ

&& логическое И

|| логическое ИЛИ

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

Примеры записи выражений целого типа

Int i,j,k; //переменные i, j, k – целого типа - student2.ru sqrt(a)*b*b

Int i,j,k; //переменные i, j, k – целого типа - student2.ru 5*pow(x,3) 5*x*x*x

Int i,j,k; //переменные i, j, k – целого типа - student2.ru a*b/c + c/(a*b)

Int i,j,k; //переменные i, j, k – целого типа - student2.ru cos(x*x*x)*cos(x*x*x)

Int i,j,k; //переменные i, j, k – целого типа - student2.ru exp(log(1.0+x)/3.0) pow((1.0+x),1.0/3.0)

Внимание! Ошибочная запись pow((1.0+x),1/3)

Примеры вычислений выражений целого типа

(5&3) + (5|3)= 8

(3>5)||(4%2)&&(4/2) = 0

(('a' - 32)=='A') + !(3>5) + (5||3) = 3

(5&&3) + (5||3) +!5 = 2

((5>3)==(5!=3)) + !('A'>'B') + ('A'==65) = 3

(!(2%3)||(2%3)) + (!(2/3)&&(2/3)) + !((3>5)||(5>2)) = 1

8/3%2 + !('C' - 'A' == 3%5) - ceil(pow(0.5,2)) = 0

Наши рекомендации