C语言与C++中const的用法对比

目录
  • 一、C语言中的const
  • 二、C++中的const
  • 三、进一步比较C和C++中的const
  • 四、const与宏的区别
  • 五、小结

一、C语言中的const

  • const修饰的变量是只读的,本质还是变量
  • const 修饰的局部变量在栈上分配空间
  • const修饰的全局变量在只读存储区分配空间
  • const只在编译期有用,在运行期无用
  • C语言中的const使得变量具有只读属性
  • const将具有全局生命周期的变量存储于只读存储区

const修饰的变量不是真的常量,它只是告诉编译器该变量不能出现在赋值符号的左边。

const 不能定义真正意义上的常量

C语言中真正意义上的常量只能通过枚举(#define也只是文本替换而已,不能定义常量)

#include <stdio.h>
int main()
{
    const int c = 0;
    int* p = (int*)&c;
    printf("Begin...\n");
    *p = 5;
    printf("c = %d\n", c);
    printf("End...\n");
    return 0;
}

下图为该程序分别在C语言和C++编译环境在的运行结果:

接下来尝试一下打印在C和C++环境下*p的值,增加一行代码,整体代码如下:

#include <stdio.h>
int main()
{
    const int c = 0;
    int* p = (int*)&c;
    printf("Begin...\n");
    *p = 5;
    printf("c = %d\n", c);
    printf("*p = %d\n", *p);
    printf("End...\n");
    return 0;
}

运行结果如下:

为什么C语言和C++的编译环境下输出结果不同呢?第二节,来讲一讲C++中的const。

二、C++中的const

C++在C的基础上对const进行了进化处理

  • 当碰见const声明时在符号表中放入常量
  • 编译过程中若发现使用常量则直接以符号表中的值替换
  • 编译过程中若发现下述情况则给对应的常量分配存储空间

对const常量使用了extern

对const常量使用&操作符

注意:C++编译器虽然可能为const常量分配空间,但不会使用其存储空间中的值。

关于符号表的介绍,如下图所示:

三、进一步比较C和C++中的const

C语言中的const变量

  • C语言中const变量是只读变量,会分配存储空间

C++中的const常量

可能分配存储空间

  • 当const常量为全局,并且需要在其它文件中使用
  • 当使用&操作符对const常量取地址

C++中的const常量类似于宏定义

  • const int c = 5; ≈#define c 5

C++中的const常量与宏定义不同之处

  • const常量是由编译器处理
  • 编译器对const常量进行类型检查和作用域检查
  • 宏定义由预处理器处理,单纯的文本替换

四、const与宏的区别

#include <stdio.h>
void f()
{
    #define a 3
    const int b = 4;
}
void g()
{
    printf("a = %d\n", a);
    //printf("b = %d\n", b);
}
int main()
{
    const int A = 1;
    const int B = 2;
    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;
}

下面为该程序分别在C和C++编译环境下的运行结果:

可以看到,该程序在C语言的编译环境下报错,这是因为在C语言中,const修饰的两个变量是只读变量,array[A + B]中的A+B只有在运行时才知道,所以会报错。而在C++的编译环境下,A和B是真正意义上的常量,所以编译器会到内部的符号表中取值,到array[A + B]时,编译器知道了A=1,B=2,当然不会报错了。

void f()
{
    #define a 3
    const int b = 4;
}
void g()
{
    printf("a = %d\n", a);
    //printf("b = %d\n", b);
}

在上面的程序中,C++的编译环境下没有报错,这是因为宏是被预处理器处理的,直接进行文本替换,编译器不知道宏的存在。

如果我们用下面的程序:

void f()
{
    #define a 3
    const int b = 4;
}
void g()
{
    printf("a = %d\n", a);
    printf("b = %d\n", b);
}

在C++的编译环境下,就会报如下的错误。这是因为编译器会对const常量进行一个类型检查和作用域检查,所以b只在f()内部有效,在f()外部无效。

宏和常量的不同:

  • 宏被预处理器处理,没有类型和作用域的概念
  • 常量被编译器处理,有类型和作用域的概念

五、小结

  • 与C语言不同,C++中的const不是只读变量
  • C++中的const是一个真正意义上的常量
  • C++编译器可能会为const常量分配空间
  • C++完全兼容C语言中const常量的语法特性

到此这篇关于C语言与C++中const的用法对比的文章就介绍到这了,更多相关C语言 const内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • c语言和c++语言中const修饰的变量区别浅析

    目录 c: 修饰全局变量: 修饰局部变量: c++: 修饰全局变量: 修饰局部变量: 总结: 在c语言中: 在c++语言中: 总结 c: 修饰全局变量: 用const修饰的全局变量是没有办法直接修改的,间接的修改也是不成功的(语法可以通过,但是编译运行的时候会报错.)(const只要是修饰全局变量,那么就会储存到常量区中,收到常量区的保护.) 修饰局部变量: 但是如果用const修饰局部变量,同样的也是没有办法直接修改的,但是是可以间接修改的. int main() { const int b

  • C语言中const和C++中的const 区别详解

    C语言中const和C++中的const 区别详解 C++的const和C语言的#define都可以用来定义常量,二者是有区别的,const是有数据类型的常量,而宏常量没有,编译器可以对前者进行静态类型安全检查,对后者仅是字符替换,没有类型安全检查. 而C语言中的const与C++也有很大的不同,在C语言中用const修饰的变量仍是一个变量,表示这个变量是只读的,不可显示地更改,而在C++中用const修饰过后,就变成常量了.例如下面的代码: const int n=10; int a[n];

  • 从C语言过渡到C++之const

    1. 定义常量 1.1 C语言中定义常量的方法 在C语言从零开始这个系列中,我们讲了C语言定义常量的方法.没有看过的同学请参考:C语言从零开始(五)-常量&变量 为什么要定义常量我就不再赘述了,这里重点说说这么定义有什么不好.经常有这样的面试题:请写出下面这段代码的执行结果: #include <stdio.h> #define SUM 5 + 1; void main() { int a = 2 * SUM; printf("%d", a); } 经常有人答12,

  • 详解C++中的const关键字及与C语言中const的区别

    const对象默认为文件的局部变量,与其他变量不同,除非特别说明,在全局作用域的const变量时定义该对象的文件局部变量.此变量只存在于那个文件中中,不能别其他文件访问.要是const变量能在其他文件中访问,必须显示的指定extern(c中也是)   当你只在定义该const常量的文件中使用该常量时,c++不给你的const常量分配空间--这也是c++的一种优化措施,没有必要浪费内存空间来存储一个常量,此时const int c = 0:相当于#define c 0:    当在当前文件之外使用

  • C语言与C++中const的用法对比

    目录 一.C语言中的const 二.C++中的const 三.进一步比较C和C++中的const 四.const与宏的区别 五.小结 一.C语言中的const const修饰的变量是只读的,本质还是变量 const 修饰的局部变量在栈上分配空间 const修饰的全局变量在只读存储区分配空间 const只在编译期有用,在运行期无用 C语言中的const使得变量具有只读属性 const将具有全局生命周期的变量存储于只读存储区 const修饰的变量不是真的常量,它只是告诉编译器该变量不能出现在赋值符号

  • C语言、C++中的union用法总结

    开始的话 已经好长时间没有更新了,对不起自己,更对不起我亲爱的读者,同时也对不起自己开办的这个博客平台.忙,太忙了,忙于找工作,找一份好工作,纠结于去大城市闯呢,还是回到本省的首府城市.大家都在纠结这个问题,也希望大家和我讨论讨论.别的先不说了,都工作这么长时间了,还回过头来总结union,确实有点过分,要是和大家说我一直从事于C++开发,还不懂union,大家可能还真的不信.我们每天都在总结那些看似高端的东西,什么设计模式(当然我也有总结了).重构(后期我也会说的了)了,却忽略了那些最基础,最

  • C++知识点之成员函数中const的用法

    目录 修饰入参 值传递 址传递 const修饰入参 修饰返回值 修饰函数 const 在C++中是一个很重要的关键字,其不光可以用来修饰变量,还可以放在函数定义中,这里整理了其在函数中的三个用法. 修饰入参 首先我们要明白在C++中调用函数时存在两种方法,即传递值和传递引用. 值传递 值传递时,调用函数时会创建入参的拷贝,函数中的操作不会对原值进行修改,因此这种方式中不需要使用 const 来修饰入参,因为其只是对拷贝的临时对象进行操作. 址传递 传递地址时函数中的操作实际上是直接对原来的值进行

  • C++中const的用法详细总结

    1. const修饰普通变量和指针 const修饰变量,一般有两种写法: const TYPE value;TYPE const value; 这两种写法在本质上是一样的.它的含义是:const修饰的类型为TYPE的变量value是不可变的. 对于一个非指针的类型TYPE,无论怎么写,都是一个含义,即value只不可变. 例如: const int nValue: //nValue是constint const nValue: // nValue是const 但是对于指针类型的TYPE,不同的写

  • C#中const用法详解

    本文实例讲述了C#中const用法.分享给大家供大家参考.具体用法分析如下: const是一个c语言的关键字,它限定一个变量不允许被改变.使用const在一定程度上可以提高程序的安全性和可靠性,另外,在观看别人代码的时候,清晰理解const所起的作用,对理解对方的程序也有一些帮助.另外const在其他编程语言中也有出现,如c++.php5.c#.net.hc08 c const 一般修饰 的变量为只读变量 const定义应该为在定义的时候初始化 以后不能改变他的值 例: 复制代码 代码如下: c

  • C/C++ 中const关键字的用法小结

    C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性. Const作用 NO. 作用 说明 参考 1 可以定义const常量 const int Max = 100; 2 便于进行类型检查 const常量有数据类型,而宏常量没有数据类型.编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换时可能会产生意料不到的错误 void f(const int i) { ---} //对传入的参数进行类型检查,不匹配进行提示 3 可以保护被修

  • C语言库函数中qsort()的用法

    目录 (一)void*  的指针类型是什么? (二)void qsort(void*, size_t, size_t, int ( * )(const void * ,  const void *  ))  该怎么使用该库函数? (三)使用qsort()来排序不同类型的数据  总结: qsort是库函数提供的一种排序方法,我们就简单1了解一下怎么去用,而不去深究它的库函数是怎么写的 qsort是库函数中提供的一种能排序任何类型的数据的一种排序方法,思想是quick sort(快速排序),今天我听

  • 详解C/C++中const关键字的用法及其与宏常量的比较

    1.const关键字的性质 简单来说:const关键字修饰的变量具有常属性. 即它所修饰的变量不能被修改. 2.修饰局部变量 const int a = 10; int const b = 20; 这两种写法是等价的,都是表示变量的值不能被改变,需要注意的是,用const修饰变量时,一定要给变量初始化,否则之后就不能再进行赋值了,而且编译器也不允许不赋初值的写法: 在C++中不赋初值的表达一写出来,编译器即报错,且编译不通过. 在C中不赋初值的表达写出来时不报错,编译时只有警告,编译可以通过.而

  • C#中const 和 readonly 修饰符的用法详解

    1. 只有C#内置类型(int,double,long等)可以声明为const;结果.类和数组不能声明为const. 2. readonly 是在字段上使用的修饰符,直接以类名.字段访问. 3. const 必须在申明中初始化.之后不能再修改. 4. readonly可以在申明中初始化,也可以在构造函数中初始化,其它情况不能修改. namespace const_and_readonly { class Program { static void Main(string[] args) { Co

  • C/C++中CONST用法总结(推荐)

    1.修饰常量时: const int temp1; //temp1为常量,不可变 int const temp2; //temp2为常量,不可变 2.修饰指针时: 主要看const在*的前后,在前则指针指向的内容为常量,在后则指针本身为常量: const int *ptr; //*ptr为常量: int const *ptr; //*ptr为常量: int* const ptr; //ptr为常量: const int * const ptr; //*ptr.ptr均为常量: 3.const修饰

随机推荐