Линейные
алгоритмы. Переменные.
Стандарт С89 определяет пять базовых типов
данных:
int –
целочисленный тип, целое число;
float –
вещественное число одинарной точности с плавающей точкой;
double –
вещественное число двойной точности с плавающей точкой;
char –
символьный тип для определения одного символа;
void –
тип без значения.
Ряд компиляторов может поддерживать еще и
логический тип _Bool.
Тип void служит для объявления функции, не
возвращающей значения, или для создания универсального указателя (pointer).
Объект типа char всегда занимает 1 байт памяти. Размеры объектов
других типов, как правило, зависят от среды программирования и операционной
системы.
Приведем модификаторы базовых типов
данных. К ним относятся следующие спецификаторы, предшествующие им в тексте
программы:
signed, unsigned, long, short
Базовый тип int
может быть модифицирован каждым из перечисленных спецификаторов. Тип char модифицируется с помощью unsigned и signed, тип double – с помощью long.
В таблице приведены допустимые комбинации
типов данных языка С с
их минимальным диапазоном значений и типичным размером.
Тип данных |
Типичный размер в битах |
Минимально допустимый диапазон значений |
char |
8 (или 1 байт) |
от –127 до 127 |
unsigned char |
8 |
от 0 до 255 |
signed char |
8 |
от –127 до 127 |
int |
16 или 32 |
от –32767 до 32767 |
unsigned int |
16 или 32 |
от 0 до 65535 |
signed int |
16 или 32 |
от –32767 до 32767 |
short int |
16 |
от –32767 до 32767 |
unsigned short int |
16 |
от 0 до 65535 |
signed short int |
16 |
от –32767 до 32767 |
long int |
32 |
от –2147483647 до 2147483647 |
long long int |
64 |
от –(263–1
) до (263–1) для С99 |
signed long int |
32 |
от –2147483647 до 2147483647 |
unsigned long int |
32 |
от 0 до 4294967295 |
unsigned long long int |
64 |
от 0 до (264–1) для С99 |
float |
32 |
от 1Е–37 до 1Е+37 (с точностью не менее
6 значащих десятичных цифр) |
double |
64 |
от 1Е–37 до 1Е+37 (с точностью не менее
10 значащих десятичных цифр) |
long double |
80 |
от 1Е–37 до 1Е+37 (с точностью не менее
10 значащих десятичных цифр) |
Для базового типа int возможны следующие записи с
модификатором:
signed или signed int
unsigned или unsigned int
long или long int
short или short int
Для данных вещественного типа максимальные
значения абсолютных величин представлены в таблице:
Тип данных |
Типичный размер в битах |
Диапазон абсолютных величин |
float |
32 |
от 3.4Е–38 до 3.4Е+37 |
double |
64 |
от 1.7Е–308 до 1.7Е+308 |
long double |
80 |
от 3.4Е–4932 до 1.1Е+4932 |
В языке С
предусматривается преобразование типов в выражениях и приведение типов. Если в
выражении смешаны различные типы литералов и переменных, то компилятор
преобразует их в один тип. Во-первых, все char и short int значения автоматически преобразуются (с расширением
"типоразмера") в тип int.
Этот процесс называется целочисленным расширением (integral
promotion). Во-вторых, все операнды преобразуются
(также с расширением "типоразмера") в тип самого большого операнда.
Этот процесс называется расширением типа (type promotion), причем он выполняется пооперационно.
Например, если один операнд имеет тип int, а
другой–long int, то тип int
расширяется в тип long int. Или если хотя бы один из операндов имеет тип double, то любой другой операнд приводится к
типу double. Это означает, что такие преобразования,
как тип char в
тип double, вполне допустимы (если предусматривать,
к чему это приведет). После преобразования оба операнда будут иметь один и тот
же тип, а результат операции – тип, совпадающий с типом операндов. Приведем
последовательность преобразования типов в выражениях по старшинству
Спецификаторы формата для функции printf() перечислены в таблице:
Код |
Формат |
%c |
Символ |
%d |
Десятичное целое число со знаком |
%i |
Десятичное целое число со знаком |
%e |
Экспоненциальное представление числа (в
виде мантиссы и порядка, е — на нижнем регистре) |
%E |
Экспоненциальное представление числа (в
виде мантиссы и порядка, Е — на верхнем регистре) |
%f |
Десятичное число с плавающей точкой |
%F |
Десятичное число с плавающей точкой
(только стандарт С99; если применяется к бесконечности или нечисловому
значению, то выдает надписи INF, INFINITY(бесконечность) или NAN — Not A Number на верхнем
регистре. Спецификатор %f выводит их эквиваленты на нижнем регистре) |
%g |
Использует более короткий из форматов %e или %f |
%G |
Использует более короткий из форматов %E
или %F |
%o |
Восьмеричное число без знака |
%s |
Символьная строка |
%x |
Шестнадцатеричное без знака (строчные буквы) |
%X |
Шестнадцатеричное без знака (прописные буквы) |
%p |
Выводит указатель |
%n |
Соответствующий аргумент должен быть
указателем на целое число. (Этот спецификатор указывает, что в целочисленной
переменной, на которую указывает ассоциированный с данным спецификатором
указатель, будет храниться число символов, выведенных к моменту обработки
спецификации %n) |
%% |
Выводит знак процента |
Спецификаторы формата функции scanf() |
|
Код |
Формат |
%c |
Читает один символ |
%d |
Читает десятичное целое число |
%i |
Читает целое число в любом формате (десятичное,
восьмеричное или шестнадцатеричное) |
%u |
Читает десятичное целое число типа short int |
%e |
Читает число с плавающей точкой (и в
экспоненциальной форме) |
%E |
Аналогично коду %e |
%f |
Читает число с плавающей точкой |
%lf |
Читает десятичное число с плавающей
точкой типа double |
%F |
Аналогично коду %f
(для стандарта С99) |
%g |
Читает число с плавающей точкой. |
%G |
Аналогично коду %g |
%o |
Читает восьмеричное число |
%x |
Читает шестнадцатеричное число |
%X |
Аналогично коду %x |
%s |
Читает строку |
%p |
Читает указатель |
%n |
Принимает целое значение, равное
количеству прочитанных до сих пор символов |
%[ ] |
Просматривает набор символов |
%% |
Читает знак процента |
Пример программы:
#include <stdio.h>
int main(){
int
i,k,t;
printf("Введите число\n");
scanf("%d",&i);
k=2;
t=k*i;
printf("полученное число: %d\n",t);
return 0;
}
Примет:
Если вы используете десятичные дроби (например: 6.067):
#include <stdio.h>
float main(){
float i,k,t;
printf("Введите число\n");
scanf("%f",&i);
k=2.4;
t=k*i;
printf("полученное число: %f\n",t);
return 0;
}
Операции
языка СИ (C)
Любое
выражение языка состоит из операндов (переменных, констант и др.), соединенных
знаками операций. Знак операции - это символ или группа символов, которые
сообщают компилятору о необходимости выполнения определенных арифметических,
логических или других действий.
Операции
выполняются в строгой последовательности. Величина, определяющая
преимущественное право на выполнение той или иной операции, называется
приоритетом. В табл. 2 перечислены различные операции языка СИ (C). Их
приоритеты для каждой группы одинаковы (группы выделены цветом). Чем большим
преимуществом пользуется соответствующая группа операций, тем выше она
расположена в таблице. Порядок выполнения операций может регулироваться с
помощью круглых скобок.
Таблица
операции:
Знак
операции |
Назначение
операции |
( ) |
Вызов
функции |
[ ] |
Выделение
элемента массива |
. |
Выделение
элемента записи |
-> |
Выделение
элемента записи |
! |
Логическое
отрицание |
~ |
Поразрядное
отрицание |
- |
Изменение
знака |
++ |
Увеличение
на единицу |
-- |
Уменьшение
на единицу |
& |
Взятие
адреса |
* |
Обращение
по адресу |
(тип) |
Преобразование
типа (т.е. (float) a) |
sizeof( ) |
Определение
размера в байтах |
* |
Умножение |
/ |
Деление |
% |
Определение
остатка от деления |
+ |
Сложение |
- |
Вычитание |
<<
|
Сдвиг
влево |
>>
|
Сдвиг
вправо |
<
|
Меньше,
чем |
<= |
Меньше или
равно |
>
|
Больше,
чем |
>= |
Больше или
равно |
= = |
Равно |
!= |
Не равно |
& |
Поразрядное
логическое "И" |
^ |
Поразрядное
исключающее "ИЛИ" |
| |
Поразрядное
логическое "ИЛИ" |
&&
|
Логическое
"И" |
|| |
Логическое
"ИЛИ" |
?: |
Условная
(тернарная) операция |
= |
Присваивание
|
+=, - =,
*=, /=, %=, <<=, |
Бинарные
операции (например, а *= b |
, |
Операция
запятая |
Оператор в
языке Си (C)
Для
исключения путаницы в понятиях "операция" и "оператор",
отметим, что оператор - это наименьшая исполняемая единица программы. Различают
операторы выражения, действие которых состоит в вычислении заданных выражений
(например: a = sin(b)+c; j++;),
операторы объявления, составные операторы, пустые операторы, операторы метки,
цикла и т.д. Для обозначения конца оператора в языке СИ (C)используется точка с
запятой. Что касается составного оператора (или блока),
представляющего собой набор логически связанных операторов, помещенных между
открывающей ({) и закрывающей (}) фигурными скобками ("операторными
скобками"), то за ним точка с запятой не ставится. Отметим, что
блок отличается от составного оператора наличием определений в теле блока.
Характеристика
основных операций языка Си (C)
Охарактеризуем
основные операции языка СИ (C).
Операция
присваивания
Сначала
рассмотрим одну из них - операцию присваивания (=). Выражение
вида
х = у;
присваивает
переменной х значение переменной у. Операцию
"=" разрешается использовать многократно в одном выражении, например:
x = y = z = 100;
Различают
унарные и бинарные операции. У первых из них один операнд, а у вторых - два.
Начнем их рассмотрение с операций, отнесенных к первой из следующих
традиционных групп:
Арифметические
операции.
Логические
операции и операции отношения.
Операции с
битами.
Арифметические
операции задаются следующими символами: +, -, *, /, % .
Последнюю из них нельзя применять к переменным вещественного типа. Например:
a = b + c;
x = y - z;
r = t * v;
s = k / l;
p = q % w;
Логические
операции
Логические
операции отношения задаются следующими символами (см.
табл. 2): && ("И"), || ("ИЛИ"), ! ("НЕ"),
>, >=, <, <= , = = (равно), != (не равно).
Традиционно эти операции должны давать одно из двух значений: истину или ложь.
В языке СИ (C)принято следующее правило: истина - это любое ненулевое значение;
ложь - это нулевое значение. Выражения, использующие логические операции и
операции отношения, возвращают 0 для ложного значения и 1 для истинного. Ниже
приводится таблица истинности для логических операций.
x |
y |
x&&y |
x||y |
!x |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
1 |
1 |
1 |
0 |
0 |
1 |
0 |
1 |
1 |
1 |
1 |
0 |
Битовые
операции можно применять к переменным, имеющим типы int,
char, а также их вариантам (например, long int). Их нельзя применять к
переменным типов float, double,
void (или более сложных типов). Эти
операции задаются следующими символами: ~ (поразрядное отрицание), <<
(сдвиг влево), >> (сдвиг вправо), & (поразрядное "И"), ^
(поразрядное исключающее "ИЛИ"), | (поразрядное "ИЛИ").
Примеры:
если a=0000 1111 и b=1000 1000, то
~a = 1111
0000,
a << 1 = 0001 1110,
a >> 1 = 0000 0111,
a & b = 0000 1000,
a ^ b = 1000 0111,
a | b = 1000 1111.
В языке
предусмотрены две нетрадиционные операции инкремента (++) и
декремента (--). Они предназначены для увеличения и уменьшения на единицу
значения операнда. Операции ++ и -- можно записывать
как перед операндом, так и после него. В первом случае (++n
или --n) значение операнда (n)
изменяется перед его использованием в соответствующем выражении, а во втором (n++ или n--) - после его
использования. Рассмотрим две следующие строки программы:
a = b + c++;
a1 = b1 + ++c1;
Предположим,
что b = b1 = 2, c = c1 = 4.
Тогда после выполнения операций: a = 6, b = 2, c = 5, a1 = 7, b1 = 2, c1
= 5.
Широкое
распространение находят также выражения с еще одной нетрадиционной тернарной
или условной операцией ?: . В формуле
y = x ? a: b;
y = a, если x не равно нулю (т.е.
истинно), и y = b, если х равно нулю (ложно). Следующее выражение
y = (a>b) ?
a: b;
позволяет
присвоить переменной у значение
большей переменной (а или b), т.е. y = max(a,
b).
Еще одним
отличием языка является то, что выражение вида а = а +
5; можно записать в другой форме: a += 5;. Вместо
знака + можно использовать и символы других бинарных операций