Константы с плавающей точкой

Синтаксис: [цифры][.цифры][E|e-[+]цифры]

"Константа с плавающей точкой" это десятичное число, которое соответствует действительному числу со знаком. Значение действительного числа со знаком состоит из целой части, дробной части и показателя степени. "Цифр" может не быть или их может быть несколько (от 0 до 9), а E (или e) это символ экспоненты. Можно опустить либо цифры до десятичной точки (целая часть числа) либо после десятичной точки (дробная часть числа), но не одновременно. Если используется показатель степени, то только в этом случае можно не вводить десятичную точку. Показатель степени состоит из символа экспоненты (E или e) за которым следует постоянное целое значение. Целое значение может быть отрицательным. Нельзя использовать разделительные символы между цифрами или символами константы.

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

Все константы с плавающей точкой имеют тип double.

Примеры

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

15.75 1.575E1 1575e-2 -0.0025 -2.5e-3 25E-4

Можно опустить целую часть константы с плавающей точкой, как это показано в следующих примерах:

-.125 -.175E-2

Символьные константы

Синтаксис: 'символ'

"Символьная константа" формируется заключением отдельного символа из представительной таблицы символов в одиночные цитатные скобки (' '). Управляющая последовательность рассматривается как отдельный символ и т.о. может быть символьной константой. Заметим, что символы управления должны быть представлены управляющими последовательностями, иначе будет сгенерировано диагностическое сообщение. Значением символьной константы является числовое значение символа.

"Символ" в синтаксисе может быть любым символом из представительной таблицы символов (включая любую управляющую последовательность), кроме одиночной цитатной скобки ('), символа обратного деления (\) или символа новой строки (\n). Для использования в качестве символьной константы одиночной цитатной скобки или символа обратного деления нужно поставить перед ними символ обратного деления, как это показано в Таблице 2.8.

Таблица 2.8. Примеры символьных констант Константа Значение ' ' одиночный пробел 'a' строчная a '?' знак вопроса '\b' забой '\x1B' управляющий символ ASCII '\'' одиночная цитатная скобка '\\' обратное деление

Символьные константы имеют тип int и расширены за счет знака при преобразованиях типов. (Дополнительную информацию можно найти в разделе "Преобразования типов".)

Строковые литералы

Синтаксис: "символы"["символы"]...

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

"This is f string literal."

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

Для форсированного перехода на новую строку в строковом литерале нужно в месте предполагаемого разрыва строки вставить управляющую последовательность перехода на новую строку (\n), следующим образом:

"Enter a number between 1 and 100\nOr press Return"

Традиционный способ формирования строк литералов, которые не умещаются на одной строке, состоит в том, что вводится знак обратного деления и нажимается клавиша RETURN. Знак обратного деление заставляет компилятор игнорировать следующий за ним символ новой строки. Например, строковый литерал

"Long strings can be bro\ ken into two or more pieces."

идентичен строке

"Long strings can be broken into two or more pieces."

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

printf ("This is the first half of the string," " this is the second half") ;

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

This is the first half of the string, this is the second half

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

char *string = ("This is the first half of the string," " this is the second half") ; printf("%s" , string);

Для использования в строковом литерале двойной цитатной скобки или обратного деления нужно перед ним поставить знак обратного деления, как это показано в следующем примере:

"First\\Second" "\"Yes", I do,\" she said."

Обратите внимание на то, что управляющая последовательность (например, \\ или \") в строковом литерале рассматривается как один символ.

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

Строковые литералы имеют тип массива char (char[]). Это значит, что строка это массив элементов типа char. Число элементов массива равно числу символов в строке плюс один для заканчивающего пустого символа.

Идентификаторы

Синтаксис: буква|_[буква|цифра|_]...

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

Идентификатор создается его заданием в объявлении переменной, типа или функции. После этого его можно использовать в операторах программы для ссылки на связанный с ним элемент. Хотя метки и являются специальным видом идентификаторов и имеют собственный класс, их создание аналогично созданию идентификаторов для переменных и функций. (Определения описаны в главе "Определения", а метки описаны в главе "Операторы".)

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

Идентификаторы не могут иметь произношение и написание, совпадающее с ключевыми словами языка. Ключевые слова описаны в разделе "Ключевые слова".

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

Примечание

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

Примеры

Приведем ряд примеров для идентификаторов:

j cnt temp1 top_of_page skip12

Прописные и строчные буквы считаются разными символами, поэтому все эти идентификаторы разные:

add ADD Add aDD

Ключевые слова

"Ключевые слова" это заранее определенные идентификаторы, которые имеют для компилятора С специальное значение. Их можно использовать только так, как они определены. Имя элемента программы не может совпадать по произношению и написанию с ключевым словом.

В языке С имеются следующие ключевые слова:

auto double int struct break else long switch case enum register typedef char extern return union const float short unsigned continue for signed void default goto sizeof volatile do if static while

Переопределить ключевые слова нельзя. Однако, можно задать текст, который будет заменен ключевыми словами перед компиляцией, используя директивы предпроцессора (см. главу "Функции").

Ключевое слово volatile реализовано синтаксически, но в настоящий момент не имеет какой-либо привязанной к ней семантики. Нельзя использовать volatile в качестве имени переменной в программе.

Комментарии

Синтаксис: /* символы */

"Комментарий" это последовательность символов, которая рассматривается компилятором как разделительный символ, но игнорируется им. "Символы" в комментарии могут включать в себя любые комбинации символов представительной таблицы, включая символ новой строки, кроме ограничителя "конец комментария" (*/). Комментарии могут занимать более одной строки, но не могут быть вложенными.

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

Для подавления компиляции большой части программы или сегмента программы содержащей комментарии, следует заключить нужную часть программы в скобки директив предпроцессора #if и #endif, а не выделять эту часть программы комментариями (см. "Условная компиляция").

Примеры

Приведем ряд примеров, иллюстрирующих комментарии:

/* Comments can separate and document lines of programm. */ /* Comments can contain keywords such as for and while. */ /***************************************** Comments can occupy several lines. *****************************************/

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

/* You cannot /* nest */ comments */

Ошибка происходит из-за того, что компилятор распознает первое появление */ после слова nest как конец комментария. Он пытается обработать остальной текст и не может этого сделать, поэтому выдает сообщение об ошибке.

Лексемы

В исходном тексте программы на языке С компилятор распознает основные элементы из групп символов, называемые "лексемами". Лексема это текст исходной программы, который компилятор не анализирует на входящие в него компоненты.

Например, в следующем фрагменте программы слово elsewhere использовано в качестве имени функции. Хотя else и является ключевым словом в С, конфликта между лексемой имени функции и лексемой ключевого слова С не не происходит.

main() { int i = 0; if (i) elsewhere(); }

Однако, если ввести elsewhere как else where, с пробелом между словами else и where, то в предыдущем примере компилятор выдаст диагностическое сообщение, суть которого состоит в отсутствии точки с запятой после ключевого слова else.

Примерами лексем служат могут служить описанные в данной главе операторы, константы, идентификаторы и ключевые слова. Также являются лексемами такие символы пунктуации, как прямоугольные ([]), фигурные ({}) и угловые скобки (<>), двоеточие и запятая.

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

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

Пример

Рассмотрим следующее выражение:

i+++j

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