本文学习自 狄泰软件学院 唐佐林老师的 C++课程
C语言中只有枚举可以定义真正意义上的常量。const变量只是表示他不能在编译期间出现再赋值符号的左边
实验1:C语言中的const只读变量
main.c
#include <stdio.h>
int main()
{
/*
定义了一个局部变量,并且被const修饰,具有只读属性,注意
它只是一个只读变量,并不是一个真正意义上的常量。他本质还是一个变量,在栈上分配内存空间。
*/
const int c = 0;
int* p = (int*)&c;//通过用指针指向只读变量的内存空间 改变只读变量
printf("Begin...\n");
*p = 5;
printf("c = %d\n", c);
printf("End...\n");
return 0;
}
为其分配空间但不使用,是为了兼容C语言编译器
实验2 C++中的const只读变量
main.cpp
int main()
{
/*
定义一个const常量,存储于符号表
*/
const int c = 0;
/* 为 被&修饰的const常量 分配一个空间,但是不会主动使用他,只是为了兼容C语言 */
int* p = (int*)&c;
printf("Begin...\n");
/* 此处的修改 只是改变了上面分配的空间,并不会改变符号表中的C值 */
*p = 5;
printf("c = %d\n", c);
printf("End...\n");
return 0;
}
实验3:const 与宏的区别
main.c
#include <stdio.h>
void f()
{
#define a 3
const int b = 4;
}
void g()
{
/*
这里 g() 中调用 f()中定义的宏,居然没有报错 编译通过!!! 原因在于 宏是预处理器所处理的,直接进
行文本替换,编译器根本不知道宏的存在,也就是说编译器在这里看到的是 printf("a = %d\n", 3);
*/
printf("a = %d\n", a);
//printf("b = %d\n", b);
}
int main()
{
const int A = 1;
const int B = 2;
/*
这里报错:C语言中 A 和 B 是只读变量,属于变量,此处定义的数组大小为A+B。A+B也是变量。变
量是什么只有在运行的时候才知道,所以编译器看不懂 这个数组的大小是多少 直接报错!
*/
int array[A + B] = {0};
int i = 0;
for(i=0; i<(A + B); i++)
{
printf("array[%d] = %d\n", i, array[i]);
}
f();
g();
return 0;
}
main.cpp
#include <stdio.h>
void f()
{
#define a 3
const int b = 4;
}
void g()
{
/*
这里报错:C语言中 A 和 B 是只读变量,属于变量,此处定义的数组大小为A+B。A+B也是变量。变
量是什么只有在运行的时候才知道,所以编译器看不懂 这个数组的大小是多少 直接报错!
*/
printf("a = %d\n", a);
/*
如果加上这行代码,在c++中是编译不过的,原因在于,此处C++编译期会对const常量进行类型检查
和作用域检查,此时编译器发现 b的作用域在 f()内部才有效。报错 b不在当前作用域。
*/
printf("b = %d\n", b);
}
int main()
{
const int A = 1;
const int B = 2;
/*
这里没有报错:因为C++中这里A B 都是常量,编译器可以确认该数组的大小。
*/
int array[A + B] = {0};
int i = 0;
for(i=0; i<(A + B); i++)
{
printf("array[%d] = %d\n", i, array[i]);
}
f();
g();
return 0;
}