-
2017-11-20 22:51:42
字面值:是一个不能改变的值,如数字、字符、字符串等。单引号内的是字符字面值,双引号内的是字符串字面值。
字面值类型(literal type):算数类型、引用和指针等。
常量表达式(const experssion):是指(1)值不会改变 并且 (2)在编译过程就能得到计算结果的表达式。字面量属于常量表达式,用常量表达式初始化的const对象也是常量表达式。
一个对象(或表达式)是不是常量表达式由它的数据类型和初始值共同决定。
const int a =1; //常量表达式 cosnt int b=a+1; //常量表达式 int c=2; //初始值是字面值常量,当c数据类型是普通int。 const int d=fun(); //fun()值要在运行时得到,d不是字面值常量。
constexpr变量
C++11新标准规定,允许将变量声明为constexpr类型以便由编译器来验证变量的是否是一个常量表达式。
声明为constexpr的变量一定是一个常量,而且必须用常量表达式初始化。
constexpr函数
constexpr函数是指能用于常量表达式的函数。
应遵循的约定:函数返回类型及所有形参的类型都是字面值类型,而且函数体中必须有且只有一条return 语句。
constexpr函数体内可以有其他语句,只要这些语句在运行时不执行任何操作。(例如,空语句、类型别名和using声明等)
constexpr函数被隐式地指定为内联函数。
若a是常量表达式,fun(a)就是常量表达式。若a不是常量表达式,fun(a)就是变成普通函数。constexpr int fun(int a){ return a*10; }
当constexpr函数是常量表达式时可以用来初始化constexpr变量。
constexpr和指针constexpr声明中定义了一个指针,限定符constexpr仅对指针对象有效,与指针所指的对象无关。
但constexpr声明的指针初始值只能是0、nullptr和存储于某个固定地址中的对象。因为它是常量表达式(常量表达式定义(2))。const int *p1=nullptr; //p1是指向整形常量的指针 constexpr int *p2=nullptr; //p2是指向整形的常量指针 (等效于 int *const p2=nullptr;)
更多相关内容 -
常量表达式(什么叫常量表达式)
2021-05-20 08:40:10常量表达式c语言,整型表达式和常量表达式中都没有变量参与吧?完整问题:好评回答:表达式没有变量参与?不是很清楚这个问题的定义,只是知道(a b)这种表达式下a和b都可以是变量Java编译器对于String常量表达式的...常量表达式
c语言,整型表达式和常量表达式中都没有变量参与吧?
完整问题:
好评回答:表达式没有变量参与?不是很清楚这个问题的定义,只是知道(a b)这种表达式下a和b都可以是变量
Java编译器对于String常量表达式的优化是什么呢?
完整问题:Java编译器对于String常量表达式的优化是什么呢?
好评回答:首先把问题摆出来,先看这个代码 String a = "ab"; String b = "a" + "b"; System。out。println((a == b));打印结果会是什么?类似这样的问题,有人考过我,我也拿来考过别人(蛮好玩的,大家也可以拿来问人玩),一般答案会是以下几种: 1。true "a" + "b" 的结果就是"ab",这样a,b都是"ab"了,内容一样所以"相等",结果true 一般java新人如是答。 2。false "a" + "a"会生成新的对象"aa",但是这个对象和String a = "ab";不同,(a == b)是比较对象引用,因此不相等,结果false 对java的String有一定了解的通常这样回答。 3。true String a = "ab";创建了新的对象"ab"; 再执行String b = "a" + "b";结果b="ab",这里没有创建新的对象,而是从JVM字符串常量池中获取之前已经存在的"ab"对象。因此a,b具有对同一个string对象的引用,两个引用相等,结果true。 能回答出这个答案的,基本已经是高手了,对java中的string机制比较了解。 很遗憾,这个答案,是不够准确的。或者说,根本没有运行时计算b = "a" + "b";这个操作。实际上运行时只有String b = "ab"; 3的观点适合解释以下情况: String a = "ab"; String b = "ab"; System。out。println((a == b));如果String b = "a" + "b";是在运行期执行,则3的观点是无法解释的。运行期的两个string相加,会产生新的对象的。(本文后面对此有解释) 4。true 下面是我的回答:编译优化+ 3的处理方式 = 最后的true String b = "a" + "b";编译器将这个"a" + "b"作为常量表达式,在编译时进行优化,直接取结果"ab",这样这个问题退化 String a = "ab"; String b = "ab"; System。out。println((a == b));然后根据3的解释,得到结果true 这里有一个疑问就是String不是基本类型,像 int secondsOfDay = 24 * 60 * 60; 这样的表达式是常量表达式,编译器在编译时直接计算容易理解,而"a" + "b" 这样的表达式,string是对象不是基本类型,编译器会把它当成常量表达式来优化吗?。
Java编译器对于String常量表达式的优化是什么呢?
完整问题:Java编译器对于String常量表达式的优化是什么呢?
好评回答:首先把问题摆出来,先看这个代码 String a = "ab"; String b = "a" + "b"; System。out。println((a == b));打印结果会是什么?类似这样的问题,有人考过我,我也拿来考过别人(蛮好玩的,大家也可以拿来问人玩),一般答案会是以下几种: 1。true "a" + "b" 的结果就是"ab",这样a,b都是"ab"了,内容一样所以"相等",结果true 一般java新人如是答。 2。false "a" + "a"会生成新的对象"aa",但是这个对象和String a = "ab";不同,(a == b)是比较对象引用,因此不相等,结果false 对java的String有一定了解的通常这样回答。 3。true String a = "ab";创建了新的对象"ab"; 再执行String b = "a" + "b";结果b="ab",这里没有创建新的对象,而是从JVM字符串常量池中获取之前已经存在的"ab"对象。因此a,b具有对同一个string对象的引用,两个引用相等,结果true。 能回答出这个答案的,基本已经是高手了,对java中的string机制比较了解。 很遗憾,这个答案,是不够准确的。或者说,根本没有运行时计算b = "a" + "b";这个操作。实际上运行时只有String b = "ab"; 3的观点适合解释以下情况: String a = "ab"; String b = "ab"; System。out。println((a == b));如果String b = "a" + "b";是在运行期执行,则3的观点是无法解释的。运行期的两个string相加,会产生新的对象的。(本文后面对此有解释) 4。true 下面是我的回答:编译优化+ 3的处理方式 = 最后的true String b = "a" + "b";编译器将这个"a" + "b"作为常量表达式,在编译时进行优化,直接取结果"ab",这样这个问题退化 String a = "ab"; String b = "ab"; System。out。println((a == b));然后根据3的解释,得到结果true 这里有一个疑问就是String不是基本类型,像 int secondsOfDay = 24 * 60 * 60; 这样的表达式是常量表达式,编译器在编译时直接计算容易理解,而"a" + "b" 这样的表达式,string是对象不是基本类型,编译器会把它当成常量表达式来优化吗?。
库伦定律的数学表达式。表达式中有个常量叫什么。采用国际单位制单位,其数值是多少。它的单位是什么
完整问题:
好评回答:k=9.0*10^-19 单位是(N*m^2)/C^2 静电常数
“每个常量表达式的值不能相同,但次序不影响执行结果”有问题吗
完整问题:
好评回答:个人觉得有问题,常量表达式的值当然是可以相同的 如 int x=2; ? int y=2; //二个常量表达式的值都是2,完全是可以的
C语言中switch()语句形式中case只加常量表达式但不加语句是什么意思?
完整问题:C语言中switch()语句形式中case只加常量表达式但不加语句是什么意思?
好评回答:表示几个case共用一条/组语句。即它与下面离它最近那个有语句的case使用相同的语句。case 1:case 2:case 3: printf("123"); break;则不论1/2/3都输出123
匿名内部类(匿名内部类的写法) 匿名内部类 静态内部类的区别和联系是什么? 完整问题:匿名内部类,内部类,静态内部类的区别和联系是什么? 好评 […]...
合同法案例(合同法案例分析PPT) 合同法案例 合同法案例主要涉及哪些方面? 完整问题:合同法案例主要涉及哪些方面? 好评回答: 第一类:关于合 […]...
湖北课改网(课改网为什么登录不了) 湖北课改网 湖北高考课改网的用户名是什? 完整问题:湖北高考课改网的用户名是什么 好评回答:应该是学号。 湖北 […]...
幻灯片模版(教师节的ppt怎么做) 幻灯片模版 幻灯片怎样把字打到幻灯片模版? 完整问题:幻灯片怎样把字打到幻灯片模版上 好评回答:插入文档试试呢 […]...
六级分数线(六级425分算过吗) 六级分数线 六级有存在分数线的问题吗?多少才算过那? 完整问题:六级有存在分数线的问题吗?多少才算过那? 好评 […]...
教师招考网(2019荥经招聘) 教师招考网 安徽教师招考网网址是什? 完整问题:安徽教师招考网网址是什么 好评回答:这是我的回答,希望对你有帮 […]...
三阶行列式(521爱情行列式) 三阶行列式 则行列式2A的值是多? 完整问题:如果三阶行列式A的值为2,则行列式2A的值是多少 好评回答:你好 […]...
宋词三百首|清平乐·留春不住 王安国《清平乐·留春不住》留春不住,费尽莺儿语。满地残红宫锦污,昨夜南园风雨。小怜初上琵琶,晓来思绕天涯。不肯 […]...
-
剖析C++中的常量表达式与省略号的相关作用
2020-12-31 19:04:37C++ 常量表达式 常量值是指不会更改的值。C + + 提供了两个关键字,它们使你能够表达不打算修改对象的意图,还可让你实现该意图。 C++ 需要常量表达式(计算结果为常量的表达式)以便声明: 数组边界 case 语句中... -
c++常量和常量表达式
2019-08-03 18:49:31const,默认情况下仅在文件内有效 const int i(12); const引用:对常量的引用不能被用作修改它所绑定的对象 ...允许常量引用绑定到非常量的对象、字面值或表达式上 int i = 20; const int &ri(20); con...const,默认情况下仅在文件内有效
const int i(12);
const引用:对常量的引用不能被用作修改它所绑定的对象
const int ci(5);
const int &rci(ci);
rci = 90;//错误 不能修改
允许常量引用绑定到非常量的对象、字面值或表达式上
int i = 20;
const int &ri(20);
const int &ri3(i + ri);
常量引用仅对引用可参与的操作作出了限定,对于引用的对象本身未做限定
int i(10);
const int &c(i);
i = 90;//i不是常量,可以改变值
c = 20;//错误,c是一个常量引用,const限定了c为常量不能修改,i的修改与c的限定无关。
cout << c << endl;//值为90
//指针和const
int iv(10);
int iv1(23);
const int * pci1(&iv);//指向常量的指针,限定了该指针的操作,pci1的值可以改变,pcil指向的值不能变
pci1 = &iv1;
iv = 30;
int * const pci2(&iv);//常量指针,把指针本身定位常量,pci2的值不能改变,pci2指向的值可以改变
*pci2 = 90;
cout << *pci1 << endl;//23
cout << *pci2 << endl;//90
顶层和底层
顶层:表示指针本身是个常量
底层:指针所指的对象是常量
小技巧:const int * p: const修饰的是*p,也就是*p不能变。
int * const p: const修饰的是p,也就是p不能变。
字面值和constexpr
常量表达式:字面值是常量表达式,用常量表达式初始化的const对象也是常量表达式
const int ci = 20;//ci是常量表达式
const int cii = ci + 90;//cii是常量表达式
int iv = 30;//iv不是常量表达式
声明为constexpr的变量一定是常量,而且必须用常量表达式初始化
constexpr int cif = 23;
constexpr声明的指针,只对指针有效,与指针指向的对象无关
constexpr int cvi(12);//必须定义到函数体外部才能被cip使用
constexpr const int * cip(&cvi);
cout << *cip << endl;
-
C++语言编程概念:常量、常量表达式和常量初始化
2021-06-17 19:09:11常量 常量是固定值,在程序执行期间不会改变。这些固定的值,又叫做字面值。常量可以是任何的基本数据类型,可分为整型数字、浮点数字、字符、字符串和布尔值。常量就像是常规的变量,只不过常量的值在定义后不能...常量
常量是固定值,在程序执行期间不会改变。这些固定的值,又叫做字面值。常量可以是任何的基本数据类型,可分为整型数字、浮点数字、字符、字符串和布尔值。常量就像是常规的变量,只不过常量的值在定义后不能进行修改。时期不同:
- 编译时常量
- 运行时常量
定义方式不同:
- 符号常量 (#define)
- 常值变量 (const)
- 枚举值(enum)
#define PI 3.1415926 const double PI=3.1415926; enum Color { red, green, blue }; const char * cc = "hello world"; //程序映像的 .rodata 段
常量表达式
定义能在编译时求值的表达式。这种表达式能用做非类型模板实参、数组大小,并用于其他要求常量表达式的语境。但是常量不是常量表达式,只有用常量表达式初始化的常量,才能成为常量表达式,用非常量表达式初始化的常量仅仅是常量。如果常量的初始值不是常量表达式,则该常量不是常量表达式。
constexpr 说明符
constexpr 说明符声明编译时可以对函数或变量求值值。这些变量和函数(给定了合适的函数实参的情况下)即可用于需要编译期常量表达式的地方。
常量初始化
设置静态变量的初值为编译时常量。
非局部变量
所有具有静态存储期的非局部变量,作为程序启动的一部分,在 main 函数的执行之前进行初始化(除非被延迟)。所有具有线程局部存储期的非局部变量,作为线程启动的一部分进行初始化,按顺序早于线程函数的执行开始。对于这两种变量,初始化发生于两个截然不同的阶段:
静态初始化
若受允许,则首先进行常量初始化(参见常量初始化中符合情况的列表)。
对于所有其他非局部静态及线程局域变量,均进行零初始化。实践中:
常量初始化通常在编译期进行,并将预先计算的对象表示作为程序映像的一部分存储下来。若编译器没有这么做,则亦保证此初始化发生早于任何动态初始化。
零初始化的变量将被置于程序映像的 .bss 段,它不占据磁盘空间,并在加载程序时由操作系统以零填充。
例子#include <iostream> #include <array> struct S { static const int c; }; const int S::c = 5; // 常量初始化,保证首先发生 constexpr int d = 10 * S::c; // 常量表达式:S::c 先于它初始化 int main() { std::cout << "d = " << d << '\n'; std::array<int, S::c> a1; // OK:S::c 是常量表达式 const int e = 10; std::array<int, e> a2; // OK:e是常量表达式 }
输出:
d = 50
#include <iostream> #include <array> struct S { static const int c; }; constexpr int d = 10 * S::c; // 常量表达式,S::c还未定义 const int S::c = 5; // 常量初始化 int main() { std::cout << "d = " << d << '\n'; std::array<int, S::c> a1; // OK:S::c 是常量表达式 }
main.cpp:8:28: error: the value of 'S::c' is not usable in a constant expression 8 | constexpr int d = 10 * S::c; | ~~~^ main.cpp:5:22: note: 'S::c' was not initialized with a constant expression 5 | static const int c; | ^
#include <iostream> #include <array> struct S { static const int c; }; const int d = 10 * S::c; // 非常量表达式:S::c 此前无初始化器,此初始化发生晚于常量初始化 const int S::c = 5; // 常量初始化,保证首先发生 int main() { std::cout << "d = " << d << '\n'; std::array<int, S::c> a1; // OK:S::c 是常量表达式 // std::array<int, d> a2; // 错误:d 不是常量表达式 }
输出:
d = 50
学C++的过程中,往往因为没有资料或者没人指导从而导致自己不想学下去,因此特意准备了个群,点击加入可以获取PDF书籍、教程等给大家免费使用!进群的小伙伴有机会ss获取实体书籍。
-
Java常量表达式和代码消除
2021-03-14 11:06:24如果我的代码使用依赖于不同包中定义的其他常量表达式的常量表达式,那么这将如何影响?例如,假设我在相应的指定包中有以下类:package foo;public class Foo {public static final boolean CONDITION = false;... -
JavaSwitch语句:常量表达式是必需的,但它是常量
2021-02-26 16:52:16见§15.28常量表达式的规格常数表达式1..这指的是§4.12.4最后变量它将“常量变量”定义为:我们称一个变量为原始类型或类型字符串,它是最终变量,并使用编译时常量表达式(§15.28)初始化为常... -
java – Enum中的常量表达式
2021-04-22 16:50:34我将表达式Index.values()[getIndex()]封装到类似于valueOf(int index)的枚举方法中,类似于默认的valueOf(String s).然后,您还可以在那里处理有效的数组索引检查(例如,如果索引超出范围,则返回特殊的枚举值).同样,... -
需要常量表达式? (Java switch语句)
2021-07-16 20:46:53I have no idea what is causing this error. My teacher and I went over it and couldn't find what was wrong.import java.util.Scanner;public class MailAssignment{public static void main(String [] args){S... -
常量表达式和运算符
2021-01-01 20:54:05常量表达式和运算符 通过学习了常量和运算符后,我感觉这些代码的解释和我们以前学过的数学相像,比如常量和变量,这些都是数学中常用的名词,学习了这些新知识后我总结了以下知识点: JAVA中的常量 常量就是指在... -
C++11:常量表达式
2019-12-08 09:59:18常量表达式主要是允许一些计算发生在编译时,即发生在代码编译阶段而不是代码运行阶段。这是很大的优化,因为如果有些事情可以在编译时做,那么它只会做一次,而不是每次程序运行时都计算。 使用constexpr,你可以... -
C++知识整理系列(三)—— constexpr常量表达式
2021-07-20 16:12:50常量表达式(const expression):指值不会改变并且在编译阶段过程就能得到计算结果的表达式。 以下两种是常量表达式: const int maxSize = 10; const int limit = maxSize + 1; 以下两种不是常量表达式: int ... -
switch case语句错误:case表达式必须是常量表达式
2021-02-28 09:54:50但是当我今天早些时候运行代码时,eclipse给了我一个错误,用红色突出显示case语句并说:case表达式必须是常量表达式,它是常量我不知道发生了什么。这是我的代码如下:public void onClick(View src){switch(src.... -
常量表达式值 constexpr
2022-03-24 16:10:42通常情况下,常量表达式值必须被一个常量表达式赋值,而跟常量表达式函数一样,常量表达式值在使用前必须被初始化。 一、常量表达式 1.1 运行时常量性与编译时常量性 在C++中,我们常常会遇到常量的概念。常量表示该... -
C struct object Stack – 在常量表达式中不允许函数调用(错误)
2021-05-20 01:53:51我正在尝试创建一个struct对象(堆栈),它包含:typedef struct node {int val;struct node * next;}node_t;typedef struct {node_t * top;int max_size;int used_size;} Stack;但是,当我尝试初始化对象并使用以下函数... -
“this”不能在常量表达式中使用报错的解决方法
2021-11-15 23:35:30“this”不能在常量表达式中使用报错的解决方法 问题描述与思考 在用C++书写下面一段代码时,编译器报错”’this‘不能在常量表达式中使用“。在这里,我最开始觉得是const int型变量有可能不能用来定义数组,只能用... -
Java switch语句:需要常量表达式,但它是常量
2021-03-11 14:46:20所以,我正在这个类有几个静态常量:public abstract class Foo {...public static final int BAR;public static final int BAZ;public static final int BAM;...}然后,我想要一种方法来获得基于常量的相关字符串:... -
关于java:switch case语句错误:case表达式必须是常量表达式
2021-03-21 10:56:32但是当我今天早些时候运行代码时,eclipse给了我一个错误,用红色突出显示case语句并说:case表达式必须是常量表达式,它是常量我不知道发生了什么。 这是我的代码如下:public void onClick(View src){switch(src.... -
Android studio:错误: 需要常量表达式
2020-05-17 18:15:37最近将一个项目作为library,通过import Moudle导入一个新项目引用时,爆出这个错误:需要常量表达式,定位到switch。于是百度一下,解决方法为把switch case,改成if else,即: @Override public boolean ... -
常量表达式和非常量表达式
2019-07-09 14:37:33常量表达式:表达式就是由常量组成的,这时如果计算结果发生溢出,编辑器是会有下划线提醒的。 int x = 2147483647 + 10; 非常量表达式:表达式由一个或者多个非常量组成的,这时发生溢出是不会提醒的,使用... -
冒泡排序 error C2057: 应输入常量表达式
2021-05-22 01:55:47一维数组的定义方式为:类型说明符 数组名 [常量表达式];其中,类型说明符是任一种基本数据类型或构造数据类型。数组名是用户定义的数组标识符。方括号中的常量表达式表示数据元素的个数,也称为数组的长度。注意:... -
常量表达式和constexpr
2021-06-30 11:49:491、常量表达式是指值不会改变并且在编译过程就能得到计算结果的表达式,如下: const int max_i= 5; //max_i 是常量表达式 int max_i = 5 //max_i不是常量表达式 const int max_i = get_size(); //max_i不是常量... -
VISP编译中出现“函数调用在常量表达式中必须含有常量值”的问题
2021-03-05 16:53:56VISP编译中出现“函数调用在常量表达式中必须含有常量值”的问题问题原因解决小结 问题 在Visp的编译过程中出现“函数调用在常量表达式中必须含有常量值”的错误 主要的错误语句为 vpRealSense2 g[type_serial_nb.... -
在switch语句中,每一个case的常量表达式的值必须互不相同。()
2021-05-22 03:33:01密集安部他特型的国务规定的大人员和其场所程院公殊建设工,常量单位核防设应当建设将消计文件报送()审。序能力指良品率求工数不,工序情况能力分析,为5样本均值。图说直方正确对于的是法不以下。某零求长度为寸要... -
实现为C ++ 14常量表达式的编译时C编译器-C/C++开发
2021-05-26 22:26:22constexpr-8cc:编译时C编译器constexpr-8cc是作为C ++ 14常量表达式实现的编译时C编译器。 这使您可以在编译时进行编译! 该项目是基于ELVM Infrastructu constexpr-8cc构建的8cc端口:编译时C编译器constexpr-8cc... -
java – switch case语句错误:case表达式必须是常量表达式
2021-03-21 10:55:45在常规的Android项目中,资源R类中的常量声明如下:public static final int main=0x7f030004;但是,从ADT 14开始,在库项目中,它们将被声明为:public static int main=0x7f030004;换句话说,常量在库项目中不是... -
常量表达式概念与用处
2017-12-30 21:13:131)什么叫常量表达式? 在编译期间进行求值的表达式。 1、字面值常量是常量表达式;如123,‘a’,3.14等 2、用常量表达式初始化的const对象也是常量表达式。如int const a=5;语句中a就是常量表达式 2)...