Различие и определение литеральных и символических констант в C?

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

4 ответов


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

#define A 5

а то

b += A;

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

b += 5;

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


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

int tempInt = 10;

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

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

студенты = классы * 15;


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


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

int breakpoint = 10;

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

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

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

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

Breakpoint  +=  10;

компилятор не видит десять, а только его значения 10. Почему это полезно? Что делать, если точка останова изменена на 11. Вместо того чтобы просматривая всю программу и изменяя каждое определение переменной на новое значение, заданное с помощью литеральной константы 10, измените определение константы одного символа... Десяти до 11 и пусть прекомпилятором сделать изменения для вас.