C/C++ const

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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值