Go 语言常量 常量是一个简单值的标识符,在程序运行时,不会被修改的量。 常量中的数据类型只可以是布尔型、数字型(整数型、浮点型和复数)和字符串型。 常量的定义格式: const identifier [type] = value 你可以省略类型说明符 [type],因为编译器可以根据变量的值来推断其类型。 const b string = "abc" 隐式类型定义: const b = "abc" 多个相同类型的声明可以简写为: const c_name1, c_name2 = value1, value2 常量的应用 : ```java package main import "fmt" // Go语言常量 func main() { const LENGTH int = 10 const WIDTH
其中 const 可以用来定义 常量 ,将不需要改变的数据定义成一个常量。 但其实在 ES6 之前我们也是有办法定义常量的。 ES 5 创建常量 Object.defineProperty 的基础用法 在 ES6 之前是没有 const 的,如果需要定义常量,可以使用 Object.defineProperty 。 很多人知道 Vue2 使用 Object.defineProperty 监听数据变化,但不一定知道 Object.defineProperty 也可以用来定义常量。 常量居然可以修改值? 上面创建的常量,value 是一个基础数据类型的值。如果换成引用类型的值,那内容是可以修改的。 所以常量的定义指的是引用地址不能修改。 兼容性 使用 Object.defineProperty 定义常量时需要注意兼容性
常量指针:指向常量的指针 在指针定义语句的类型前加const,表示该指针指向一个常量。 const int a=666; const int * p=&a; 常量a只能被访问而不能被改写,但指向常量a的常量指针可以改写。 指针常量 在指针定义语句的指针名前加const,表示该指针是常量。 int a; int * const p=&a; 指针常量在定义时必须初始化,且不允许修改,但其指向的地址的值可以修改,即p不可改写而*p可以改写。 常量指针常量:指向常量的指针常量 在定义时必须初始化。 const int a=666; const int * const p=&a; 很简单,p和*p都不能改写。
注意,C语言中的等号表示赋值,作用是把一个常量赋值给一个变量,这样变量就获得了一个临时的固定值。 为什么说是临时的呢?因为在把另一个常量2赋值给a的时候,a的值就变为了2,不再1了。 而相应的,1、2、A、B都是固定的值,被称为常量。
指针常量 顾名思义 这是一个指针类型的常量!常量的特点就是不可改变,所以被指针指向的常量地址也是不可以变的。 可以看到我们在定义并初始化一个指针常量之后,再次修改它的指向是不被允许的,但是它指向地址的值是可以改变的 常量指针 本质上是一个指针,常量表示指针指向的内容 比如整型指针 字符指针 等等 常量指针指向的内容是不可改变的 常量指针的特点就是指向的地址不能变化 str目前的指向的是字符串常量 apple的首地址 即'a'的地址 *a就表示字符'a' 那我们能修改吗,答案是不能 因为apple是常量 之前我们在字符串也阐述过 这里不再赘述 那我们是否能修改指针指向 改变字符串的内容 str = "orange"; 答案也是不能 orange也存放在常量区 他在常量区的地址也就是字符串的首地址 但是str是指针常量 不可以修改 1.如果想要实现修改str,首先要去掉指针常量 使他可以修改指向的地址 然后就可以指向常量区新的内存地址 2.也可以把指针常量改成常量指针(可以修改指针指向 不能修改地址的内容) #include<stdio.h
1、指针常量——指针类型的常量(int *const p) 本质上一个常量,指针用来说明常量的类型,表示该常量是一个指针类型的常量。在指针常量中,指针自身的值是一个常量,不可改变,始终指向同一个地址。 ,常量地址只能赋值给常量指针 const int * ptr4 = &n; // 正确,常量地址初始化常量指针 int * const ptr5; // 错误,指针常量定义时必须初始化 ptr5 = &m; // 错误,指针常量不能在定义后赋值 const int * const ptr6 = &m; // 指向“常量”的指针常量,具有常量指针和指针常量的特点,指针内容不能改变 ,也不能指向其他地方,定义同时要进行初始化 *ptr6 = 5; // 错误,不能改变指针内容 ptr6 = &n; // 错误,不能指向其他地方 const int * ptr7 ”是一个字符串常量,常量的值不可修改。
因为指向常量的指针有时候会指向常量,所以它具有这个性质:“不能靠解引用改变它指向的对象的值”,以此保护它所指向的常量的常量性: *pa =d; // 不可行(d是已经声明过的整型) 但指针本身的值是可变的 这使得常量指针不象一般的const常量,用变量或常量初始化都可以。 也就是说,常量指针反而总是指向变量的。 5)关于记忆技巧: 对于区分const int *pa和int *const pa这两者, 前者中,const直接修饰*(不考虑int,因为类型在这里是没影响的),说明*(解引用)这种行为具有常量性 后者中,const直接修饰pa,说明pa本身的值具有常量性,即常量指针。 ,记住它们的注释长度:短——长——短, 分别对应着:const常量、指向常量的指针、常量指针这三种,应该就不会混淆了。
学到什么 什么是常量? 如何定义常量? 常量和变量有什么不同? 如何使用常量? 有哪些运算符? 如何使用运算符? 运算符的优先级? 常量 1. const ( a = iota // a = 0 b // b = 1 c // c = 2 d = 5 // d = 5 const ( a = iota // a = 0 b // b = 1 c // c = 2 d = 5 // d = 5 e = iota // e = 4 ) 当 d 常量赋值为 5 时,iota 只是暂时不应用,直到再次使用,而 iota 继续保持在增加新的一行时自增一。 5.
定义: 又叫常指针,可以理解为常量的指针,也即这个是指针,但指向的是个常量,这个常量是指针的值(地址),而不是地址指向的值。 特点: 常量指针指向的对象不能通过这个指针来修改,可是仍然可以通过原来的声明修改; 常量指针可以被赋值为变量的地址,之所以叫常量指针,是限制了通过这个指针修改变量的值; 指针还可以指向别处,因为指针本身只是个变量 ,可以指向任意地址; 表示形式 int const* p1; const int* p1; 二、指针常量 定义 本质是一个常量,而用指针修饰它。 指针常量的值是指针,这个值因为是常量,所以不能被赋值。 特点 它是个常量! ,即常量指针不可修改其指向地址 p1 = &b; //OK,指针还可以指向别处,因为指针只是个变量,可以随意指向; //——-指针常量——-// int* const p2 = &a; a =
说一下 常量指针和指针常量 的区别。 常量指针 指向常量的指针,也就是说指针指向的对象是常量,指向的常量不能修改。指针不是一个常量, 可以把指针指向别一个常量。 常量指针是我们最常用的,一般声明形式如下: const int *p; int const *p; 例: int a(1), b(3); const int * 不可以对指向的内容做修改: *p = 3; // 错误 指针常量 指针指向的地址不可以改变,地址的内容可以通过指针改变。指针常量在定义时必须赋值。 不能对指向的地址进行修改: p = &b; // 错误 我们也可以这样记 const 在谁前边谁就不可以修改: 常量指针 : const 在指针前边,我们就不可以修改指针。 指针常量 : const 在变量前边,我们就不可以修改指针的地址。
见如下例: Integer i1 = 10; Integer i2 = 10; Integer i3 = 0; Integer i4 = new Integer(10); Integer i5 = new true System.out.println(i1==i2+i3);//true System.out.println(i1==i4); //false System.out.println(i4==i5) ; //false System.out.println(i4==i5+i6);//true 运算导致等号右边是int 因此会将等号左边拆箱进行比较 System.out.println(10==i5+ demo String s1 = "hello"; String s2 = "hel" + "lo"; String s3 = "hel"; String s4 = s3+"lo"; String s5 System.out.println(s1 == s4);//false 表达式有变量,无法优化,新值在堆中 System.out.println(s1 == s5);//false s5是堆中 s1
本期给大家梳理下Go语言常量,常量是一个简单值的标识符,在程序运行时,不会被修改的量。 常量中的数据类型只可以是布尔型、数字型(整数型、浮点型和复数)和字符串型。 常量的定义格式: const identifier [type] = value 同时也支持多个相同类型的声明可以简写为: const c_name1, c_name2 = value1, value2 // Proxy2G_ConnDataProto == 4 G2Proxy_SendDataProto // G2Proxy_SendDataProto == 5 :iota iota,特殊常量,可以认为是一个可以被编译器修改的常量。 总结:Go语言中没有枚举,所以一般在一定枚举都是用常量来定义。 ?
学到什么 什么是常量? 如何定义常量? 常量和变量有什么不同? 如何使用常量? 有哪些运算符? 如何使用运算符? 运算符的优先级? 常量 1. 定义 常量的定义格式: const 常量名 [常量类型] = 常量值 [常量类型] 可以省略,编译器会根据值来推导类型。 const ( a = iota // a = 0 b // b = 1 c // c = 2 d = 5 // d = 5 e // e = 5 ) iota 从0开始,每增加新的一行就会自动加一,直到遇到新的赋值或重新声明一个 const块 时 iota 重置为0。 5.
double dval2 = 3.14;const double *cptr2 = &dval; //正确*cptr2 = 6.28; //错误 五、常量指针、指针常量、常量指针常量 常量指针:( (值)生效,所以为常量指针 指针常量时,const左边为*(代表指针),所以为指针常量 常量指针常量时,有两个const,对int(值),*(指针)都生效,因此为常量指针常量 当然,上面的规则可以简化为下面一句话 : const出现在“*”号的左边,代表所指之物是常量 const出现在“*”号的右边,代表指针自身是个常量 初始化与使用 常量指针,因为所指对象是个常量,所以有下面的规则 可以常量指针指向于常量或非常量 pa = 1; //不能通过常量指针修改所指对象的值 指针常量,因为指针是个常量,而不是类型是常量,因此有下面的规则: 只能指向于非常量,不能指向于常量(因为放置指针常量修改常量的值 pb = &b; //错误,b是常量 *pa = 10; //正确,可以修改指向对象的值pa = &c; //错误,不能修改pa的指向(因为指针自身是个常量) 常量指针常量,有如下规则: 可以使用常量
本篇为第5篇。 【番外篇】本篇核心:JDK各个版本中JDK的运行时常量池、字符串常量池、静态常量池的功能及存储位置。 在写本系列文章时,发现一旦追究起底层实现都会涉及到一些内存结构的问题。 其中涉及比较多的便是常量池,本篇文章汇总一下JDK的运行时常量池、字符串常量池、静态常量池的功能及存储结构。 JVM运行时内存结构 在了解常量池之前我们先通过一张图了解一下JVM的整个内存分布图。 静态常量池就是上面说的class文件中的常量池。class常量池是在编译时每个class文件中都存在。不同的符号信息放置在不同标志的常量表中。 ? 运行时常量池相对于class文件常量池的另外一个特性是具备动态性,java语言并不要求常量一定只有编译器才产生,也就是并非预置入class文件中常量池的内容才能进入方法区运行时常量池,运行期间也可能将新的常量放入池中 原文链接:《面试题系列第5篇:JDK的运行时常量池、字符串常量池、静态常量池,还傻傻分不清?》
今天说一说Java常量池(静态常量池与运行时常量池)[通俗易懂],希望能够帮助大家进步!!! 1、什么是常量 用final修饰的成员变量表示常量,值一旦给定就无法改变! final修饰的变量有三种:静态变量、实例变量和局部变量,分别表示三种类型的常量。 Java中的常量池,实际上分为两种形态:静态常量池和运行时常量池。 接下来就是class文件的版本号,第5、6个字节是@次版本号@,第7、8个字节是@主版本号@。 每项常量都是一个表,而由于各个常量的类型不一,大小也不相同,所以同样需要一个u1类型的数据来标记常量的类型,以确定其后的常量表的格式。 另外Byte,Short,Integer,Long,Character这5种整型的包装类也只是在对应值在-128到127时才可使用对象池。
变量名的第一个字符不能是数字; 3.关键字/特殊字符不能声明为变量名; 官方推荐的变量定义方式 1.驼峰体 NameStore = 'xiaoming' 2.下划线 name_store = 'xiaoming' 常量 :值是固定的,不应该去修改,用大写表示,如NAME= 注意:Python是不支持常量的,大写定义的也可以改,约定熟成不去修改。
,举个例子: int a = 5; const int* p = &a; a = 4;//合法 *p = 3;//不合法 由于这个特点,通常把const int* p的形式作为函数的参量,以表示函数不会用这个指针修改数据 int a = 5; const int b = 5; const int* p = &a; a = 4;//合法 *p = 3;//不合法 p = &b;//合法 b = 4;//不合法 *p = 3 ;//不合法 而对于3,它的作用是保证指针不会指向别处,也就是一旦用这种方式声明并初始化,指针指向的地址永远不会发生变化,但是其中的值却可以通过指针改变: int a = 5; int b = 6; int 上面说的情况,对于指针的修饰都只用了一个const关键字,还有两个const一起用的时候,此时的结果就是指针不能修改指向的数据,指针不能指向别的地方: int a = 5; int b = 6; const const int a = 5; int b = 6; int * const q = &a;//不合法 const int * const p = &a;//合法 *p = 4;//不合法 p =
目录 常量池 Integer a= 127 与 Integer b = 127相等吗 ---- 常量池 java中存在字符串常量池,维护了所有String对象 使用String s=”zx”的时候是使用 String.valueOf(“zx”)从常量池中找了个对象返回 如果不存在则将内容放入常量池中 在使用new的时候是直接创建一个新的对象在堆中 Integer中也有常量池 其中缓存了-128到127之间的数字 如果整型字面量的值在-128 到 127 之间,那么自动装箱时不会 new 新的Integer 对象,而是直接引用Integer常量池中的 Integer 对象,超过范围 a1==b1 System.out.println(b == c); // true //如果整型字面量的值在-128到127之间, //那么自动装箱时不会new 新的Integer 对象, //而是直接引用常量池中的
c++常量定义支持两种语法。 #define 常量名称 常量值const 常量类型 常量名称 = 常量值例如我们分别用两种语法表示linux和windows的换行符#include <iostream>#define WIN_EOL (){ std::cout << "Hi Windows" << WIN_EOL; std::cout << "Hi Linux" << LIN_EOL; return 0;}注意:常量定义为大写字母形式是一种编程代码规范