常量和变量的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了常量和变量的区别相关的知识,希望对你有一定的参考价值。

c语言中
到底什么是常量和变量?常量和变量与各种据类型又有什么关系?最好举几个例子。标示符与常量和变量又有什么关系?常量和符号常量有什么区别?

常量和变量的区别:变量是“可读、可写”,而常量是“只读”的。

变量是在程序运行过程中,内部存储的值,随时可以被改变的一段内存地址。比如:int a = 123,这里的a就是一个整型变量,通常情况下,整型变量占据着4个字节的内存。

常量在程序运行过程中,所表示的值是无法被改变的。比如:const int a = 123, 这里的a,在其前面有一个修饰符“const”,表示a的值是“只读”的。

扩展资料:

在C语言中,定义常量,有两种方式:一是使用预处理指令:#define ; 二是使用“const”关键字。

在定义常量的时候,给常量起的名字,要尽量大写,这是一种“默认”的规则,便于区别“常量”与“变量”,增强程序的可读性。

使用常量有个非常大的好处是:当程序中多处使用某个常量的时候,只需要在定义常量的地方,修改一下常量的值,那么多处的值,就都会被改变,这样,是很有利于程序后期进行维护的。

参考资料来源:

百度百科--常量

百度百科--变量

参考技术A

  “常量”在程序运行时,不会被修改的量。换言之,常量虽然是为了硬件、软件、编程语言服务,但是它并不是因为硬件、软件、编程语言而引入。

  常量区分为不同的类型,如25、0、-8为整形常量,6.8、-7.89为实型常量,‘a’‘b’为字符常量。常量一般从其字面形式即可判断。这种常量称为字面常量或直接常量。

  变量来源于数学,是计算机语言中能储存计算结果或能表示值抽象概念。变量可以通过变量名访问。在指令式语言中,变量通常是可变的;但在纯函数式语言(如Haskell)中,变量可能是不可变(immutable)的。在一些语言中,变量可能被明确为是能表示可变状态、具有存储空间的抽象(如在Java和Visual Basic中);但另外一些语言可能使用其它概念(如C的对象)来指称这种抽象,而不严格地定义“变量”的准确外延。

参考技术B 数据类型就像:整数,单精度小数,双精度小数……
变量:就像数学中的变量X,Y……注意:他们的值是可以改变的
常量:也像数学中的常量 A,B……,值一旦给定后就不变本回答被提问者和网友采纳
参考技术C 常量就是不变的量,可以是数值,字符,各种符号. 参考技术D 常量就是不变的量

java 中变量存储位置的区别


[原文]

1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制. 
2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中。) 
3. 堆:存放所有new出来的对象。 
4. 静态域:存放静态成员(static定义的) 
5. 常量池:存放字符串常量和基本类型常量(public static final)。 
6. 非RAM存储:硬盘等永久存储空间 

这里我们主要关心栈,堆和常量池,对于栈和常量池中的对象可以共享,对于堆中的对象不可以共享。栈中的数据大小和生命周期是可以确定的,当没有引用指向数据时,这个数据就会消失。堆中的对象的由垃圾回收器负责回收,因此大小和生命周期不需要确定,具有很大的灵活性。 
对于字符串:其对象的引用都是存储在栈中的,如果是编译期已经创建好(直接用双引号定义的)的就存储在常量池中,如果是运行期(new出来的)才能确定的就存储在堆中。对于equals相等的字符串,在常量池中永远只有一份,在堆中有多份。 
如以下代码: 

Java代码 
1.String s1 = "china";  
2.String s2 = "china";  
3.String s3 = "china";  
4.String ss1 = new String("china");  
5.String ss2 = new String("china");  
6.String ss3 = new String("china");  
对于通过new产生一个字符串(假设为”china”)时,会先去常量池中查找是否已经有了”china”对象,如果没有则在常量池中创建一个此字符串对象,然后堆中再创建一个常量池中此”china”对象的拷贝对象。这也就是有道面试题:String s = new String(“xyz”);产生几个对象?一个或两个,如果常量池中原来没有”xyz”,就是两个。 
对于基础类型的变量和常量:变量和引用存储在栈中,常量存储在常量池中。 
如以下代码: 

Java代码 
1.int i1 = 9;  
2.int i2 = 9;  
3.int i3 = 9;   
4.public static final int INT1 = 9;  
5.public static final int INT2 = 9;  
6.public static final int INT3 = 9;  

对于成员变量和局部变量:成员变量就是方法外部,类的内部定义的变量;局部变量就是方法或语句块内部定义的变量。局部变量必须初始化。 
形式参数是局部变量,局部变量的数据存在于栈内存中。栈内存中的局部变量随着方法的消失而消失。 
成员变量存储在堆中的对象里面,由垃圾回收器负责回收。 
如以下代码: 

Java代码 
1.class BirthDate {  
2.    private int day;  
3.    private int month;  
4.    private int year;      
5.    public BirthDate(int d, int m, int y) {  
6.        day = d;   
7.        month = m;   
8.        year = y;  
9.    }  
10.    省略get,set方法………  
11.}  
12.  
13.public class Test{  
14.    public static void main(String args[]){  
15.int date = 9;  
16.        Test test = new Test();        
17.           test.change(date);   
18.        BirthDate d1= new BirthDate(7,7,1970);         
19.    }    
20.  
21.    public void change1(int i){  
22.        i = 1234;  
23.    }  
对于以上这段代码,date为局部变量,i,d,m,y都是形参为局部变量,day,month,year为成员变量。下面分析一下代码执行时候的变化: 
1. main方法开始执行:int date = 9; 
date局部变量,基础类型,引用和值都存在栈中。 
2. Test test = new Test(); 
test为对象引用,存在栈中,对象(new Test())存在堆中。 
3. test.change(date); 
i为局部变量,引用和值存在栈中。当方法change执行完成后,i就会从栈中消失。 
4. BirthDate d1= new BirthDate(7,7,1970);  
d1 为对象引用,存在栈中,对象(new BirthDate())存在堆中,其中d,m,y为局部变量存储在栈中,且它们的类型为基础类型,因此它们的数据也存储在栈中。 day,month,year为成员变量,它们存储在堆中(new BirthDate()里面)。当BirthDate构造方法执行完之后,d,m,y将从栈中消失。 
5.main方法执行完之后,date变量,test,d1引用将从栈中消失,new Test(),new BirthDate()将等待垃圾回收。





































































以上是关于常量和变量的区别的主要内容,如果未能解决你的问题,请参考以下文章

常量和常变量有啥区别没

java中常量和变量的区别?

C语言里符号常量和常变量有啥区别?

常量与变量的区别

常量与变量有何区别呢?字符常量与字符串常量有何区别呢?

C语言里符号常量和常变量有啥区别?