const怎么理解?
const修饰的变量不能够作为左值!初始化完成后,值不能被修改!
C和C++中const的区别是什么?
const的编译方式不同,C语言中,const就是当作一个变量来编译生成指令的;
C++中,所有出现 const 常量名字的地方,在编译期间都被常量的初始值替换了!
C语言中的 const
#include <stdio.h>
/*
C语言中 cnost 修饰的量,可以不用初始化(不初始化不能进行输出和取地址),不叫常量(可以通过地址修改值),叫做常变量
*/
void main()
{
const int a;
const int b = 20;
//int array[a] = {0}; // 表达式必须含有常量值
int* p = (int*)&b;
*p = 30;
//printf("a = %d, b = %d, *p = %d, *(&b) = %d", a, b, *p, *(&b)); // 使用了未初始化的局部变量 a
printf("b = %d, *p = %d, *(&b) = %d", b, *p, *(&b));
return 0;
}
C++中的const
定义时使用确定的值进行初始化,是常量
#include<iostream>
using namespace std;
/*
C++的const:
const int a = 20; 定义时必须进行初始化,叫常量
*/
int main()
{
//const int a; // 定义时必须进行初始化
const int a = 20;
int array[a] = {};// 使用变量对 const 进行赋值时,这里a在编译期间就会被替换成20了
// C++都会将const修饰的常量进行初始值替换
int array[20] = {};
// 确实修改了 a 的值,只不过之前使用常量a的地方在编译期间就已经被初始值进行替换了
int* p =(int *)&a;
*p = 30;
//printf("a = %d, a = %d, *p = %d, *(&a) = %d", a, a, *p, *(&a)); // 使用了未初始化的局部变量 a
printf("a = %d, *p = %d, *(&a) = %d\n", a, *p, *(&a)); // a = 20, *p = 30, *(&a) = 20
// C++都会将const修饰的常量进行初始值替换,上面的输出就等同于下面这种
printf("a = %d, *p = %d, *(&a) = %d\n", 20, *p, 20); // a = 20, *p = 30, *(&a) = 20
return 0;
}
定义时使用变量进行初始化,是常变量
#include<iostream>
using namespace std;
/*
C++的const:
const int a = b; 退化成 常变量,因为初始值不是立即数,是一个变量
int array[a] = {};// 使用变量对 const 进行赋值时,这里就不能指定数组的大小了,因为并不确定变量的值
printf("a = %d, *p = %d, *(&a) = %d\n", a, *p, *(&a)); // a = 30, *p = 30, *(&a) = 30,打印的值也都是30了
*/
int main()
{
int c = 20;
const int a = c;
//int array[a] = {};// 使用变量对 const 进行赋值时,这里就不能指定数组的大小了,因为并不确定变量c的值,进而并不能确定常变量a的值
// 确实修改了 a 的值,只不过之前使用常量a的地方在编译期间就已经被初始值进行替换了
int* p =(int *)&a;
*p = 30;
printf("a = %d, *p = %d, *(&a) = %d\n", a, *p, *(&a)); // a = 30, *p = 30, *(&a) = 30,打印的值也都是30了
return 0;
}