C语言中字面常量和符号常量的差异和定义是什么?

9

我对符号常量和字面常量的定义和用途感到困惑,想知道有人能否解释它们并突出它们的区别。谢谢!

4个回答

6
一个字面常量是直接输入到程序中的值,无论何时需要都可以使用。例如:
int tempInt = 10;
tempInt 是一个类型为 int 的变量;10 是一个字面常量。您不能给 10 赋值,其值也不能更改。符号常量是由名称表示的常量,就像变量一样。但与变量不同的是,在常量初始化后,其值不能更改。
如果您的程序有一个名为 students 和另一个名为 classes 的整数变量,并且如果您知道每个班级有 15 名学生,则可以计算出您有多少学生:
students = classes * 15;

5

符号是编译器处理的内容。编译器对待const与变量几乎相同。然而,#define则不同,因为预编译器会将其转换为其值,编译器甚至不知道其存在。这就像搜索和替换一样。如果你这样做:

#define A 5

然后

b += A;

预编译器将其转换为

b += 5;

编译器只看到数字5。


1
(借鉴之前的帖子) 字面常量是在程序中直接键入所需值的值。例如
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设置的新值,只需更改单个符号常量的定义... TEN为11,让预编译器为您进行更改。

0

我认为你的意思是,字面常量是原始表达式,例如“string”或2或false,而符号常量是当你给它一个名称时,例如const int MagicNumber = 42。两者都可以用作表达式,但是你可以通过名称引用后者。如果您从多个位置使用相同的常量,则非常有用。


1
在C语言中(问题标记为C),const int对象并不是一个常量。为了在C语言中生成命名常量(符号常量),必须使用#define或枚举。 - AnT stands with Russia
哈哈,抱歉,我以为我在浏览C#的问题 :) - fejesjoco

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接