# C++基础1-变量

本文是《C++ Primer Plus》的笔记,本文中的案例均自己实践过,如需转发请在转发开头贴上原文地址,谢谢!

# 预编译指令

# #define 宏定义

//无参宏定义
#define 宏名 宏内容
//带参宏定义
#define 宏名(参数列表) 宏内容
//取消宏定义
#undef 宏名

实例:打印出变量名字
#define printVarName(x) cout<<#x<<endl
1
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

比较常用的一种实例:

#ifndef 标识符
#define 标识符

#endif

//下面这句也能实现
#pragma once
1
2
3
4
5
6
7

解决包含冲突的问题,比如两个头文件都包含了一个头文件,而这两个头文件又被同一个文件包含。

# 包含头文件指令

#include <头文件>
#include "头文件"
1
2

<>直接从编辑器的标准函数库中查找
""先从当前文件夹中寻找,如果找不到再去标准函数库中查找

# C和C++头文件区别

C语言的的传统是头文件使用扩展名.h,但在新的C++中头文件没有扩展名,原有C的头文件去掉了后缀.h,并在文件名前加了c(表明来自C语言)。
C++98之前C++头文件也是带有.h后缀的,之后规定头文件不使用后缀,且包含命名空间。所示使用的时候需要using namespace XX;

# 变量

# 命令规则

  1. 名称中只能使用字母字符,数字和下划线。
  2. 名称的第一个字符不能是数字。
  3. 区分大写字符和小写字符。
  4. 不能将C++的关键字用作名称。
  5. 最好不要用两个下划线或者一个下划线开头。

# 变量类型

# 整型

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
类型 长度(字节)
short 2
int 4
long 4
long long 8

注意

  1. unsigned 能表示的数要比signed大一倍
  2. 通常来说,int被设置为对目标计算机处理效率最高的长度。
  3. C++能够以不同进制书写数,正常是十进制,以0开头是八进制,以0x或者0X开头为十六进制。
  4. 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
类型 长度(字节)
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

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

浮点类型有两种表示方式:第一种是正常小数点表示,第二种是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

# 类型转换

在这些情况下c++自动进行类型转换:

  1. 将一种算术类型的值赋值给另一种算术类型的变量。
    值被转换为接收变量的类型。
  2. 表达式中包含不同的类型。
    1. bool,char,short类型出现时先转换成int。
    2. 将低范围的类型转换成表达式中高范围的类型。
      1. 优先级是long double > double > float。
      2. 如果操作是整形先进行整型提升,比如bool,char,unsigned char,signed char,short,unsigned short自动转换为int。
      3. 如果两个操作数都是有符号或无符号的,但级别不一样,将低级别转换成高级别。
      4. 如果一个为有符号,一个为无符号,且无符号操作数的级别比有符号级别高,将有符号操作数转换为无符号操作数。否则,如果有符号类型可表示无符号类型的所有可能取值,则将无符号操作数转换为有符号操作数。否则,将两个操作数都转换为有符号类型的无符号版本。
  3. 将参数传递给函数时。
    1. 对char或者short(signed或unsigned)应用整数提升。
    2. float类型提升为double。

# 强制类型转换

//c style
(typename) value
//c++ style
typename (value)

static_cast<typename>(value)
1
2
3
4
5
6

# 类型别名

c++中为类型建立别名有两种方式:

  1. #define const char * str1;
  2. 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