C++的字面值和字面值类型

一个形如42的值被称为字面值常量。字面值常量的形式和值决定了常量的类型。例如0x42是16进制表示的整型常量。‘a‘是char型字面值。字
面值常量顾名思义由字面意思表示,是常量。字面值常量在程序中是直接表示的,整型直接写出大小,字符直接写出字符。一个字面值常量在编译时被直接解析为立
即数,编译器内部维护字面值常量的类型。

常量表达式是指在编译过程中,该表达式的值不会改变,且编译过程中可以立即得到结果的表达式。一部分const对象是常量表达式,由常量表达式初始化的
const对象也是常量表达式。常量表达式在程序运行时不会改变,即使一个程序多次启动或外部参数发生变化,该值也不会改变。编译器在编译时可能把常量表
达式直接替换为立即数,具体要看编译环境。一般来讲,字面值常量属于常量表达式。

C++中允许将变量声明为constexpr类型以使编译器在编译时检查该变量是否是常量表达式。声明为constexpr的变量一定是常量表达式。且初始化必须用常量表达式。

例如:

const int a = 12;    a是常量表达式

const int b = a+1;  b也是常量表达式

const int c = getsize();   c不是常量表达式,编译器编译时无法确知getsize()的执行结果。

constexpr int c = getsize();  将会报错

字面值类型是指编译时就能得到结果的类型,具体包括算术类型、引用和指针。自定义类、IO类不属于该类型。字面值类型的对象有严格的要求,字面值类型是那
些具有常量表达式属性的对象的类型。例如:字面值常量是算术类型。对于引用和指针,其限定比较严格。不是所有的指针都是常量表达式。只有那些在编译时就确
定地址指向的指针才是常量表达式,引用同理。因此nullptr、NULL、指向固定地址的指针是字面值类型。那么,如何判断指针是否指向固定地址呢?

程序在内存中的组织形式是段,有堆栈段、数据段和代码段。对于数据指针指向数据,函数指针则指向某个代码。


于定义在函数体外的变量,其指针是constexpr的;此类变量要占用数据段,而程序运行时,代码段和数据段大小位置均不会改变,因此编译器可以确定地
址指向,是constexpr的。此外,函数内部定义的static静态变量,也会在数据区使用固定地址,因此指针也是constexpr的。对于定义在
函数内部的变量,由于要在栈中开辟内存空间,而栈的情况要看程序运行状态,因此这类变量没有确定的地址,其指针不是constexpr的。代码段不会改
变,函数指针也是constexpr的。

时间: 2024-10-14 20:56:51

C++的字面值和字面值类型的相关文章

C++字面值的类型

字符和字符串字面值 前缀 含义 类型 u Unicode 16 字节 char16_t U Unicode 32 字节 char32_t L 宽字符 wchar_t u8 UTF-8 char 整型字面值 后缀 最小匹配类型 u or U unsigned l or L long ll or LL long long 浮点型字面值 后缀 类型 f or F float l or L long double

C++中的字面值指定类型

C++中只有内置类型存在字面值,没有类(class)类型字面值.例如:0是int类型的字面值,3.14159是double类型的字面值. 字面值类型很多 整型浮点字面值 20                     // decimal   十进制 024                   //  octal     八进制 0X14                 //   hexadecimal     十六进制 128u ,128U        //    unsigned 1024U

Java基础-字面值

在Java源代码中,字面值用于表示固定的值(fixed value).数值型的字面值是最常见的,字符串字面值可以算是一种,当然也可以把特殊的null当做字面值.字面值大体上可以分为整型字面值.浮点字面值.字符和字符串字面值.特殊字面值. 1. 整型字面值 从形式上看是整数的字面值归类为整型字面值.例如: 10, 100000L, 'B'.0XFF这些都可以称为字面值.整型字面值可以用十进制.16.8.2进制来表示.十进制很简单,2.8.16进制的表示分别在最前面加上0B(0b).0.0X(0x)

网络编程中的常见陷阱之 0x十六进制数(C++字面值常量)

十六进制数相等的推断 请问例如以下程序的输出是神马? #include <iostream> #include <string> using namespace std; int main (int, char *[]) { char s[1]={0}; s[0] = 0xfe; if (s[0] == 0xfe) { cout<<"=="<<endl; } else { cout<<"!="<<

C语言的 (强制类型转换) 以及 &#39;字符字面值&#39;

C语言的显式/隐式类型转换,都有一个中间变量的存在,原数据的类型.内容都不变. 以下代码,都用GCC编译. 1 #include<stdio.h> 2 3 int main() 4 { 5 printf("%d %d\n", 'a', sizeof((int)'a')); //输出为97,4. sizeof的作用对象为一个int型中间变量 6 7 char c = 255; 8 printf("%d\n", c); //输出-1. char型的c已溢出,

一、变量和基本类型

1.基本内置类型 C++定义了一套包括算术类型(整型.字符.布尔型.浮点型)和空类型在内的基本数据类型.算术类型的尺寸,即所占比特数,在不同机器上有所差别. 除了布尔型和扩展的字符型之外,整型划分为带符号的和无符号的unsigned. 当在程序的某处使用了一种算术类型的值而其实所需的是另一种类型的值时,编译器会执行类型转换.当表达式既有带符号类型又有无符号类型,当带 符号类型取值为负时会出现异常结果,因为带符号数会自动地转换成无符号数. 一个形如42的值被称作字面值常量,这样的值一望而知.都对应

C++_系列自学课程_第_3_课_变量和基本类型_《C++ Primer 第四版》

最近复习C++相关内容,决定在这里记录自己复习的过程. 以前写过部分文字,但是没有坚持连续写,因此学完后 基本又忘光啦,主要是没有实践,这一次决定自学完后,在这里在复习一遍增强自己的记忆和理解程度. 一.基本内置类型 C++语言内置了一些数据类型,主要有两大类: 整型和浮点型. 整型又有:  bool型.char型.wchar_t型.short型,int型,long int型. 浮点型有: float型, double型.long double型(扩展双精度型). 我们知道不同的数据类型决定了不

Swift之类型安全和类型推断

Swift是一种类型安全的语言.类型安全的语言鼓励推荐在你代码中的值尽量要清楚其所属的类型.如果在你的代码中有一个预先好的字符串,你就不能错误地把他传递或者赋值给一个整数. 因为Swift是类型安全的,当编译你的代码时就会做类型检测并且以错误的方式标识出所有的不匹配的类型.这样使你能够在开发过程中捕获尽早的定位错误. 类型检测能帮助你避免你在不同类型之间工作时出现错误,这意并不意味着你必须为每一个声明的常量和变量指定一个明确的类型.如果你不为你需要的值指定类型,Swift就会用类型推断来计算出其

【深入.NET平台】浅谈.NET Framework基元类型

什么是基元类型? 初学者可能很少听说过这个名词,但是平时用得最多的肯定是基元类型.先看下面两行代码: System.Int32 a = 5; int a = 5;  上面两行代码都表示声明一个int类型的变量,但在平时写代码的时候我们一般用的是第二种方式.第二种方式不仅简洁.易读,而且生成的IL代码和第一种完全一致.像这种编译器直接支持的数据类型就称为基元类型.类似的还有double.bool.long.string等. 基元类型与.NET框架类库的关系 在我接触的第一份面试题中,我记得有这么一