0%

C语言 常量

C语言中的常量

C语言里面,一般有2个常量的使用,一个是说过的define另外一个就是前两次用到的const,下面就分别来说说。

const

constC/C++中的一个关键字(修饰符), const一般用来定义一个常量, 既然叫做常量, 即就意味着这个值后面就不能修改了。

举个简单的计算面积的例子:

1
2
3
4
5
6
7
8
9
10
11
12
/*beginner/constant/constant1.c*/
#include <stdio.h>

int main()
{
const int LENGTH = 5;
const int WIDTH = 4;

printf("The area is %d\n", LENGTH * WIDTH);

return 0;
}

下面在看看define这个常量定义。

#define

define,其实正常的称呼应该叫做宏定义,是一条预编译指令, 编译器在编译阶段会将所有使用到宏的地方简单地进行替换。如下图所示 :

比较

所以const define 都能定义一个常量,都能实现修改值修改一次, 则所有用上该常量的地方都同步改值,一句代码都不用改。

这样就可以得到下面的优点:

  • 使代码更易维护
  • 提高代码的效率

不过除了这些相同点,还是区别的,听我慢慢道来。

下面的有点小超纲,看不懂也没有关系的,🆙。

const定义常量是汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而#define定义的常量在内存中有若干个拷贝

编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率比宏定义要高。既然宏定义能做的事const都能做, 那宏还有什么存在的必要么?

存在即合理, 既然宏定义还没被淘汰, 那必然有它存在的道理.

宏能做到const不能办到的事.

  • 宏能定义函数
  • 宏还能根据传入的参数生成字符串
1
2
3
4
5
6
7
8
9
10
11
12
13
/*beginner/constant/constant3.c*/
#include <stdio.h>

#define STRINGCAT(x,y) #x#y
#define TOSTRING(x) #x

int main()
{
printf("%s\n", STRINGCAT(Hello, WORLD));
printf("%s\n", TOSTRING(1234));

return 0;
}

这个功能相当的赞,可以替换很多string的函数了。

编译运行

直接输入make就可以了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#beginner/constant/Makefile
ALL : constant1 constant2 constant3

constant1: constant1.c
gcc -o constant1 constant1.c

constant2: constant2.c
gcc -o constant2 constant2.c

constant3: constant3.c
gcc -o constant3 constant3.c

.PHONY : clean

clean:
rm -f constant1 constant2 constant3

运行输出如下:

1
2
3
4
5
6
7
8
9
$ ./constant1
The area is 20

$ ./constant2
The area is 20

$ ./constant3
HelloWORLD
1234
处无为之事,行不言之教;作而弗始,生而弗有,为而弗恃,功成不居!

欢迎关注我的其它发布渠道