# C++基础1-变量
本文是《C++ Primer Plus》的笔记,本文中的案例均自己实践过,如需转发请在转发开头贴上原文地址,谢谢!
# 预编译指令
# #define 宏定义
//无参宏定义
#define 宏名 宏内容
//带参宏定义
#define 宏名(参数列表) 宏内容
//取消宏定义
#undef 宏名
实例:打印出变量名字
#define printVarName(x) cout<<#x<<endl
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
宏名一般用大写字母表示
定义有参宏时,参数列表必须用小括号括起来并且小括号和宏名之间不能有空格
# 条件预编译指令
//表达式为真执行1,否则执行2
#if 表达式
程序段1
#else
程序段2
#endif
//如果定义了标识符执行1,否则执行2
#ifdef 标识符
程序段1
#else
程序段2
#endif
//如果没有定义标识符执行1,否则执行2
#ifndef 标识符
程序段1
#else
程序段2
#endif
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
比较常用的一种实例:
#ifndef 标识符
#define 标识符
#endif
//下面这句也能实现
#pragma once
1
2
3
4
5
6
7
2
3
4
5
6
7
解决包含冲突的问题,比如两个头文件都包含了一个头文件,而这两个头文件又被同一个文件包含。
# 包含头文件指令
#include <头文件>
#include "头文件"
1
2
2
<>直接从编辑器的标准函数库中查找
""先从当前文件夹中寻找,如果找不到再去标准函数库中查找
# C和C++头文件区别
C语言的的传统是头文件使用扩展名.h,但在新的C++中头文件没有扩展名,原有C的头文件去掉了后缀.h,并在文件名前加了c(表明来自C语言)。
C++98之前C++头文件也是带有.h后缀的,之后规定头文件不使用后缀,且包含命名空间。所示使用的时候需要using namespace XX;
# 变量
# 命令规则
- 名称中只能使用字母字符,数字和下划线。
- 名称的第一个字符不能是数字。
- 区分大写字符和小写字符。
- 不能将C++的关键字用作名称。
- 最好不要用两个下划线或者一个下划线开头。
# 变量类型
# 整型
C++规定了类型的最短长度,short至少16位,long至少32位,long long 至少64位。
在一个64位Win10上运行:
short a;
int b;
long c;
long long d;
cout << sizeof(a) << endl;
cout << sizeof(b) << endl;
cout << sizeof(c) << endl;
cout << sizeof(d) << endl;
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
类型 | 长度(字节) |
---|---|
short | 2 |
int | 4 |
long | 4 |
long long | 8 |
注意
- unsigned 能表示的数要比signed大一倍
- 通常来说,int被设置为对目标计算机处理效率最高的长度。
- C++能够以不同进制书写数,正常是十进制,以0开头是八进制,以0x或者0X开头为十六进制。
- cout提供了dec,hex和oct来以不同进制显示数据。
# 字符型
char a;
wchar_t b;
char16_t c;
char32_t d;
cout << sizeof(a) << endl;
cout << sizeof(b) << endl;
cout << sizeof(c) << endl;
cout << sizeof(d) << endl;
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
类型 | 长度(字节) |
---|---|
char | 1 |
wchar_t | 2 |
char16_t | 2 |
char32_t | 4 |
# bool类型
int a = true;
int b = false;
cout << a << endl;
cout << b << endl;
1
2
3
4
5
2
3
4
5
a等于1,b等于0。
# 浮点类型
float a;
double b;
long double c;
cout << sizeof(a) << endl;
cout << sizeof(b) << endl;
cout << sizeof(c) << endl;
1
2
3
4
5
6
7
2
3
4
5
6
7
浮点类型有两种表示方式:第一种是正常小数点表示,第二种是E表示法,比如-31415E-4。
c++规定float至少32位,double至少48位。
类型 | 长度(字节) |
---|---|
float | 4 |
double | 8 |
long double | 8 |
浮点类型常量应该如何书写?默认情况下是double类型,以f或者F为后缀则为float类型,以l或者L为后缀的则是long double类型。
浮点数可以表示整数之间的值,由于有缩放因子可以表示的范围大的多。但是浮点运算速度通常比整形慢,且精度降低。比如:
float a = 2.34E+22f;
float b = a + 1.0f;
cout << b << endl;
cout << b - a << endl;
1
2
3
4
5
2
3
4
5
# 类型转换
在这些情况下c++自动进行类型转换:
- 将一种算术类型的值赋值给另一种算术类型的变量。
值被转换为接收变量的类型。 - 表达式中包含不同的类型。
- bool,char,short类型出现时先转换成int。
- 将低范围的类型转换成表达式中高范围的类型。
- 优先级是long double > double > float。
- 如果操作是整形先进行整型提升,比如bool,char,unsigned char,signed char,short,unsigned short自动转换为int。
- 如果两个操作数都是有符号或无符号的,但级别不一样,将低级别转换成高级别。
- 如果一个为有符号,一个为无符号,且无符号操作数的级别比有符号级别高,将有符号操作数转换为无符号操作数。否则,如果有符号类型可表示无符号类型的所有可能取值,则将无符号操作数转换为有符号操作数。否则,将两个操作数都转换为有符号类型的无符号版本。
- 将参数传递给函数时。
- 对char或者short(signed或unsigned)应用整数提升。
- float类型提升为double。
# 强制类型转换
//c style
(typename) value
//c++ style
typename (value)
static_cast<typename>(value)
1
2
3
4
5
6
2
3
4
5
6
# 类型别名
c++中为类型建立别名有两种方式:
- #define const char * str1;
- typedef const char * str2;
在下列场景这两种方式还是有细微差别的:
#define str1 const char *
typedef const char * str2;
str1 a = "hi", b = "world"; //这句会出错
str2 c = "hello",d="world";
1
2
3
4
5
2
3
4
5