Цілочисельна константа, наприклад 1234, має тип int. Довга константа пишеться з кінцевою l(англійська «ел») або L, як от 123456789L; цілочисельна константа, занадто велика для того, щоб уміститися в int, також буде розглянута як long. Беззнакові константи пишуться з кінцевою u (англійська «ю») або U, а суфікс ul або UL вказує на тип unsigned long(беззнакове довге ціле).
Константи з рухомою точкою, повинні містити або десяткову крапку, або експоненту, або обидві; їхній тип вважається double, хіба що вказано якийсь інший суфікс. Суфікс f або F позначає константу з рухомою точкою, float; l або L вказують на long double (довге подвійне число з рухомою точкою).
Значення цілого можна вказати як вісімкове або шістнадцяткове, замість десяткового. Передній 0 (нуль), у випадку цілої константи, означає вісімкове число; 0x або 0X попереду означають шістнадцяткове. Так, наприклад, десяткове 31 може бути записано як 037 у вісімковій системі, і0x1f або 0x1F — у шістнадцятковій. За вісімковими та шістнадцятковими константами може також слідувати L, щоб поміняти їхній тип на long, або U, щоб перетворити їх на беззнакові;0XFUL — це константа, що має тип unsigned long (беззнакова довга) із десятковим значенням 15.
Символьна константа — це ціле, записане як символ в одинарних лапках, як от 'x'. Значення символьної константи дорівнює числовому значенню знака в наборі знаків машини. Наприклад, у наборі знаків ASCII, символьна константа '0' має значення 48, що не має жодного стосунку до числового значення 0. Якщо ми напишемо '0', замість числового значення 48, яке залежить від набору знаків, програму, що не залежатиме від певного числового значення, буде водночас легше читати. Символьні константи можуть брати участь у числових операціях так само, як і інші цілі, хоч їх частіше використовують для порівнянь з іншими знаками.
Деякі знаки в символьних і ланцюжкових константах можна представити як екрановані послідовності, наприклад \n (знак нового рядка); ці послідовності виглядають як два знаки, але означають тільки один. На додаток, довільний ряд бітів розміром один байт можна вказати як
'\ooo'
де ooo — це одна до трьох вісімкових цифр (0...7), або як
'\xhh'
де hh — це одна або більше шістнадцяткових цифр (0...9, a...f, A...F). Таким чином, ми можемо написати
#define VTAB '\013' /* вертикальна табуляція в ASCII */
#define BELL '\007' /* символ дзвоника в ASCII */
або в шістнадцятковій формі
#define VTAB '\xb' /* вертикальна табуляція в ASCII */
#define BELL '\x7' /* символ дзвоника в ASCII */
Ось повний набір екранованих послідовностей:
\a
| символ сигналу (дзвоника)
| \\
| зворотня похила
|
\b
| реверс (крок назад)
| \?
| знак питання
|
\f
| зміна сторінки
| \'
| одинарні лапки
|
\n
| новий рядок
| \"
| подвійні лапки
|
\r
| повернення каретки
| \ooo
| вісімкове число
|
\t
| горизонтальна табуляція
| \xhh
| шістнадцяткове число
|
\v
| вертикальна табуляція
| | |
Символьна константа '\0' позначає знак зі значенням нуль, нульовий знак. '\0' часто використовується замість 0, щоб підкреслити символьне походження деяких виразів, але числове значення - це просто 0.
Сталий (константний) вираз — це такий, що включає тільки сталі (константи). Такі вирази оцінюються під час компіляції, а не під час обігу програми і, відповідно, можуть використовуватись у будь-якому місці, де може стояти константа, скажімо
#define MAXLINE 1000
char line[MAXLINE+1];
або
#define LEAP 1 /* високосний рік */
int days[31+28+LEAP+31+30+31+30+31+31+30+31+30+31];
Ланцюжкова константа, або ланцюжковий літерал — це послідовність із нуля або більше знаків, оточених подвійними лапками, як, наприклад
"I am a string"
або
"" /* порожній ланцюжок */
Лапки не являються частиною ланцюжка, а служать лише для його обмеження. Ті самі екрановані послідовності, які використовуються в символьних константах, можна так само застосувати в ланцюжках; \" представляє знак подвійних лапок. Ланцюжкові константи можна зчепити під час компіляції:
"hello, " "world"
тотожно
"hello, world"
Це зручно для поділу довгих ланцюжків на декілька рядків вихідного тексту.
Технічно, ланцюжкова константа — це масив знаків. Внутрішнє представлення ланцюжка включає нульовий знак '\0' вкінці, тож фізичне місце зберігання вимагає на один більше символів, ніж ті, що знаходяться в подвійних лапках. Цей спосіб подання означає, що не існує обмеження довжини ланцюжка, але програми повністю має просканувати ланцюжок, щоб визначити його довжину. Функція стандартної бібліотеки strlen(s) повертає довжину свого аргументу, символьного ланцюжка s, за виключенням кінцевого '\0'. Ось наша версія цієї функції:
/* strlen: повертає довжину s */
int strlen(char s[])
{
int i;
while (s[i] != '\0')
++i;
return i;
}
strlen та інші ланцюжкові функції оголошено у стаvндартному файлі заголовка <string.h>.
Будьте обережні, щоб зуміти відрізнити символьну константу від ланцюжка, що містить один знак: 'x' — це не те саме, що «x». Перше — це ціле число, яке використовується для здобуття числового значення літери x у машинному наборі символів. Друге — масив символів, який містить єдиний знак (літеру x) і '\0'.
Існує ще один вид сталих — константи переліку. Перелік — це список сталих цілих значень, наприклад
enum boolean { NO, YES };
Перша назва типу enum набере значення 0, наступна — 1, і так далі, хіба що було задано явні значення. Якщо не всі значення вказано явно, тоді ті, що не задано, продовжуватимуть прогресію від останнього заданого, як показано в наступних прикладах:
enum escapes { BELL = '\a', BACKSPACE = '\b', TAB = '\t',
NEWLINE = '\n', VTAB = '\v', RETURN = '\r' };
enum months { JAN = 1, FEB, MAR, APR, MAY, JUN,
JUL, AUG, SEP, OCT, NOV, DEC };
/* FEB = 2, MAR = 3, etc. */
Назви в різних переліках мають відрізнятися. Значення не обов'язково повинні відрізнятися в тому самому переліку.
Переліки надають зручний спосіб пов'язування сталих значень із назвами, як альтернатива#define за винятком того, що значення може бути автоматично генеровано для вас. Навіть якщо змінні типу enum оголошено, компілятори не зобов'язані перевіряти, що те, що ви зберегли в такій змінній є чинним значенням для переліку. Не зважаючи на це, змінні переліку забезпечують можливістю перевірки, тож часто це краще ніж #define. На додаток, налагоджувач може вивести значення змінних переліку в їхній символічній формі.