При рассмотрении данной темы я буду использовать оператор sizeof, который возвращает размер в байтах объекта или типа данных.
#define INTEGER 1 /* целая константа, нет окончания */
#define LONG 1L /* константа типа long */
#define UNLONG 1UL /* константа типа unsigned long */
#define LONGLONG 1LL /* константа типа long long */
#define FLOAT 1.0F /* константа типа float */
#define DOUBLE 1.0 /* константа с плавающей точкой, без окончания, тип double */
#define LONGDBL 1.0L /* константа типа long double */
int main()
{
printf("Размер типа \"INTEGER\", байт - %d\n", sizeof(INTEGER));
printf("Размер типа \"LONG\", байт - %d\n", sizeof(LONG));
printf("Размер типа \"UNSIGNED LONG\", байт - %d\n", sizeof(UNLONG));
printf("Размер типа \"LONG LONG\", байт - %d\n", sizeof(LONGLONG));
printf("Размер типа \"FLOAT\", байт - %d\n", sizeof(FLOAT));
printf("Размер типа \"DOUBLE\", байт - %d\n", sizeof(DOUBLE));
printf("Размер типа \"LONG DOUBLE\", байт - %d\n", sizeof(LONGDBL));
return 0;
}
Размер типа "LONG", байт - 4
Размер типа "UNSIGNED LONG", байт - 4
Размер типа "LONG LONG", байт - 8
Размер типа "FLOAT", байт - 4
Размер типа "DOUBLE", байт - 8
Размер типа "LONG DOUBLE", байт - 12
Целое значение помимо десятичного может иметь восьмеричное или шестнадцатеричное представление.
#define OCTAL 037
#define HEX 0x1F
int main(void)
{
printf("Восьмиричная константа %d\n", OCTAL);
printf("Шестнадцатеричная константа %d\n", HEX);
return 0;
}
Шестнадцатеричная константа 31
Символьная константа есть целое, записанное в виде символа, обрамленного одиночными кавычками. Значением символьной константы является числовой код символа из набора символов на данной машине. Например, символьная константа '0' в кодировке ASCII имеет значение 48, которое никакого отношения к числовому значению 0 не имеет.
#define SYMB '0'
int main(void)
{
printf("Символ: %c\n", SYMB);
printf("Код ASCII: %d\n", SYMB);
return 0;
}
/* Восьмеричный код */
#define VTAB '\013' /* вертикальная табуляция в ASCII */
#define BELL '\007' /* звонок в ASCII */
int main(void)
{
printf("%c", VTAB);
printf("%c\n", BELL);
return 0;
}
/* Шестнадцатеричный код */
#define VTAB '\xb' /* вертикальная табуляция в ASCII */
#define BELL '\x7' /* звонок в ASCII */
int main(void)
{
printf("%c", VTAB);
printf("%c\n", BELL);
return 0;
}
Набор эскейп-последовательностей:
\а сигнал-звонок
\b возврат-на-шаг (забой)
\f перевод-страницы
\n новая-строка
\r возврат-каретки
\t горизонтальная-табуляция
\v вертикальная-табуляция
\\ обратная наклонная черта
\? знак вопроса
\’ одиночная кавычка
\” двойная кавычка
\ooo восьмеричный код
\xhh шестнадцатеричный код
Символьная константа '\0' — это символ с нулевым значением, так называемый символ NULL. Вместо просто 0 часто используют запись '\0', чтобы подчеркнуть символьную природу выражения, хотя и в том и другом случае запись обозначает нуль.
#define NULL_1 '\0'
#define NULL_2 NULL
int main(void)
{
if (NULL_1 == NULL_2){
printf("\'\\0\' == null\n");
printf("%d\n", NULL_1);
printf("%d\n", NULL_2);
}
return 0;
}
test_6.c:9:2: warning: format '%d' expects type 'int', but argument 2 has type 'void *'
0
0
Константные выражения — это выражения, оперирующие только с константами. Такие выражения вычисляются во время компиляции, а не во время выполнения.
#define OFFSET 1
int main(void)
{
int massiv [5 + OFFSET]; /* константное выражение */
int i;
massiv[0] = 0;
massiv[1] = 1;
massiv[2] = 2;
massiv[3] = 3;
massiv[4] = 4;
massiv[5] = 5;
printf("За пределами массива %d\n", massiv[6]);
for (i = 0; i < 6; ++i)
printf("%d ", massiv[i]);
printf("\n");
return 0;
}
$ vim test.c#include <stdio.h>
#define INTEGER 1 /* целая константа, нет окончания */
#define LONG 1L /* константа типа long */
#define UNLONG 1UL /* константа типа unsigned long */
#define LONGLONG 1LL /* константа типа long long */
#define FLOAT 1.0F /* константа типа float */
#define DOUBLE 1.0 /* константа с плавающей точкой, без окончания, тип double */
#define LONGDBL 1.0L /* константа типа long double */
int main()
{
printf("Размер типа \"INTEGER\", байт - %d\n", sizeof(INTEGER));
printf("Размер типа \"LONG\", байт - %d\n", sizeof(LONG));
printf("Размер типа \"UNSIGNED LONG\", байт - %d\n", sizeof(UNLONG));
printf("Размер типа \"LONG LONG\", байт - %d\n", sizeof(LONGLONG));
printf("Размер типа \"FLOAT\", байт - %d\n", sizeof(FLOAT));
printf("Размер типа \"DOUBLE\", байт - %d\n", sizeof(DOUBLE));
printf("Размер типа \"LONG DOUBLE\", байт - %d\n", sizeof(LONGDBL));
return 0;
}
$ cc -g -O0 -Wall -o a.out test.c
$ ./a.outРазмер типа "INTEGER", байт - 4
Размер типа "LONG", байт - 4
Размер типа "UNSIGNED LONG", байт - 4
Размер типа "LONG LONG", байт - 8
Размер типа "FLOAT", байт - 4
Размер типа "DOUBLE", байт - 8
Размер типа "LONG DOUBLE", байт - 12
Целое значение помимо десятичного может иметь восьмеричное или шестнадцатеричное представление.
$ vim test_2.c#include <stdio.h>
#define OCTAL 037
#define HEX 0x1F
int main(void)
{
printf("Восьмиричная константа %d\n", OCTAL);
printf("Шестнадцатеричная константа %d\n", HEX);
return 0;
}
$ cc -g -O0 -Wall -o a.out test_2.c
$ ./a.outВосьмиричная константа 31
Шестнадцатеричная константа 31
Символьная константа есть целое, записанное в виде символа, обрамленного одиночными кавычками. Значением символьной константы является числовой код символа из набора символов на данной машине. Например, символьная константа '0' в кодировке ASCII имеет значение 48, которое никакого отношения к числовому значению 0 не имеет.
$ vim test_3.c#include <stdio.h>
#define SYMB '0'
int main(void)
{
printf("Символ: %c\n", SYMB);
printf("Код ASCII: %d\n", SYMB);
return 0;
}
$ ./a.out
$ cc -g -O0 -Wall -o a.out test_2.c
Символ: 0
Код ASCII: 48
Символьные константы могут участвовать в операциях над числами точно так же, как и любые другие целые, хотя чаще они используются для сравнения с другими символами.
Некоторые символы в символьных и строковых константах записываются с помощью эскейп-последовательностей, например \n (символ новой строки); такие последовательности изображаются двумя символами, но обозначают один. Кроме того, произвольный восьмеричный код можно задать в виде
'\ooo'
где ooo — одна, две или три восьмеричные цифры (0…7) или
'\xhh'
где hh — одна, две или более шестнадцатеричные цифры (0…9, а…f, А…F).
$ vim test_4.c#include <stdio.h>
/* Восьмеричный код */
#define VTAB '\013' /* вертикальная табуляция в ASCII */
#define BELL '\007' /* звонок в ASCII */
int main(void)
{
printf("%c", VTAB);
printf("%c\n", BELL);
return 0;
}
$ vim test_5.c#include <stdio.h>
/* Шестнадцатеричный код */
#define VTAB '\xb' /* вертикальная табуляция в ASCII */
#define BELL '\x7' /* звонок в ASCII */
int main(void)
{
printf("%c", VTAB);
printf("%c\n", BELL);
return 0;
}
Набор эскейп-последовательностей:
\а сигнал-звонок
\b возврат-на-шаг (забой)
\f перевод-страницы
\n новая-строка
\r возврат-каретки
\t горизонтальная-табуляция
\v вертикальная-табуляция
\\ обратная наклонная черта
\? знак вопроса
\’ одиночная кавычка
\” двойная кавычка
\ooo восьмеричный код
\xhh шестнадцатеричный код
Символьная константа '\0' — это символ с нулевым значением, так называемый символ NULL. Вместо просто 0 часто используют запись '\0', чтобы подчеркнуть символьную природу выражения, хотя и в том и другом случае запись обозначает нуль.
$ vim test_6.c#include <stdio.h>
#define NULL_1 '\0'
#define NULL_2 NULL
int main(void)
{
if (NULL_1 == NULL_2){
printf("\'\\0\' == null\n");
printf("%d\n", NULL_1);
printf("%d\n", NULL_2);
}
return 0;
}
$ cc -g -O0 -Wall -o a.out test_6.ctest_6.c: In function 'main':
test_6.c:9:2: warning: format '%d' expects type 'int', but argument 2 has type 'void *'
$ ./a.out'\0' == null
0
0
Константные выражения — это выражения, оперирующие только с константами. Такие выражения вычисляются во время компиляции, а не во время выполнения.
$ vim test_7.c#include <stdio.h>
#define OFFSET 1
int main(void)
{
int massiv [5 + OFFSET]; /* константное выражение */
int i;
massiv[0] = 0;
massiv[1] = 1;
massiv[2] = 2;
massiv[3] = 3;
massiv[4] = 4;
massiv[5] = 5;
printf("За пределами массива %d\n", massiv[6]);
for (i = 0; i < 6; ++i)
printf("%d ", massiv[i]);
printf("\n");
return 0;
}
$ cc -g -O0 -Wall -o a.out test_7.c
$ ./a.out
За пределами массива -1215582220
0 1 2 3 4 5
Строковая константа, или строковый литерал, — это нуль или более символов, заключенных в двойные кавычки, как, например,
"Я строковая константа"
или
"" /* пустая строка */
Кавычки не входят в строку, а служат только ее ограничителями. Так же, как и в символьные константы, в строки можно включать эскейп-последовательности. Строковые константы можно конкатенировать ("склеивать") во время компиляции.
Фактически строковая константа — это массив символов. Во внутреннем представлении строки в конце обязательно присутствует нулевой символ '\0', поэтому памяти для строки требуется на один байт больше, чем число символов, расположенных между двойными кавычками. Это означает, что на длину задаваемой строки нет ограничения, но чтобы определить ее длину, требуется просмотреть всю строку.
В Си имеется еще один вид константы — константа перечисления. Перечисление — это список целых констант.
YES - 1
Значение FEB 2
Имена в различных перечислениях должны отличаться друг от друга. Значения внутри одного перечисления могут совпадать.
В Си имеется еще один вид константы — константа перечисления. Перечисление — это список целых констант.
$ vim test_8.c
#include <stdio.h>
int main(void)
{
/* значения констант неспецифицированы,
* значения констант генерируются автоматически начиная с 0 */
enum boolean {NO, YES};
printf("NO - %d\n", NO);
printf("YES - %d\n", YES);
/* все значения констант специфицированы */
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};
printf("Значение FEB %d\n", FEB);
return 0;
}
$ cc -g -O0 -Wall -o a.out test_8.c
$ ./a.outNO - 0
YES - 1
Значение FEB 2
Комментариев нет:
Отправить комментарий