4.Go常量 前言 在上一篇章,我们已经学习了Go基础数据类型,那么这一篇章我们来学习一下Go的常量。 1:常量定义使用 在讲解常量之前,我们要先简单说一下我们前面讲解的变量。 ,不可以改变的量,常量声明需要const //1.定义常量 const a int = 10 // 常量不允许修改 fmt.Println("a = ", a) //自动推导类型 2:字面常量 所谓字面常量(literal),是指程序中硬编码的常量,如: 123 3.1415 // 浮点类型的常量 3.2+12i // 复数类型的常量 true // 布尔类型的常量 "foo" // 字符串常量 3:iota枚举 常量声明可以使用iota常量生成器初始化,它用于生成一组以相似规则初始化的常量,但是不用每行都写一遍初始化表达式。 %d, b=%d, c=%d\n", a, b, c) // 3. iota遇到const,重置为 0 const d = iota fmt.Printf("d=%d\n", d) // 4.
Go 支持字符、字符串、布尔值和数值类型的常量。 package mainimport ( "fmt" "math")// 用 const 声明一个常量const s string = "constant"func main() { const n = 500000000// 常量表达式可以进行任意精度的算术运算。 const d = 3e20 / n fmt.Println(d)// 数值常量在被赋予类型之前是没有类型的,例如通过显式转换。
常量折叠instcombine pass优化实例 下面函数foo中存在冗余变量计算、赋值语句,使用instcombine优化的效果: #include <stdio.h> int foo() { %2 = alloca i32, align 4 %3 = alloca i32, align 4 %4 = alloca i32, align 4 store i32 600, ptr = add nsw i32 %8, 200 store i32 %9, ptr %4, align 4 %10 = load i32, ptr %4, align 4 %11 = call %2 = alloca i32, align 4 %3 = alloca i32, align 4 %4 = alloca i32, align 4 store i32 600, ptr )"} 常量全部折叠了: ; Function Attrs: noinline nounwind uwtable define dso_local i32 @foo() #0 { %1 = call
常量指针:指向常量的指针 在指针定义语句的类型前加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都不能改写。
指针常量 顾名思义 这是一个指针类型的常量!常量的特点就是不可改变,所以被指针指向的常量地址也是不可以变的。 可以看到我们在定义并初始化一个指针常量之后,再次修改它的指向是不被允许的,但是它指向地址的值是可以改变的 常量指针 本质上是一个指针,常量表示指针指向的内容 比如整型指针 字符指针 等等 常量指针指向的内容是不可改变的 常量指针的特点就是指向的地址不能变化 str目前的指向的是字符串常量 apple的首地址 即'a'的地址 *a就表示字符'a' 那我们能修改吗,答案是不能 因为apple是常量 之前我们在字符串也阐述过 这里不再赘述 那我们是否能修改指针指向 改变字符串的内容 str = "orange"; 答案也是不能 orange也存放在常量区 他在常量区的地址也就是字符串的首地址 但是str是指针常量 不可以修改 1.如果想要实现修改str,首先要去掉指针常量 使他可以修改指向的地址 然后就可以指向常量区新的内存地址 2.也可以把指针常量改成常量指针(可以修改指针指向 不能修改地址的内容) #include<stdio.h
1、指针常量——指针类型的常量(int *const p) 本质上一个常量,指针用来说明常量的类型,表示该常量是一个指针类型的常量。在指针常量中,指针自身的值是一个常量,不可改变,始终指向同一个地址。 int *p, int const *p) 常量指针本质上是一个指针,常量表示指针指向的内容,说明该指针指向一个“常量”。 ptr1 = &n; // 正确 ptr2 = &n; // 错误,ptr2不能指向其他地方 *ptr1 = 3; // 错误,ptr1不能改变指针内容 *ptr2 = 4; // 正确 int *ptr3 = &n; // 错误,常量地址不能初始化普通指针吗,常量地址只能赋值给常量指针 const int * ptr4 = &n; // 正确,常量地址初始化常量指针 ”是一个字符串常量,常量的值不可修改。
因为指向常量的指针有时候会指向常量,所以它具有这个性质:“不能靠解引用改变它指向的对象的值”,以此保护它所指向的常量的常量性: *pa =d; // 不可行(d是已经声明过的整型) 但指针本身的值是可变的 这使得常量指针不象一般的const常量,用变量或常量初始化都可以。 也就是说,常量指针反而总是指向变量的。 4)最后,是前面两者的结合:指向常量的常量指针 const int *const c=&e; //e是已经声明过的整型,整型常量或整型变量都可以 把它理解成一个普通的const常量,同时被剥夺了“靠解引用改变它指向的对象的值 后者中,const直接修饰pa,说明pa本身的值具有常量性,即常量指针。 ,记住它们的注释长度:短——长——短, 分别对应着:const常量、指向常量的指针、常量指针这三种,应该就不会混淆了。
定义: 又叫常指针,可以理解为常量的指针,也即这个是指针,但指向的是个常量,这个常量是指针的值(地址),而不是地址指向的值。 特点: 常量指针指向的对象不能通过这个指针来修改,可是仍然可以通过原来的声明修改; 常量指针可以被赋值为变量的地址,之所以叫常量指针,是限制了通过这个指针修改变量的值; 指针还可以指向别处,因为指针本身只是个变量 ,可以指向任意地址; 表示形式 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 在变量前边,我们就不可以修改指针的地址。
运行时常量池: 3.基本数据类型包装类常量池 4.java字符串常量池 1.常量 常量表示程序运行过程种不可改变的值,主要作用如下: 1.代表常数,便于程序的重构和修改。 Integer int1 = 4; Integer int2 = 4; System.out.println(int1 == int2); //结果为true 正常情况下,Integer是一个对象,应该存放在堆区 = 128; System.out.println(int3 == int4);//打印结果为false } 这样即可以发现对于前面所说的包装类也是通过其产量池进行缓存的。 ; //false System.out.println(i4==i5); //false System.out.println(i4==i5+i6);//true 运算导致等号右边是int 因此会将等号左边拆箱进行比较 System.out.println(10==i5+i6);//true 4.java字符串常量池 在java中,用String表示字符串。
r1 = i; //正确,允许将const int&绑定到一个普通对象上const int &r2 = 42; //正确const int &r3 = r1 * 2;//正确int &r4 = r1 * 2; //错误 四、常量和指针 也可以用const来修饰指针,指向常量的指针不能用于改变其所指对象的值 常量只能由常量指针来指向,不能由非常量指针来指向 const double (值)生效,所以为常量指针 指针常量时,const左边为*(代表指针),所以为指针常量 常量指针常量时,有两个const,对int(值),*(指针)都生效,因此为常量指针常量 当然,上面的规则可以简化为下面一句话 : const出现在“*”号的左边,代表所指之物是常量 const出现在“*”号的右边,代表指针自身是个常量 初始化与使用 常量指针,因为所指对象是个常量,所以有下面的规则 可以常量指针指向于常量或非常量 pa = 1; //不能通过常量指针修改所指对象的值 指针常量,因为指针是个常量,而不是类型是常量,因此有下面的规则: 只能指向于非常量,不能指向于常量(因为放置指针常量修改常量的值
今天说一说Java常量池(静态常量池与运行时常量池)[通俗易懂],希望能够帮助大家进步!!! 1、什么是常量 用final修饰的成员变量表示常量,值一旦给定就无法改变! final修饰的变量有三种:静态变量、实例变量和局部变量,分别表示三种类型的常量。 Java中的常量池,实际上分为两种形态:静态常量池和运行时常量池。 2、class字节码文件 class文件的@头4个字节称为魔数@,它的唯一作用就是确定这个文件时候是一个能被虚拟机接受的class文件。 每项常量都是一个表,而由于各个常量的类型不一,大小也不相同,所以同样需要一个u1类型的数据来标记常量的类型,以确定其后的常量表的格式。 4、常量池的好处 常量池是为了避免频繁的创建和销毁对象而影响系统性能,其实现了对象的共享。例如字符串常量池,在编译阶段就把所有的字符串文字放到一个常量池中。
开发场景 编写代码经常需要定义常量,例如,写一个UI动画,需要定义一个动画播放时间,通常做法 #define ANIMATION_DURATION 5 这行预处理指令会把源代码中的ANIMATION_DURATION 常量的类型 命名习惯(若仅在该类.m文件中使用,则字母前加k,若在该类外也要使用,则加类名) 常量位置 若不公开某个常量,则将其定义在该类的.m文件 #import "ViewController.h" const修饰符所声明的变量,如果修改就会报错 static修饰符则意味着该变量仅在定义此变量的.m文件可见 对外公开某个常量(比如通知名称) 此类常量需要放在“全局符号表”中,这样别的类可以使用 这个常量在.h中声明,在.m中定义 这个常量名字,最好使用与之相关的类名做前缀 #import <UIKit/UIKit.h> @interface LoginViewController : UIViewController ,因为不含类型信息,而且有人改了常量值也不会报错 在实现文件里使用static、const来定义的常量只能在该类的.m文件中使用,此类常量不在全局符号中,所以无需加前缀 在头文件中使用extern来声明全局变量
变量名的第一个字符不能是数字; 3.关键字/特殊字符不能声明为变量名; 官方推荐的变量定义方式 1.驼峰体 NameStore = 'xiaoming' 2.下划线 name_store = 'xiaoming' 常量 :值是固定的,不应该去修改,用大写表示,如NAME= 注意:Python是不支持常量的,大写定义的也可以改,约定熟成不去修改。
c++常量定义支持两种语法。 #define 常量名称 常量值const 常量类型 常量名称 = 常量值例如我们分别用两种语法表示linux和windows的换行符#include <iostream>#define WIN_EOL (){ std::cout << "Hi Windows" << WIN_EOL; std::cout << "Hi Linux" << LIN_EOL; return 0;}注意:常量定义为大写字母形式是一种编程代码规范
目录 常量池 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 对象, //而是直接引用常量池中的
,举个例子: 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 它的作用是保证指针不会指向别处,也就是一旦用这种方式声明并初始化,指针指向的地址永远不会发生变化,但是其中的值却可以通过指针改变: int a = 5; int b = 6; int * const p = &a; *p = 4; const一起用的时候,此时的结果就是指针不能修改指向的数据,指针不能指向别的地方: int a = 5; int b = 6; const int * const p = &a;//合法 *p = 4; const int a = 5; int b = 6; int * const q = &a;//不合法 const int * const p = &a;//合法 *p = 4;//不合法 p =
1.常量:一旦赋值,不可以改变 1.什么时候使用常量? 只要一个变量的值不允许修改,那么就定义为常量 2.如何使用? const 常量名=值; 强调: 1.常量声明的时候必须初始化 2.命名强调大写(行规) 旧的浏览器中: 问题:修改常量的值不会报错,但 是修改不成功 --静默错误 解决:使用严格语法
常量是指不会发生变化的量。具有全局性;一旦被定义,他的值只能是标量数据类型。 声明常量 常量的声明方式有两种: 1、define()函数 基本语法: bool define (string name,mixed value,bool case_insensitive) 创建成功显示 > 2、const关键字 该方式定义的常量必位于最顶端的作用区域,通常在编译时使用,而且不能在函数内、循环内、if语句内使用 <? > 使用常量 constant()函数: mixed constant(string name) <? > 预定义常量 常量名 常量值举例 说明 PHP_VERSION 7.33 当前PHP版本 PHP_OS
除了变量之外,Java中还有一个叫常量的家伙,用关键字final来指示常量,例如:final double PI = 3.14;常量,顾名思义就是不变的量,一旦被声明后,它的值就不能被改变,也因此必须在声明的时候初始化 ,常量可以理解为其值不能被改变的变量。 常量命名一般情况下全部字母都需要大写,如有多个单词则用下划线连接。既然不能改变,那常量存在的意义是什么呢?用PI代替3.14的意义何在? 而且还有一个很重要的一点,如果常量的初始化值需要改变,比如一开始设置一个常量叫做 FULL_MARK,一开始你以为满分只有100分,可是程序写完之后,被告知满分是120分,于是你只需要在该常量定义的地方将