Разница и определение буквенных и символических констант в C? - PullRequest
7 голосов
/ 03 января 2011

Мне трудно разобраться с определением и использованием символических и буквальных констант, и мне было интересно, если бы вы могли их объяснить и выделить их различия. Спасибо!

Ответы [ 4 ]

4 голосов
/ 03 января 2011

Символ - это то, с чем имеет дело компилятор.Компилятор обрабатывает const почти так же, как и переменную.С другой стороны, #define - это то, о чем даже не знает компилятор, потому что прекомпилятор преобразует его в значение.Это как поиск и замена.Если вы выполните

#define A 5

, а затем

b += A;

Прекомпилятор преобразует его в

b += 5;

, и все, что видит компилятор, это число 5.

4 голосов
/ 03 января 2011

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

int tempInt = 10;

tempInt - переменная типа int;10 буквальная константа.Вы не можете присвоить значение 10, и его значение не может быть изменено.Символическая константа - это константа, представленная именем, так же, как и переменная.Однако, в отличие от переменной, после инициализации константы ее значение не может быть изменено.

Если в вашей программе есть одна целочисленная переменная с именем студентов и другая с именем классов, вы можете вычислить, сколько у вас студентов, учитываяизвестное количество классов, если вы знали, что в классе 15 учеников:

учеников = классы * 15;

1 голос
/ 27 июня 2014

(Заимствование из более ранних публикаций). Литеральная константа - это значение, введенное непосредственно в вашу программу, где бы оно ни было необходимо.Например

int breakpoint = 10;

Переменная точка останова является целым числом (int);10 буквальная константа.Вы не можете присвоить значение 10, и его значение не может быть изменено.В отличие от переменной, константа не может быть изменена после того, как ей присвоено значение (инициализировано).

Символ - это то, с чем имеет дело компилятор.В этом примере TEN является символической константой, созданной с помощью функции #define.#Define - это то, о чем даже не знает компилятор, потому что прекомпилятор преобразует его в назначенное (определенное) значение.Прекомпилятор ищет и заменяет каждую символьную константу в вашей программе значением.

#define TEN 10      /* These two lines of code become one... */
breakpoint  +=  TEN;    /* after running through the precompiler  */

Прекомпилятор переводит его в

Breakpoint  +=  10;

Компилятор никогда не видит TEN, а только присваивает ему значение 10. Почему это полезно?Что делать, если точка останова изменяется на 11. Вместо просмотра всей программы и изменения каждого определения переменной на новое значение, которое было установлено с использованием литеральной константы 10, измените определение константы одного символа ... ДЕСЯТЬ на 11 ипусть прекомпилятор сделает изменения за вас.

0 голосов
/ 03 января 2011

Я думаю, что вы имеете в виду, что литеральная константа - это примитивное выражение типа «string» или «2» или «false», а символическое - это когда вы даете ему имя, например, const int MagicNumber = 42. Оба могут использоваться каквыражения, но вы можете обратиться к последнему с именем.Полезно, если вы используете одну и ту же константу из многих мест.

...