变量作用域
作用域是程序的一个区域,一般来说有三个地方可以定义变量:
1.在函数或一个代码块内部声明的变量,称为局部变量。
2.在函数参数的定义中声明的变量,称为形式参数。
3.在所有函数外部声明的变量,称为全局变量。
局部变量和全局变量的名称可以相同,
但是在函数内,局部变量的值会覆盖全局变量的值。
#include <iostream>
using namespace std;
int a;//全局变量
int main ()
{
// 局部变量声明
int a=10, b;
int c;
// 实际初始化
a = 10;
b = 20;
c = a + b;
cout << c;
return 0;
}
输出 10
初始化局部变量和全局变量
当局部变量被定义时,系统不会对其初始化,您必须自行对其初始化。
定义全局变量时,系统会自动初始化为下列值
int 0
char 0
float 0
double 0
pointer NULL 0
常量
整数常量
整数常量可以是十进制、八进制或十六进制的常量。
前缀指定基数:0x 或 0X 表示十六进制,0 表示八进制,不带前缀则默认表示十进制。
整数常量也可以带后缀是 U 和 L 的组合,U 表示无符号整数(unsigned),L 表示长整数(long)。
后缀可以是大写,也可以是小写,U 和 L 的顺序任意。
常量
212 // 合法的
215u // 合法的
0xFeeL // 合法的
078 // 非法的:8 不是八进制的数字
032UU // 非法的:不能重复后缀
85 // 十进制
0213 // 八进制
0x4b // 十六进制
30 // 整数
30u // 无符号整数
30l // 长整数
30ul // 无符号长整数
//浮点类型
3.14159 // 合法的
314159E-5L // 合法的
510E // 非法的:不完整的指数
210f // 非法的:没有小数或指数
.e55 // 非法的:缺少整数或分数
修饰符类型
C++ 允许在 char、int 和 double 数据类型前放置修饰符。
修饰符用于改变基本类型的含义,所以它更能满足各种情境的需求。
1.数据类型修饰符
下面列出了数据类型修饰符:
signed
unsigned
long
short
修饰符 signed、unsigned、long 和 short 可应用于整型
修饰符 signed 和 unsigned 可应用于字符型
修饰符 long 可应用于双精度型
修饰符 signed 和 unsigned 也可以作为 long 或 short 修饰符的前缀 例如:unsigned long int。
C++ 允许使用速记符号来声明无符号短整数或无符号长整数。
您可以不写 int,只写单词 unsigned、short 或 unsigned、long,int 是隐含的。
例如,下面的两个语句都声明了无符号整型变量。
unsigned x;
unsigned int y;
2.无有符号整数之间的差别 demo
#include <iostream>
using namespace std;
/*
*- 这个程序演示了有符号整数和无符号整数之间的差别
*/
int main()
{
short int i; // 有符号短整数
short unsigned int j; // 无符号短整数
j = 50000;
i = j;
cout << i << " " << j;
return 0;
}
输出 i 为-15536 j 为50000
无符号短整数 50,000 的位模式被解释为有符号短整数 -15,536。
3.类型限定符
const
const 类型的对象在程序执行期间不能被修改改变。
volatile
修饰符 volatile 告诉编译器不需要优化volatile声明的变量,让程序可以直接从内存中读取变量。
对于一般的变量编译器会对变量进行优化,将内存中的变量值放在寄存器中以加快读写效率。
restrict
由 restrict 修饰的指针是唯一一种访问它所指向的对象的方式。
只有 C99 增加了新的类型限定符 restrict。
存储类
1.存储类定义
C++ 程序中变量/函数的范围(可见性)和生命周期。这些说明符放置在它们所修饰的类型之前。
2.存储类列表
auto
register
static
extern
mutable
thread_local (C++11)
从 C++ 17 开始,
auto 关键字不再是 C++ 存储类说明符,
且register 关键字被弃用。
3.static 存储类
static 存储类指示编译器
在程序的生命周期内保持局部变量的存在,
而不需要在每次它进入和离开作用域时进行创建和销毁。
因此,使用 static 修饰局部变量可以在
函数调用之间保持局部变量的值。
static 修饰符也可以应用于全局变量。
当 static 修饰全局变量时,
会使变量的作用域限制在声明它的文件内。
在 C++ 中,当 static 用在类数据成员上时,
会导致仅有一个该成员的副本被类的所有对象共享。
4.extern 存储类
extern 存储类用于提供一个全局变量的引用,
全局变量对所有的程序文件都是可见的。
当您使用 'extern' 时,对于无法初始化的变量,
会把变量名指向一个之前定义过的存储位置。
当您有多个文件且定义了一个可以在其他文件中
使用的全局变量或函数时,
可在其他文件中使用 extern 来得到已定义的变量或函数的引用。
可以这么理解,extern 是用来在另一个文件中
声明一个全局变量或函数。
extern 修饰符通常用于当有两个或多个文件
共享相同的全局变量或函数的时候
运算符
重点 1. 位运算符
二进制 转换
A = 60,且 B = 13
A = 0011 1100
B = 0000 1101
左边第一位为正负
二进制转换 最右边开始2的0123456次方
A&B = 0000 1100 得12 取交集元素
A|B = 0011 1101 得61 取所有的1
A^B = 0011 0001 得-49 取1的非交集
~A = 1100 0011 得-61 翻转,0为1,1为0
A << 2 = 1111 0000 得240 左移移动,右边的补0
A >> 2 = 0000 1111 得15 右移运算符,左边的补0
& 解释: 如果同时存在于两个操作数中,取1,不同时存在取0
| 解释: 如果存在于任一操作数中1, 取1
^ 解释: 两个操作数相同的元素得0;不同的取1
~ 解释: 补码运算符是一元运算符,全部翻转,0为1,1为0
<< 解释: 左移运算符。左操作数的值向左移动右操作数位数。
>> 解释: 右移运算符。左操作数的值向右移动右操作数位数。
2.赋值运算符
<<= 左移且赋值运算符 C <<= 2 等同于 C = C << 2
>>= 右移且赋值运算符 C >>= 2 等同于 C = C >> 2
&= 按位与且赋值运算符 C &= 2 等同于 C = C & 2
^= 按位异或且赋值运算符 C ^= 2 等同于 C = C ^ 2
|= 按位或且赋值运算符 C |= 2 等同于 C = C | 2
3.杂项运算符
sizeof sizeof 运算符返回变量的大小。
例如,sizeof(a) 将返回 4,其中 a 是整数。
Condition Condition ? X : Y 条件运算符。
如果 Condition 为真 ? 则值为 X : 否则值为 Y。
, 逗号运算符会顺序执行一系列运算。
整个逗号表达式的值是以逗号分隔的列表中的最后一个表达式的值。
.(点)和 ->(箭头)
成员运算符用于引用类、结构和共用体的成员。
Cast 强制转换运算符把一种数据类型转换为另一种数据类型。
例如,int(2.2000) 将返回 2。
& 指针运算符 & 返回变量的地址。
例如 &a; 将给出变量的实际地址。
* 指针运算符 * 指向一个变量。
例如,*var; 将指向变量 var。
4.运算符优先级
下表将按运算符优先级从高到低列出各个运算符
后缀: () [] -> . ++ - -
一元 + - ! ~ ++ - - (type)* & sizeof
乘除 * / %
加减 + -
移位 << >>
关系 < <= > >=
相等 == !=
位与 AND &
位异或 XOR ^
位或 OR |
逻辑与 AND &&
逻辑或 OR ||
条件 ?:
赋值 = += -= *= /= %=>>= <<= &= ^= |=
逗号 ,