Как задать тип константы в Си?
К примеру, в программе (для экономия места) я использую символьный массив для хранения и операций над значениями. При этом есть одно число: 9 — которое имеет важное значение, и которое, в целях практичности мне нужно записать как константу
#define SIZE 9
При этом, насколько я сумел понять из учебника, эта константа будет иметь тип int . В результате при операциях с этим значением будет все время использоваться приведение типа к int . Это меня не устраивает — я хочу знать, можно ли явно задать тип (символьный) такой константе?
Отслеживать
2,969 3 3 золотых знака 15 15 серебряных знаков 30 30 бронзовых знаков
задан 31 авг 2017 в 17:13
Andrej Levkovitch Andrej Levkovitch
8,027 2 2 золотых знака 19 19 серебряных знаков 45 45 бронзовых знаков
это не константа, это просто define. Нужна константа — пишите const char SIZE = ‘9’; , если Ваш компилятор это поддерживает. Но оно как бы все равно не совсем «символьное».
31 авг 2017 в 17:47
Статический массив из одного элемента? Только учтите, выравнивание никто не отменял, так что смотрите карту памяти после линковки.
31 авг 2017 в 17:54
4 ответа 4
Сортировка: Сброс на вариант по умолчанию
Смотрите как работает define, самый первый этап компиляции это препроцессинг, везде где встречается ваша директива ‘SIZE’, она будет заменена на 9, а только потом будет компиляция, линковка.. Вы можете написать туда что угодно в рамках синтаксиса, это будет работать как если бы в блокноте произвели поиск и замену.
Отслеживать
ответ дан 31 авг 2017 в 18:22
Паша Иванов Паша Иванов
408 2 2 серебряных знака 8 8 бронзовых знаков
А чтобы посмотреть, что получилось после поиска и замены, можно запустить gcc -E
1 сен 2017 в 3:15
Я не понимаю зачем ты это написал — вопрос вообще-то о типе. С тем же успехом мог бы рассказать что такое «выражение» или «компилятор».
1 сен 2017 в 6:10
Тип литерала в #define (и в любом другом месте) задается неявно и определяется тем значением, что вы укажете. 9 имеет тип int , ‘9’ — тоже int , но соответствующий отличному от предыдущей ситуации значению (об этом далее), «9» — char[2] (строковый литерал, в котором один символ это ‘9’ , а второй — терминирующий ноль ‘\0’ ), 9.0 будет иметь тип double , 9.f — float и т.д.
В любом случае для #define вы задаете то значение, которое можно будет использовать в нужном контексте. Хотя здесь и возможны ситуации, когда компилятор молча проглотит, казалось бы, ошибочное значение. Например, при попытке задать массив:
#define N '9' int A[N];
вы получите массив из 57 элементов (соответствует ASCII коду символа ‘9’ ), а не из 9 элементов.
В общем, чтобы понять более точно вашу проблему, хорошо бы увидеть конкретный пример, почему требуется явно указать какой-то специфический тип для дефайна.
Как ввести константу в c
Отличительной особенностью переменных является то, что мы можем многократно в течение работы программы изменять их значение:
int n ; n = 9; n = 5;
Но кроме переменных в языке программирования C++ можно определять константы . Их значение устанавливается один раз и впоследствии мы его не можем изменить. Константа определяется практически так же, как и переменная за тем исключением, что в начале определения константы идет ключевое слово const . Например:
const int n ; // или // const int n = 22;
И также в процессе программы мы сможем обращаться к значению константы:
#include int main() < const int age ; std::cout
Но если же мы захотим после определения константы присвоить ей некоторое значение, то компилятор не сможет скомпилировать программу и выведет ошибку:
const int age ; age = 78;
То есть такой код не будет работать. И так как нельзя изменить значения константы, то ее всегда необходимо инициализировать, если мы хотим, чтобы она имела некоторое значение.
Если константа не будет инициализирована, то компилятор также выведет ошибку и не сможет скомпилировать программу, как в следующем случае:
const int age;
В качестве значения константам можно передавать как обычные литералы, так и динамически вычисляемые значения, например, значения переменных или других констант:
int a ; const int b ; const int d ; const int x ;
Обычно в качестве констант определяются такие значения, которые должны оставаться постоянными в течение работы всей программы и не могут быть изменены. Например, если программы выполняет математические операции с использованием числа PI, то было бы оптимально определить данное значение как константу, так как оно все равно в принципе неизменно:
Константы в С++
В С++ для представления константы рекомендуется использовать объявление переменной с начальным значением и ключевым словом const :
const тип ИмяПеременной = НачальноеЗначение;
const int n=10;
Область видимости константы такая же, как у обычной переменной. С помощью ключевого слова const можно объявить указатель на константу
const тип *ИмяПеременной;
const int *m; // m – указатель на константу типа int
const int n=3;
m = &n;
Еще одна возможность const состоит в создании постоянного указателя на величину указанного типа
тип *const ИмяПеременной = Значение;
int i;
int * const ptri=&i;
Использование const имеет несколько преимуществ по сравнению с #define .
- При объявлении константы с использованием const явно указывается тип величины.
- Константа, объявленная с использванием const , просто согласуется с производными типами, например, объявление массива:
const int base_vals[5] = < 1000, 2000, 3500, 6000, 10000>;
Однако не любое использование #define можно исключить с помощью const . Например, нельзя объявить массив с размером, заданным через const .
const size=3;
int a[size];
Такой код работать не будет.
Перечислимый тип данных
С помощью ключевого слова enum можно объявить особый целочисленный тип с набором именованных целых констант, называемых перечислимыми константами:
enum day
enum flag ;
С помощью такого определения создается целочисленный тип day с названиями 7 дней недели, каждое из которых является целочисленной константой.
Перечислимые константы — идентификаторы, которые по умолчанию имеют следующие значения: 0, 1, 2, 3, 4, 5, 6. Первому присваивается значение 0, и каждому последующему – на 1 больше предыдущего.
Если не устраивают значения по умолчанию, то перечислимые константы могут быть инициализированы произвольными целыми константами или константными выражениями
enum number ; // b=55, d=65
Перечислимая константа может быть объявлена анонимно (без тега):
Курс C с нуля: часть 5 – константы
Предыдущая часть – Курс C с нуля: часть 4 – токены и ключевые слова.
- константы в C фактически являются обычными переменными, с той разницей, что после инициализации их значение неизменно;
- константы так же называют литералами (literals);
- константы могут хранить данные любого типа.
Синтаксис
const data_type variable_name;
const data_type *variable_name;
Типы констант в C
- целочисленные константы;
- действительные константы;
- константы с плавающей точкой;
- восьмеричные и шестнадцатеричные константы;
- символьные константы;
- строковые константы;
- escape-последовательности.
Правила определения констант в C
1. Целочисленные константы в C
- должна содержать как минимум одну цифру;
- не должна содержать десятичного разделителя;
- может быть как положительным так и отрицательным числом;
- недопустимо использование запятых или пробелов;
- если перед числом не указан знак – оно будет считаться положительным;
- допустимый диапазон значений от -32768 до 32767.
2. Действительные константы в C
- должна содержать как минимум одну цифру;
- должна содержать десятичный разделитель;
- может быть как положительным так и отрицательным числом;
- недопустимо использование запятых или пробелов;
- если перед числом не указан знак – оно будет считаться положительным.
3. Символьные и строковые константы в C
- символьная константа хранит одну букву, одну цифру или один спецсимвол, заключенные в одинарные кавычки;
- максимальная длина символьной константы 1 символ;
- строковые константы заключаются в двойные кавычки.
4. Escape-последовательности в C
Как использовать константы в C?
Константа может быть определена так:
- с помощью ключевого слова “ const “;
- с помощью директивы препроцессора “ #define “;
- Помните, что значения констант должны оставаться неизменными в течении работы программы. Попытка изменить значение константы приведет к возникновению ошибки.
1. Пример программы на C с использованием ключевого слова const
#include void main() < const int height = 100; /*int constant*/ const float number = 3.14; /*Real constant*/ const char letter = 'A'; /*char constant*/ const char letter_sequence[10] = "ABC"; /*string constant*/ const char backslash_char = '?'; /*special char cnst*/ printf("value of height :%d n", height ); printf("value of number : %f n", number ); printf("value of letter : %c n", letter ); printf("value of letter_sequence : %s n", letter_sequence); printf("value of backslash_char : %c n", backslash_char); >
Результат ее выполнения:
$ ./const value of height :100 value of number : 3.140000 value of letter : A value of letter_sequence : ABC value of backslash_char : ?
1. Пример программы на C с использованием директивы #define
#include #define height 100 #define number 3.14 #define letter ‘A’ #define letter_sequence «ABC» #define backslash_char ‘?’ void main()
$ ./constdef value of height : 100 value of number : 3.140000 value of letter : A value of letter_sequence : ABC value of backslash_char : ?
18 008 views