4.const和difine以及用const和define去初始化数组的问题

目录
1.const常量
2.
综上,我们来看看const和的区别
tips
1.const常量
const为常变量,修饰的变量不能被更改 。
const int num = 1;// num = 2;printf("num=%d", num);
如果将num=2 的注释去掉,也就是修改const的值,就会报错 。
const int num = 1;num = 2;printf("num=%d\n", num);
这时我们联想数组的定义,int arr[] = ;
我们知道在数组定义时中括号中不能放变量,但const定义的变量是一个不可更改的变量,我们是否可以在中括号内放入const定义的变量呢?
答案是在C文件中不可以,在Cpp中可以 。
const int n = 10;int arr[n] = {1, 2, 3};for (int i = 0; i <= 9; i++){printf("%d", arr[i]);}return 0;
这段代码写在C文件中
写在Cpp文件中
为什么会出现在这个问题呢?
首先我们要了解什么是常量,什么是只读变量?
所以
在C语言中,const就是用来限定一个变量不允许被改变的修饰符,即只读变量,因为占有存储空间,所以编译器不知道运行时的值,所以就不知道该给数组定义多大的 。
在C++ 中, const修饰的可以看成是编译期的常量
对于基本数据类型:编译器会把它放到符号表中,而不分配存储空间 。
对于ADT( Data Type 抽象数据类型)/ UDT(用户定义类型)的const对象则需要分配存储空间(大对象) 。
以及一些情况下也需要分配存储空间,例如强制声明为的符号常量或取符号常量的地址等操作 。
所以如何在C中像C++那样可以去定义数组呢?我们来看看
2.
用于定义标识符常量,也叫宏定义,程序在预处理阶段将用定义的内容进行替换
例如 N 100,则会将100去替换所有的N,换言之,不同于const常量,其实本质上对文本内容的替换 。
所以在C语言中可以用去初始化一个数组
#define MAX 10int main(int argc, char const *argv[]){int arr[MAX] = {0};printf("%d", MAX);return 0;}
这样不会报错 。
综上,我们来看看const和的区别
1.是宏定义,程序在预处理阶段将用定义的内容进行替换。因此在程序运行时,常量表中并没有用定义的常量,系统不为它分配内存 。而const定义的常量,在程序运行时,存在常量表中,且系统为它分配内存 。
2.定义的常量,预处理时只是直接进行了替换,因此在编译时不能进行数据类型检验 。
而const定义的常量,在编译时进行严格的类型检验,可以避免出错 。
tips:
【4.const和difine以及用const和define去初始化数组的问题】我们在选择还是const的去初始化数组的时候,如果写的是C语言,就要使用,而在c++中更加建议使用const,因为 在预处理阶段缺乏类型检测机制,所以不能正确地指定类型,就会导致一些错误 。而且 预处理宏是全局的 。所以在 C++ 这样如此强调命名空间、类这样的东西的语言中,全局的东西最好是越少越好 。