常量
整数常量
十进制、八进制或十六进制的常量。前缀指定基数:0x 或 0X 表示十六进制,0 表示八进制,不带前缀则默认表示十进制。
补一个小知识点:二进制,八进制,十进制,十六进制的相互转换
![](https://i-blog.csdnimg.cn/blog_migrate/c8595665a29b0651f98cf4f7bf43b046.png)
![](https://i-blog.csdnimg.cn/blog_migrate/f873ab95a9119e448b8892767a197dc8.png)
就是次幂。
![](https://i-blog.csdnimg.cn/blog_migrate/3a3051056864216081724cd9c4d34644.png)
![](https://i-blog.csdnimg.cn/blog_migrate/c751e1f9a701311d47c1e2973911ebb9.png)
![](https://i-blog.csdnimg.cn/blog_migrate/48c10006a2c382c88ff3041c1bb67696.png)
就是连除
![](https://i-blog.csdnimg.cn/blog_migrate/b7be4b518a0cae19e0abaeef6f6ec485.png)
就是根据二的次幂进行转化
浮点常量
浮点常量由整数部分、小数点、小数部分和指数部分组成。
eg:
3.14159 // 合法的
314159E-5L // 合法的
510E // 非法的:不完整的指数
210f // 非法的:没有小数或指数
.e55 // 非法的:缺少整数或分数
布尔常量
布尔常量共有两个,它们都是标准的 C++ 关键字:
true 值代表真。
false 值代表假。
我们不应把 true 的值看成 1,把 false 的值看成 0。
字符常量
![](https://i-blog.csdnimg.cn/blog_migrate/5a94015ea60cc073fb7e73360ddf73bd.jpeg)
字符串常量
字符串字面值或常量是括在双引号 "" 中的。一个字符串包含类似于字符常量的字符:普通的字符、转义序列和通用的字符。
可以使用 \ 做分隔符,把一个很长的字符串常量进行分行。
定义常量
两种简单的定义常量的方式:
使用 #define 预处理器。
使用 const 关键字。
#define 预处理器
#define 预处理器定义常量的形式:
#define identifier value
eg:
#include <iostream>
using namespace std;
#define LENGTH 10
#define WIDTH 5
#define NEWLINE '\n'
int main()
{
int area;
area = LENGTH * WIDTH;
cout << area;
cout << NEWLINE;
return 0;
}
const关键字
用const前缀声明指定类型常量格式:
const type variable = value;
eg:
#include <iostream>
using namespace std;
int main()
{
const int LENGTH = 10;
const int WIDTH = 5;
const char NEWLINE = '\n';
int area;
area = LENGTH * WIDTH;
cout << area;
cout << NEWLINE;
return 0;
}
修饰符类型
修饰符用于改变基本类型的含义,更能满足各种情境的需求。
下面列出了数据类型修饰符:
signed
unsigned
long
short
修饰符 signed、unsigned、long 和 short 可应用于整型,signed 和 unsigned 可应用于字符型,long 可应用于双精度型。
修饰符 signed 和 unsigned 也可以作为 long 或 short 修饰符的前缀。例如:unsigned long int。
C++ 允许使用速记符号来声明无符号短整数或无符号长整数。可以不写 int,只写单词 unsigned、short 或 long,int 是隐含的。例如,下面的两个语句都声明了无符号整型变量。
unsigned x;
unsigned int y;
eg:
#include <iostream>
using namespace std;
// 这个程序演示了有符号整数和无符号整数之间的差别
int main()
{
short int i; // 有符号短整数
short unsigned int j; // 无符号短整数
j = 50000;
i = j;
cout << i << " " << j;
return 0;
}
当上面的程序运行时,会输出下列结果:
-15536 50000
上述结果中,无符号短整数 50,000 的位模式被解释为有符号短整数 -15,536。
类型限定符
![](https://i-blog.csdnimg.cn/blog_migrate/27f80c53de10e544163e52ba8c6e4ef2.png)
存储类
存储类定义 C++ 程序中变量/函数的范围(可见性)和生命周期。这些说明符放置在它们所修饰的类型之前。下面列出 C++ 程序中可用的存储类:
auto
register
static
extern
mutable
thread_local (C++11)
从 C++ 17 开始,auto 关键字不再是 C++ 存储类说明符,且 register 关键字被弃用。【故不介绍了】
static 存储类
static 存储类指示编译器在程序的生命周期内保持局部变量的存在,而不需要在每次它进入和离开作用域时进行创建和销毁。因此,使用 static 修饰局部变量可以在函数调用之间保持局部变量的值。
static 修饰符也可以应用于全局变量。当 static 修饰全局变量时,会使变量的作用域限制在声明它的文件内。
在 C++ 中,当 static 用在类数据成员上时,会导致仅有一个该成员的副本被类的所有对象共享。
#include <iostream>
// 函数声明
void func(void);
static int count = 10; //全局变量
int main()
{
while(count--)
{
func();
}
return 0;
}
// 函数定义
void func( void )
{
static int i = 5; // 局部静态变量
i++;
std::cout << "变量 i 为 " << i ;
std::cout << " , 变量 count 为 " << count << std::endl;
}
extern 存储类
extern 存储类用于在另一个文件中声明一个全局变量或函数。
extern 修饰符通常用于当有两个或多个文件共享相同的全局变量或函数的时候。
eg:
第一个文件:main.cpp
#include <iostream>
int count ;
extern void write_extern();
int main()
{
count = 5;
write_extern();
}
第二个文件:support.cpp
#include <iostream>
extern int count;
void write_extern(void)
{
std::cout << "Count is " << count << std::endl;
}
mutable 存储类
mutable 说明符仅适用于类的对象。它允许对象的成员替代常量。mutable 成员可以通过 const 成员函数修改。
thread_local 存储类
使用 thread_local 说明符声明的变量仅可在它在其上创建的线程上访问。 变量在创建线程时创建,并在销毁线程时销毁。 每个线程都有其自己的变量副本。
thread_local 说明符可以与 static 或 extern 合并。
thread_local 仅应用于数据声明和定义,thread_local 不能用于函数声明或定义。
以下演示了可以被声明为 thread_local 的变量:
thread_local int x; // 命名空间下的全局变量
class X
{
static thread_local std::string s; // 类的static成员变量
};
static thread_local std::string X::s; // X::s 是需要定义的
void foo()
{
thread_local std::vector<int> v; // 本地变量
}