c++郑莉
变量
初始化
- {}列表初始化不允许有数据丢失
- 常量必须初始化
int a{1.2};//错
int b = {1.2};//错
int c(1.2);//对
符号常量
const float PI = 3.1415926;//code segment
static int a;//bss segment
内存 | 数据 |
---|---|
code segment | 通常情况下,代码段是可共享的,使其可共享的目的是,对于频繁被执行的程序,只需要在内存中有一份副本即可。代码段是只读的,使其只读的原因是防止一个程序意外地修改它的指令。 C程序的代码部分全部放在代码段。程序运行时由操作系统从程序映像中取出代码段,布局在程序的内存地址最低的区域,然后跳转到代码段的main函数开始运行程序,程序结束后由操作系统收回这段内存区域。 |
data segment | 已初始化数据段(data segment)用来存放C程序中的所有已赋值的全局变量和静态变量、对象 字符串常量一般放在 .rodata 段里 |
bss segment | 未初始化数据段(bss segment )用来储存C程序中所有为赋值的全局和静态变量。在程序映像中没有储存bss段,只有它们的空间大小信息;程序运行前由操作系统根据这个大小信息分配bss段,且数据值全部初始化为零,布局在与data段相邻的区域。程序结束后有操作系统回收这段内存区域。显然, bss 段的储存单元也有与程序代码相同的生命周期,但与data段不同的是如果城程序没有运行,bss 段的储存空间是不存在的,因而也就不会有初始值。在程序运行前,这些储存单元会被初始化为零。此后,bss 段的储存单元的性质完全与data段相同 |
stack | 栈(stack )用来存放C程序中所有的局部的非静态型变量、临时变量,包含函数形参和函数返回值。程序映像中没有栈,在程序开始运行时也不会分配栈。每当一个函数被调用,程序在栈段中按函数栈框架入栈,就分配了局部变量存储空间。如果这些变量有初始化,就会有赋值指令给这些变量送初值,否则变量的值就呈现随机性。当函数调用结束时,函数栈框架出栈,函数局部变量释放储存空间。 栈的储存特点决定了C程序中所有局部的非静态变量的储存方式是动态的。函数调用时得到分配,赋予初值;函数调用结束之后释放空间,变量不复存在。下次调用时在重复这一过程。 每一个栈分配的存储空间是比较小的,VS编译器一般默认大小为4kb,因此,局部变量分配的空间不能过大,否则会造成栈溢出,程序崩溃。比如定义一个长度很长的局部数组,这是不可取的。当然,程序员也可自行设定栈的大小。在VS编译器中,在“项目”->“属性”->“连接器”->“系统”页面中设定堆栈的大小。 |
heap | 堆(heap )用来存放C程序中动态分配的存储空间。程序映像中的没有堆,在程序开始运行时也不会分配堆,函数调用也不会分配堆。堆的存储空间分配和释放是通过指定的程序方式来进行的,即由程序员使用指令分配和释放,若程序员不释放,程序结束后可能由操作系统回收。 C语言程序可以通过使用指针、动态内存分配和释放函数来实现堆的分配和释放。程序可通过动态内存分配和释放来使用堆区,堆区有比栈更大的储存空间、更自由的使用方式。 堆和栈的共同点是动态储存,处于两个区域的储存单元可以随时分配和释放,所以这些储存单元的使用特点呈现临时使用的特点。data段的特点是静态储存的,处在这个区域的储存单元随程序运行而存在,随程序结束被释放,相对于程序生命周期,data段存储单元的使用特点呈现持久性的特点。data段由于持久占有储存空间,因此大小会被操作系统限定,而堆可以达到空闲空间的最大值。 堆和栈的不同是分配方式的不同,栈是编译器根据程序代码自动确定的大小,到函数调用时有指令自动完成分配和释放的;堆则完全由程序员指定分配大小、何时分配、何时释放。堆的优点是分配和释放是自由的,缺点是需要程序员自行掌握分配和释放的时机,特别是释放的时机,假如已经释放了还要引用堆会产生引用错误,或者始终没有释放会产生内存泄漏。 |
- 注意事项
- 不要通过指针引用其他函数的局部变量,否则得到的值将是一个随机的值
- 不要在函数中定义尺度过大的变量,比如长度很长的数组,否则会造成栈溢出
- 动态分配的内存空间被释放后,不能再引用,否则会出现引用错误。
- free函数只能释放动态创建的内存空间,如果释放非动态创建的内存空间,会出现错误
浮点数
- 都是近似存储,不能直接比较大小
- 一般用
double
,不用float
运算符
-
赋值运算符
=
- 表达式的值/类型同赋值运算符左边
-
逗号运算符
,
- 从左到右计算,计算结果为最右侧
- 优先级低于赋值运算符比如
a = 3 * 5, a * 4;//60
-
关系运算符
- < <= > >= 优先级高于 == !=
- 关系表达式结果为
bool
,值为true
false
-
逻辑运算符
- 优先级 !高于 && 高于 ||
- 结果为
bool
,值为true
false
- 具有短路特性
-
条件表达式
?
- 表达式1 ? 表达式2 :表达式3;
- 表达式1必须为布尔类型
- 先求解1
- 若1真,则求解表达式2,表达式2为最终结果;反之3
- 优先级高于赋值低于逻辑
-
sizeof
sizeof(short)
sizeof x;
- 类型名必须加括号
-
位运算
- 按位与
&
- 某一位置为0:
a = a & 0Xfffffffe;//int
- 取某些字节
a = a & 0xffff;//取int的低2个字节
- 某一位置为0:
- 按位或
|
- 将某些位置为1:
a = a | 0xff;
- 将某些位置为1:
- 按位异或
^
- 与0异或不变,与1异或反转
- 将某些位反转:
a = a ^ 0xff
;
- 按位取反
~
- 左移运算
<<
- 低位补0,高位舍去
- 右移运算
>>
- 低位舍弃
- 高位
- 无符号数补0
- 有符号数补符号位
- 按位与