^(* ̄(oo) ̄)^

  • 首页
  • 博客
  • 文档
  • 网盘
  • 仓库
  • 简介
Keep Learning
  1. 首页
  2. 博客
  3. 正文

C++开发 - 变量和基本类型

2024年3月17日 1307点热度

变量和基本类型

基本内置类型

算数类型

类型 含义 最小尺寸
bool 布尔类型 未定义
char 字符 8 位
wchar_t 宽字符 16 位
char16_t Unicode字符 16 位
char32_t Unicode字符 32 位
short 短整型 16 位
int 整型 16 位
long 长整型 32 位
long long 长整型 64 位
float 单精度浮点数 6 位有效数字
double 双精度浮点数 10 位有效数字
long double 扩展精度浮点数 10 位有效数字

char 为基本的字符类型,应可存放机器字符集中任意字符对应的数字。故char 的大小和一个机器字节相同。wchar_t、char16_t、char32_t用于扩展字符集,保证可存放机器扩展字符集中的字符。

整型可通过前置unsigned 关键字得到对应的无符号类型,默认整型类型都是带符号的。字符型被分为了三种:char、signed char 和 unsigned char。char 不等同于 signed char,char 尽管有三种,但实际上表现形式却只有两种,编译器会决定char 是带符号的或是不带符号的。

类型转换

  1. 算数类型->非布尔类型,非零为真,零为假。反之真为1,假为0。

  2. 浮点->整型,去小数点部分。

  3. 整数->浮点,小数部分为0。

  4. 无符号类型数值超范围时,值为类型最大值取模后的余数。 unsigned char c = -1 // c = 255

  5. 有符合数超范围时,值为未定义的(undefined)。

含有无符号的表达式(切勿混用)

无符号与有符号数运算后的值类型为无符号数。

#include <iostream>
int main() {
    unsigned u = 10;
    int i = -42;
    auto a = u+i;  // unsigned int
    std::cout << a << std::endl;
    return 0;
}
// 4294967264

字面值常量

20 十进制、0开头八进制、0x开头16进制。

指定字面值类型,字符和字符串字面值:

前缀 含义 类型
u Unicode 16 字符 char16_t
U Unicode 32 字符 char32_t
L 宽字符 wchar_t
u8 UTF-8 char0

整型字面值:

后缀 最小匹配类型
u or U unsigned
l or L long
ll or LL long long

浮点型字面值:

后缀 类型
f 或 F float
l 或 L long double

变量

变量定义

初始化:创建变量时赋予初始值。赋值:擦除对象当前值,以新值替代。

初始化的四种方式:

int a = 0;
int a = {0};
int a{0};
int a(0);

使用{}初始化的方式称为:列表初始化。使用列表初始化时,编译器会检查是否有存在丢失信息的风险,若存在则会报错,使用()会进行自动转换。

变量的声明与定义

c++支持分离式编译,允许将程序分割为若干文件,每个文件可独立编译。

声明:使此变量可被其他文件使用。定义:创建此变量关联的实际内容。

声明变量通过extern关键字,若声明的同时进行了初始化,此声明即为定义。变量只能被定义一次,但可以多次声明。故其他文件使用 i 时,只可声明(extern int i) 不可再次定义(int i)。

#include <iostream>
extern int i;   // 声明 i
int i;          // 声明并并定义 i
extern double pi = 3.14; // 定义
int main() {
    std::cout << i << std::endl;
    std::cout << pi << std::endl;
}
// 0
// 3.14

标识符

c++标识符由字母、数字和下划线组成。

关键字

alignas c++11:指定对象或类型的对齐方式 continue friend 友元,允许一个函数或类访问另一个类的私有成员 register 建议将变量存储在寄存器中 true
alignof 获取类型的对齐要求 decltype 获取表达式的类型 goto 无条件跳转 reinterpret_cast 强制类型转换 try
asm 嵌入汇编代码 default if return typedef
auto delete 删除对象或释放内存 inline 声明内联函数 short typeid 获取对象的类型信息
bool do int signed typename 在模板中使用,依赖名称是一个类型
break double long sizeof union
case dynamic_cast 在继承中进行动态类型转换 mutable 允许在 const 对象中修改成员 static unsigned
catch else namespace static_assert using
char enum new static_cast virtual 声明虚函数或在派生类中覆盖虚函数
char16_t explicit noexcept struct void
char32_t export 在C++11:已经废弃,曾用于模板的导出 nullptr switch volatile 指示变量可能在未经通知的情况下被修改
class extern operator 重载运算符 template 定义模板 wchar_t
const false private this while
constexpr float protected thread_local const_cast
for public throw

操作符替代名

and (&&) bitand (&) compl (~) not_eq (!=) **or_eq (|=) xor_eq (^=) 按位异或赋值
and_eq (&=) bit_or (|) not (!) or (||) xor (^) 按位异或

复合类型

复合类型是基于其他类型定义的类型。

引用

引用(这里指左值引用)为对象起了另一个名字,使用&d的形式来定义,d为声明的变量名。引用并非对象,只是为已存在的对象所起的另一个名字。

引用必须初始化,且只能绑定在对象上,不能与字面值或表达式结果绑定。

#include <iostream>
​
int main() {
    int val = 1024;
    int &refVal = val;
    std::cout << val << std::endl;
    std::cout << refVal << std::endl;
    refVal = 5; // 实际上是在修改绑定对象的值
    std::cout << val << std::endl;
    int i = refVal; // 实际上是获取绑定对象的值
    std::cout << i << std::endl;
}
// 1024
// 1024
// 5
// 5

指针

指针同引用类似,也实现了对其他对象的间接访问。但二者有很多不同之处:1.指针本身就是一个对象,允许对其赋值和拷贝,可先后指向不同对象。2.指针允许不赋初值,但这样会有一个不确定的值。

通过取地址符(操作符&)获取对象地址来存放。因引用不是对象,故无法定义指向引用的指针。

通过解引用符(操作符*)来访问对象。

指针的值(地址)应为下列4种状态之一:

  1. 指向一个对象。

  2. 指向紧邻对象所占空间的下一个位置。

  3. 空指针,意味着指针没有指向任何对象。

  4. 无效指针,也就是上述情况之外的其他值。

void* 指针

void* 指针是一种特殊的指针类型,可用于存放任意对象的地址。只能用于与别的指针比较、作为函数的输入或输出,或者赋给另一个void* 指针。不能操作void*指针所指的对象,因为不知其对象类型。

复合类型声明

int i = 1024, *p = &i, &r = i;
// i int, p int 指针, r int 引用
​
int* p1, p2;
// p1 int 指针, p2 int。 *仅修饰 p
​
int *p3, **pi;
// p3 int 指针, pi 指向 int 指针 的指针
标签: c++
最后更新:2024年3月17日

九州安所如

程序员

点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

COPYRIGHT © 2023 zhu

鲁ICP备2026022547号