Операции присваивания (ранг 14)
В качестве левого операнда в операциях присваивания может использоваться только модифицируемое именующее выражение (l-значение), т.е. ссылка на некоторую именованную область памяти, значение которой доступно изменениям.
Существует одна простая операция присваивания и ряд составных операций:
= - простое присваивание: присвоить значение выражения-операнда из правой части операнду левой части. Пример: Р = 10.3 – 2 * х;
= -присваивание после умножения: присвоить операнду левой части произведение значений обоих операндов. Р*=2 эквивалентно Р=Р*2;
/= - присваивание после деления: присвоить операнду левой части частное отделения значения левого операнда на значение правого. Р/=2.2 – d эквивалентно P = P / (2.2 –d);
%= - присваивания после деления по модулю: присвоить операнду левой части остаток от целочисленного деления значения левого операнда на значение правого операнда. N %= 3 эквивалентно N = N % 3;
+= - присваивание после суммирования: присвоить операнду левой части сумму значений обоих операндов A += B эквивалентно A = A + B;
-= - присваивание после вычитания: присвоить операнду левой части разность значений левого и правого операндов. X-=4.3-Z эквивалентно X = X – (4.3 – Z);
<<= - присваивание после сдвигов разрядов влево: присваивание целочисленному операнду левой части значение, полученное сдвигом влево его битового представления на количество разрядов, равное значению правого целочисленного операнда. Например, a<< 4 эквивалентно a = a << 4.
>>= - присваивание после сдвигов разрядов вправо: присваивание целочисленному операнду левой части значение, полученное сдвигом вправо его битового представления на количество разрядов, равное значению правого целочисленного операнда. Например, a>> 4 эквивалентно a = a >> 4.
&= - присваивание после поразрядной конъюнкции: присваивание целочисленному операнду левой части значение, значение, полученное поразрядной конъюнкции (И) его битового представления с битовым представлением целочисленного операнда правой части. Например, e &= 44 эквивалентно e = e & 44.
|= - присваивание после поразрядной дизъюнкции: присваивание целочисленному операнду левой части значение, значение, полученное поразрядной дизъюнкцией (ИЛИ) его битового представления с битовым представлением целочисленного операнда правой части. Например, a |= b эквивалентно a = a | b;
^= - присваивание после исключающего поразрядного «ИЛИ»: присваивание целочисленному операнду левой части значение, полученное применением поразрядной операции исключающего ИЛИ к битовым представлениям значений обоих операндов: Z ^ x + y эквивалентно Z = Z ^ (x + y).
Операции выбора компонентов структурированного объекта:
. (точка) - прямой выбор (выделение) компонента структурированного объекта, например: объединения или структуры (ранг 1). Формат применения операции:
имя_структурированного_объекта.имя_компонента
-> - косвенный выбор (выделение) компонента структурированного объекта, адресуемого указателем (ранг 1). При использовании операции требуется, чтобы с объектом был связан указатель. В этом случае формат применения операции имеет вид:
указатель_на_структурированный_объект -> имя_компонента
Запятая в качестве операции (ранг 15)
Несколько выражений, разделенных запятыми «,», вычисляются последовательно слева направо. В качестве результата сохраняются тип и значение самым правым из разделенных запятыми операндов выражений). Значения всех левых операндов игнорируются. Например, если переменная х имеет тип int, то значением выражения(x=3,3*x) будет 9, а переменная х примет значение 3.
Скобки в качестве операций
Круглые и квадратные скобки играют роль бинарных операций (ранг 1) при вызове функций и индексировании элементов массивов. Круглые скобки обязательны в обращении к функции.
Условная трехместная операция (ранг 13). В отличие от унарных и бинарных операций условная тернарная операция используется с тремя операндами. В изображении условной операции применяются два символа «?» и «:» и при выражения-операнда:
выражение_1 ? выражение_2 : выражение_3
Первым вычисляется значение выражение_1. Если оно истинно, т.е. не равно нулю, то вычисляется значение выражения_2, которое становится результатом. Если при вычислении выражения_1 получится 0, то в качестве результата берется значение выражения_3. Пример:
x < 0 ? –x: x;
Выражение возвращает абсолютную величину переменной x.
Операции явного преобразования типа. Операция преобразования (приведения) типа (ранг 2) имеет следующий формат:
(имя_типа) операнд
Такое выражение позволяет преобразовывать значение операнда к заданному типу. В качестве операнда используется унарное выражение, которое в простейшем случае может быть переменной, константой или любым выражением, заключенным в круглые скобки. Например, преобразования (long)8 (внутренне представление результата имеет длину 1 байт) изменяют длину внутреннего представления целых констант, не меняя их значений.
В этих преобразованиях константа не меняла значения и оставалась целочисленной. Однако возможны более глубокие преобразования, например, (long double)6 или (long)4 не только изменяют длину константы, но и структуру ее внутреннего представления. В результатах будут выделены порядок и мантисса, значения будут вещественными.
Преобразования типов арифметических данных нужно применять аккуратно, так как возможно изменение числовых значений.
5.3.1. Разделители
Разделители, или знаки пунктуации, входят в число лексем языка:
[ ] ( ) { } , ; : … * = #
Квадратные скобки.Для ограничения индексов одно- и многомерных массивов, а также при записи индексированных элементов используются квадратные скобки.
Круглые скобки.
1) выделяют выражения-условия (в операторе «если»);
2) входят как обязательные элементы в определение и описание (в прототип) любой функции, где выделяют соответственно список формальных параметров и список спецификаций параметров;
3) обязательны при определении указателя на функцию:
int (*pfund) ( );
4) группируют выражения;
5) входят как обязательные элементы в операторы циклов;
6) необходимы при явном преобразовании типа;
7) настоятельно рекомендуется в макроопределениях, обрабатываемых препроцессором:
#define R(x, y) sqrt ((x) * (x) + (y) + (y))
Это позволяет использовать в качестве параметров макровызовов арифметические выражения любой сложности и не сталкиваться с нарушениями приоритетов операций.
Фигурные скобки.
1) Для обозначения соответственно начала и конца составного оператора или блока используют фигурные скобки.
2) для выделения списка компонентов в определениях структурных и объединяющих типов
3) для инициализации массивов и структур при их определении.
Запятая.
1) использоваться в качестве операции.
2) применяться как разделитель. В последнем случае она разделяет элементы списков.
3) как разделитель используется также в заголовке операторов цикла.
4) также в описаниях и определениях объектов одного типа.
Точка с запятой.Каждый оператор, каждое определение и каждое описание в программе на языке Си завершает точка с запятой.Любое допустимое выражение, за которым следует ‘;’, воспринимается как оператор. Это справедливо и для пустого выражения, т.е. отдельный символ «точка с запятой» считается пустым оператором.
Двоеточие.Для отделения метки от помечаемого ею оператора.
Многоточие.Это три точки ‘…’ без пробелов между ними. Оно используется для обозначения переменного числа параметров у функции при ее определении и описании (при задании ее прототипа). При работе на языке Си программист постоянно использует библиотечные функции со списком параметров переменной длины для форматных ввода и вывода. Их прототипы выглядят следующим образом:
int printf(const char * format…);
int scanf(const char * format…);
Здесь с помощью многоточия указана возможность при обращении к функциям использовать разное количество параметров (не меньше одного, так как параметр format должен быть указан всегда и не может опускаться).
Звездочка.Используется в качестве знака операции умножения и знака операции разыменования (получения доступа через указатель). В описаниях и определениях означает, что описывается (определяется) указатель на значение использованного в объявлении типа:
/* указатель на величину типа int */
int * point;
/* указатель на указатель на объект типа char */
Обозначение присваивания.Как уже упоминалось, для обозначения операции присваивания используется символ «=». Кроме того, в определении объекта он используется при его инициализации:
/* инициализация структуры */
struct (char x, int y) A=( ‘z’, 1918 );
/* инициализация переменной */
int А = 66;
Признак препроцессорных средств.Символ ‘#’ используется для обозначения директив (команд) препроцессора. Если этот символ является первым отличным от пробела символом в строке программы, то строка воспринимается как директива препроцессора.
Без одной из препроцессорных директив обойтись совершенно невозможно – препроцессорная команда
#include <stdio.h>
включает в текст программы средства связи с библиотечными функциями ввода-вывода.
Выражения и приведение арифметических типов
Введя константы, переменные, разделители и знаки операций, охарактеризовав основные типы данных и рассмотрев переменные, можно конструировать выражения. Каждое выражение состоит из одного или нескольких операндов, символов операций и ограничителей, в качестве которых чаще всего выступают круглые скобки. Назначение любого выражения – формирование некоторого значения. В зависимости от типа формируемых значений определяются типы выражения. Если значения выражения являются целые и вещественные числа, то говорят об арифметических выражениях.
В арифметических выражениях допустимы следующие операции:
+ - сложение (или унарная операция +);
- - вычитание (или унарная операция изменения знака);
* - умножение;
/ - деление;
% - деление по модулю (т.е. получение остатка от целочисленного деления первого операнда на второй).
Внешнюю неоднозначность имеет выражения, в которых знак унарной операции ++ (или --) записан непосредственно рядом со знаком бинарной операции +;
х+++b или z---d
В этих случаях трактовка выражений однозначна и полностью определяется рангами операция (бинарные аддитивные + и – имеют ранг 4; унарные ++ и – имеют ранг 2). Таким образом:
x+++и эквивалентно (x++)+ b
z—d эквивалентно (z--)-d
Отношения и логические выражения.Отношение определяется как пара арифметических выражений, соединенных (разделенных) знаком операции отношения.
== (равно)
!= (не равно)
< (меньше)
> (больше)
<= меньше или равно;
>= больше или равно.
Логические операции: ! (отрицание НЕ); && конъюнкция (И); || дизъюнкция (ИЛИ).
Присваивание (выражение и оператор).Если z – имя переменной, то
z = 2.3 + 5.1
есть выражение со значением 7.4. Одновременно это значение присваивается и переменной z. Только в том случае, когда в конце выражения с операцией присваивания помещен символ ‘;’, это выражение становится оператором присваивания. Таким образом,
z = 2.3 + 5.1;
есть оператор простого присваивания переменной z значения, равного 7.4.
Тип и значение выражения с операцией присваивания определяются значением выражения, помещенного справа от знака «=». Однако этот тип может не совпадать с типом переменной из левой части выражения. В этом случае при определении значения переменной выполняется преобразование (приведение) типов.
Так как выражение справа со знака «=» может содержать, в свою очередь, операцию присваивания, то в одном операторе присваивания может присвоить значения нескольким переменным:
c = x = d = 4.0 + 2.4
Здесь значение 6.4 присваивается переменной d, затем 6.4 как значение выражения с операцией присваивания «d = 4.0 + 2.4» присваивается x и, наконец, 6.4 как значение выражения «x = d» присваивается c.
Приведение типов.При делении двух целых операндов результат получается целым. Например, значением выражения 5/2 будет 2, а не 2.5. Для получения вещественного результата нужно выполнить деление не целых, а вещественных операндов, например, 5.0/2.0 получим 2.5.
Если операндами являются безымянные константы, то заменить целую константу на вещественную совсем не трудно. В том случае, когда операндом являются именованная константа, переменная или выражение в скобках, необходимо для решения той же задачи использовать операцию явного приведения (преобразования) типа. Например:
int n=5, k = 2;
double d;
intm;
d = (double) n / (double) k;
m = n /k;
В этом фрагменте значением d станет величина 2.5 типа double, а значением переменной m станет целое значение 2.
Если у бинарной операции операнды имеют разные типы (а должны в соответствии с синтаксисом выражения иметь один тип), то компилятор выполняет преобразования типов автоматически, т.е. приводит оба операнда к одному типу. Например, для тех же переменных значение выражения d-k будет иметь тип double за счет неявного преобразования, выполняемого автоматически.
Правила преобразования типов.При вычислении выражений некоторые операции требуют, чтобы операнды имели соответствующий тип, а если требования к типу не выполнены, принудительно вызывают выполнение нужных преобразований. Та же ситуация возникает при инициализации, когда тип инициирующего выражения приводится к типу определяемого объекта.
Среди преобразований типов выделяют:
§ преобразования в арифметических выражениях;
§ преобразования при присваиваниях;
§ преобразования указателей.
При преобразовании типов нужно различать преобразования, изменяющие внутреннее представление данных, и преобразования, изменяющие только интерпретацию внутреннего представления. Например, когда данные типа unsigned int переводятся в тип int, менять их внутренне представление не требуется- изменяется только интерпретация. При преобразовании значений типа float в значение типа int недостаточно изменить только интерпретацию, необходимо изменить длину участка памяти для внутреннего представления и кодировку. При таком преобразовании из float в int возможен выход за диапазон допустимых значений типа int, и реакция на эту ситуацию существенно зависит от конкретной реализации.
Последовательность выполнения преобразования операндов в арифметических выражениях.
1. Все короткие целы типы преобразуются в типы не меньшей длины в соответствии с таблицей. Затем оба значения, участвующие в операции, принимают одинаковых тип в соответствии со следующими ниже правилами.
2. Если один из операндов имеет тип long double, то второй тоже будет преобразован в long double.
3. Если п.2 не выполняется и один из операндов есть double, другой приводится к типу double.
4. Если п.2-3 не выполняются и один из операндов имеет тип float, то второй приводится к типу float.
5. Если п.2-4 не выполняются (оба операнда целые) и один операнд unsigned long int, то оба операнда преобразуются к типу unsigned long int.
6. Если п.2-5 не выполняются и один операнд есть long, другой преобразуется к типу long.
7. Если п.2-6 не выполняются и один операнд unsigned, то другой преобразуется к типу unsigned.
8. Если п.2-7 не выполнены, то оба операнда принадлежать типу int.
Таблица 4. Правила стандартных арифметических преобразований
Исходный тип | Преобразованный тип | Правила преобразования |
char | int | Расширение нулем или знаком в зависимости от умолчания для char |
unsigned char | int | Старший бит заполняется нулем |
signed char | int | Расширение знаком |
short | int | Сохраняется то же значение |
unsigned short | unsigned int | Сохраняется то же значение |
enum | int | Сохраняется то же значение |
битовое поле | int | Сохраняется то же значение |
Арифметические преобразования типов, гарантирующие сохранение значимости
signed char -> short -> int -> long
float -> double -> long double
unsigned char -> unsigned short -> unsigned int -> unsigned long
При преобразованиях, которые не отнесены схемой к безопасным, возможны существенные информационные потери. Для оценки значимости таких потерь рекомендуется проверить обратимость преобразования типов.
Выражения с поразрядными операциями. Поразрядные операции позволяют конструировать выражения, в которых обработка операндов выполняется на битовом уровне (поразрядно).
~ - поразрядное отрицание (дополнение или инвертирование битов) (ранг 2);
>> - сдвиг вправо последовательности битов (ранг 5);
<< - сдвиг влево последовательности битов (ранг 5);
^ - поразрядное исключающее ИЛИ (ранг 9);
| - поразрядное ИЛИ (ранг 10);
& - поразрядное И (ранг 8).
Условное выражение.
операнд_1?операнд_2:операнд_3
5.3.2. Стандартная библиотека функций языка Си
Таблица 5. Математические функции (файл math.h)
Функция | Прототип и краткое описание действий |
abs | int abs(int i); Возвращает абсолютное значение целого аргумента i. |
acos | double acos(double x); |
asin | double asin(double x); |
atan | double atan(double x); |
atan2 | double atan2(double y, double x); функция арктангенса от значения y/x |
cabs | double cabs(struct complex znum); Вычисляет абсолютное значение комплексного числа znum |
ceil | double ceil(double x); вычисляет ближайшее целое не меньшее, чем аргумент x |
cos | double cos(double x); |
exp | double exp(double x); |
fabs | double fabs(double x); Возвращает абсолютное значение вещественного аргумента x двойной точности. |
floor | double floor(double x); Находит наибольшее целое, не превышающее значение x |
fmod | double fmod(double x, double y); возвращает остаток от деления нацело x на y |
frexp | double frexp(double value, int *exp); разбивает число с плавающей точной value на нормализованную мантису и целую чатсь как степень числа 2. Целочисленная степень записывается в область памяти, на которую указывает exp, а мантиса используется как значение, которое возвращает функция. |
hypot | double hypot(double x, double y); вычисляет гипотенузу z прямоугольного треугольника по значениям катетов x, y |
labs | long labs(long x); возвращает абсолютное значение целого аргумента long x |
ldexp | double ldexp(double v, int e); возвращает значение выражения v*2e |
log | double log(double x); |
log10 | double log10(double x); |
modf | double modf(double value, double *iptr); Разделяет число с плавающей точкой value на целую и дробную части. Целая часть записывается в область памяти, на которую указывает iprt , дробная часть является значением, возвращаемым функцией. |
poly | double poly(double x, int n, double c[ ]); вычисляет значение полинома |
pow | double pow(double x, double y); возвращает значение x в степени y |
pow10 | double pow10(int p); возвращает значение 10 в степени p |
sin | double sin(double x); |
sinh | double sinh(double x); |
sqrt | double sqrt(double x); |
tan | tan(double x); |
tanh | double tanh(double x); |
Контрольные вопросы
1. Что такое лексема?
2. Что такое идентификатор?
3. Типы констант в языке Си.
4. Типы данных в языке Си.
5. Что такое инициализация переменных?
6. Что такое именованные константы?
7. Способы ввода именованных констант.
8. Какие операции предусмотрены в языке Си?
9. Какие символы используются в качестве разделителей в языке Си?
10. Как в языке Си осуществляется приведение типов?
11. Правила преобразования типов в языке Си.
Глава 6. Введение в программирование на языке Си
6.1. Структура и компоненты простой программы
Текст программы и препроцессор.Каждая программа на языке Си есть последовательность препроцессорных директив, описаний и определений глобальных объектов и функций.
Препроцессорные директивы управляют преобразованием текста программы до ее компиляции.
Определения вводят функции и объекты. Объекты необходимы для представления в программе обрабатываемых данных.
Описания уведомляют компилятор о свойствах и именах тех объектов и функций, которые определены в других частях программы (например, ниже по ее тексту или в другом файле).
Программа на языке Си должна быть оформлена в виде одного или нескольких текстовых файлов. Текстовый файл разбит на строки. В конце каждой строки есть признак ее окончания (плюс управляющий символ перехода к началу новой строки).
Определения и описания программы на языке Си могут размещаться в строках текстового файла достаточно произвольно (в свободном формате). Для препроцессорных директив существуют ограничения.
1) препроцессорная директива обычно размещается в одной строке, т.е. признаком ее окончания является признак конца строки текста программы.
2) символ ‘#’, вводящий каждую директиву препроцессора, должен быть первым отличным от пробела символом в строке с препроцессорной директивой.
Исходная программа на языке Си в виде текстового файла, проходит три обязательных типа обработки:
§ препроцессорное преобразование текста;
§ компиляция;
§ компоновка (редактирование связей или сборка).
Только после успешного завершения всех перечисленных этапов формируется исполняемый машинный код программы.
Задача препроцессора – преобразование текста программы до ее компиляции. Правила препроцессорной обработки определяет программист с помощью директив препроцессора. Каждая препроцессорная директива начинается с символа ‘#’.
Препроцессор «сканирует» исходный текст программы в поиске строк, начинающихся с символа ‘#’. Такие строки воспринимаются препроцессором как команды (директивы), которые определяют действие по преобразованию текст. #define указывает правила замены в тексте. Эта директива определяет, какие текстовые файлы нужно включить в этом месте текста программы.
Директива #include <…>предназначена для включения в текст программы текста файла из каталога «заголовочных файлов», поставляемых вместе со стандартными библиотеками компилятора. Каждая библиотечная функция, определенная стандартом языка Си, имеет соответствующее описание (прототип библиотечной функции плюс определения типов, переменных, макроопределений и констант) в одном из заголовочных файлов. Список заголовочных файлов для стандартных библиотек определен стандартом языка.
Важно понимать, что употребление в программе препроцессорной директивы
#include <…>
не подключает к программе соответствующую стандартную исходного текста программы. Директива #include только позволяет вставить в текст программы описания из указанного заголовочного файла. Подключение к программе кодов библиотечных функций осуществляется только на этапе редактирования связей (этап компоновки), т.е. после компиляции, когда уже получен машинный код программы. Доступ к кодам библиотечных функций нужен только на этапе компоновки. Именно потому компилировать программу и устранить синтаксические ошибки в ее тексте можно без стандартной библиотеки, но обязательно с заголовочными файлами.
Рис. 15. Схема подготовки исполняемой программы.
Хотя в заголовочных файлах содержатся описания всех стандартных функций, в код программы включаются только те функции, которые используются в программе. Выбор нужных функций выполняет компоновщик на этапе, называемом «редактирование связей».
Термин «заголовочный файл» в применим к файлам, содержащим описания библиотечных функций стандартных библиотек, не случаен. Он предполагает включение этих файлов именно в начало программы. Описание или определения функций должны быть «выше» по тексту, чем вызовы функций. Именно поэтому заголовочные нужно помещать в начале текста программы, т.е. заведомо раньше обращений к соответствующим библиотечным функциям.
Структура программы.После выполнения препроцессорной обработки в тексте программы не остается ни одной препроцессорной директивы. Теперь программа представляет собой набор описаний и определений. Программа будет набором определений функций.
Среди этих функций всегда должна присутствовать функция с фиксированным именем main.Именно эта функция является главной функцией программы, без которой программа не может быть выполнена. Имя этой главной функции для всех программ одинаково (всегда main) и не может выбираться произвольно. Таким образом, исходный текст программы в простом случае (когда программа состоит только из одной функции) имеет такой вид:
директивы_препроцессора
Void main()
{
определения_объектов;
исполняемые_операторы;
}
Перед именем каждой функции программы следует помещать сведения о типе возвращаемого функцией значения (тип результата). Если функция ничего не возвращает, то указывается тип void. Функция main()является той функцией программы, которая запускается на исполнение по командам операционной системы. Возвращаемое функцией main() значение также передается операционной системе. Если программист не предполагает, что операционная система будет анализировать результат выполнения его программы, то проще всего указать, что возвращаемое значение отсутствует, т.е. имеет тип void. Если сведения о типе результата отсутствуют, то считается по умолчанию, что функция main возвращает целочисленное значение типа int.
Каждая функция (в том числе и main) в языке Си должна иметь набор параметров. Этот набор может быть пустым, тогда в скобках после имени функции помещается служебное слово void либо скобки остаются пустыми. В отличие от обычных функций главная функция main() может использоваться как с параметрами, так и без них. Состав списка параметров функции main() позволяют организовать передачу данных из среды выполнения в исполняемую программу, минуя средства, предоставляемые стандартной библиотекой ввода-вывода.
Определения вводят объекты, необходимые для представления в программе обрабатываемых данных. Примером таких объектов служат именованные константы и переменные разных типов. Описания уведомляют компилятор о свойствах и именах объектов и функций, определенных в других частях программы. Операторы определяют действия программы на каждом шаге ее выполнения.
В языке Си нет оператора, обеспечивающего ввод/вывод данных. Все возможности обмена данными с внешним миром программа на языке Си реализует с помощью библиотечных функций ввода-вывода.
Для подключения к программе описаний средств ввода-вывода из стандартной библиотеки компилятора используется директива #include <stdio.h>.
Функция форматированного вывода.Достаточно часто для вывода информации в программах используется функция prinf(), Она переводит данные из внутреннего кода в символьное представление и выводит полученные изображения символов результатов на экран дисплея. При этом у программиста имеется возможность форматировать данные, т.е. влиять на их представление на экране.
Оператор вызова функции prinf() можно представить так:
printf(форматная_строка, список_аргументов);
Форматная строка ограничена двойными кавычками и может включать произвольный текст, управляющие символы и спецификации преобразования данных. Список аргументов (с предшествующей запятой) может отсутствовать.
#include <stdio.h>
void main()
{
printf (“\n Здравствуй, мир!\n”);
}
Первый символ “\n” обеспечивает вывод этой фразы с начала новой строки. Второй управляющий символ “\n” переведет курсор к началу следующей строки, где и начнется вывод других сообщений (не связанных с программой) на экран дисплея.
Обобщенный формат спецификации преобразования имеет вид: %флажки ширина_поля.точность модификатор спецификатор.
Среди элементов спецификации преобразования обязательными являются только два – символ “%” и спецификатор.
d – для целых десятичных чисел (тип int);
u – для целых десятичных чисел без знака (тип unsigned);
f – для вещественных чисел в форме с фиксированной точкой (типы float и double);
e – для вещественных числе в форме с плавающей точкой (с мантиссой и порядком) – для типов double и float.
Например:
printf(“\n summa=%f”, summa);
на экран с новой строки будет выведено:
summa=2102.3
После выполнения операторов
float c, e;
int k;
c=48.3;
k=-83;
e=16.33;
printf(“\nc=%f\tk=%d\te=%e”, c, k, e);
на экране получится такая строка:
с=48.299999 k=-83 e=1.63300e+01
Здесь обратите внимание на управляющий символ ‘\t’ (табуляция). С его помощью выводимые значения в строке результата отделены друг от друга.
Для вывода числовых значений в спецификации преобразование весьма полезны «ширина_поля» и «точность».
«Ширина_поля» -целое положительное число, определяющее длину (в позициях на экране) представления выводимого значения.
Точность – целое положительное число, определяющее количество цифр в дробной части внешнего представления вещественного числа (с фиксированной точной) или его мантиссы (при использовании формы с плавающей точкой).
Пример с теми же переменными:
printf(“\nc=%5.2\tk=%5d\te=%8.2f\te=%11.4e”, c, k, e);
Результат на экране
c=48.30 k= -63 e= 16.33 e= 1.6330e+01
В качестве модификаторов в спецификации преобразования используются символы:
h - для вывода значений типа short int (id);
l - для вывода значений типа long int или double (lf, le);
L - для вывода значений типа long double (Lf, Le).
При необходимости вывести на экран (на печать) парные кавычки или апострофы их представляют с помощью соответствующих последовательностей: \” или \’ т.е. заменяют парами литер. Обратная косая черта ‘\’ для однократного вывода на экран должна быть дважды включена в форматную строку. При необходимости вывести символ % его в форматную строку включают дважды: %%.