Pascal 转 C++ 教程1
转自 https://blog.wind-flower.cn/2018/08/06/%E6%95%99%E7%A8%8B1/
C++ 程序结构、数据结构、语法、函数
一个标准的C++程序:
#include <cstdio>
#define maxn 1000 // 预处理指令
using namespace std;
int a[maxn]; // maxn被替换为1000
int main() { // 主函数
int n;
scanf("%d", &n);
for (int i = 0; i < n; i ++)
scanf("%d", &a[i]);
for (int i = 0; i < n; i ++)
printf("%d\n", a[i]);
return 0;
}
语法
花括号和分号
{
相当于Pascal中的begin,}
相当于Pascal中的end,语句和Pascal语言一样用;
分隔,一般一行写一条语句。
注释
C++中有两种方法使用注释(不编译的内容)。
//
后到行尾的内容为注释(和Pascal中的//一样)。
/*
和*/
中间的内容为注释,相当于Pascal中的{和}。
预处理指令(#开头)
头文件(#include)
宏定义(#define)
头文件
OI竞赛中会用到的标准头文件有两类:继承自C的头文件
和STL头文件
。C的头文件一般以c
开头,例如前面的cstdio
。
OI竞赛中可能会用到的头文件
- cstdio:包含读入输出相关函数,可以记为c+std(standard)+io(input&output)。一般来说这个头文件必然要包含。
- cstring:包含C-style字符串相关的函数。
- cmath:包含数学相关的函数。
- cstdlib:包括随机函数等。
- ctime:获取时间当做随机函数的种子。
- STL头文件:后面会详细介绍STL。
主函数
和Pascal中的主程序一样,是程序开始执行的地方。不同的地方是C++的主函数有返回值,类型为int
,并且正常结束时应该返回0。
在其他函数中,也可以用cstdlib
头文件中的函数exit(0)
直接退出整个程序,其中的参数0
表示的就是主函数返回值。
基本类型
- 整型
- 实型
- 字符型
- 布尔型
带符号整型
int、short、long、long long
int
和long
为32位带符号整型(Pascal中的longint),范围是-2^31~2^31-1
。short
为16位带符号整型(Pascal中的integer),范围是-2^15~2^15-1
。long long
为64位带符号整型(Pascal中的int64),范围是-2^63~2^63-1
。- int的最大值约为2.1×109,为
首选整型
类型。
无符号整型
在对应的带符号整型前面加上unsigned
,也就是unsigned int、unsigned short、unsigned long、unsigned long long。其中unsigned int
可以直接写为unsigned
。
无符号整型不能存储负数,但存储的最大值可以扩大一倍,例如unsigned的范围就是0~2^32-1。
实型、字符型和布尔型
- C++中有
float
、double
和long double
三种实型,精度依次递增,一般使用double
。 char
类型只能存储字符,计算机内部是用ASCII码
表示字符的,实际的范围是0~255
。字符常量使用单引号
包围的。bool
型只能为true
或false
。
各种类型占用的字节数
- 1字节:char、bool
- 2字节:short、unsigned short
- 4字节:int、unsigned、long、unsigned long、float
- 8字节:long long、unsigned long long、double
- 12字节:long double
各种类型的常量
- int类型的常量:2、100等(不需要任何后缀)
- double类型的常量:0.0、1.5、1e50等
- char类型的常量:’a’、’d’等(将字符夹在单引号间)
- bool类型的常量:true和false
- unsigned类型的常量:50u、50U(在非负整数后加上u或U后缀)
- long long类型的常量:1000ll、1000LL
其他进制的整型常量
- 十六进制前加0x前缀,例如0x100f、0x100F(大写小写均可)。
- 八进制前加0前缀,例如0144,它表示八进制的144,十进制的值是100。因此不要随便加多余的零,防止被当做八进制处理。
转义字符
某些特殊的字符可以用转义的方法表示。转义字符以反斜杠()开头,例如\n
。下面是比较常见的五种转义字符:
\n
换行\\
反斜杠\?
问号\'
单引号\"
双引号
定义基本类型的变量
- 定义变量的方式为类型名+变量名:
- int x1, y1;
- char x2, y2;
- double x3, y3;
- bool x4, y4;
- 定义变量时也可以直接指定初值:
- int a = 10;
- char b = ‘p’;
- double c = 1.2;
- long long d = 1000LL;
- bool e = true;
- 定义基本类型的变量
- C++语言几乎可以在程序的任何地方定义变量,但定义的变量只有在定义之后才能使用,如果在定义处之前就使用会给出编译错误。
隐式类型转换
- 假如将A类型的变量或常量赋值给B类型的变量,A类型就会被隐式地转换为B类型。
- 两个不同类型进行二元运算时,小类型也会被隐式转换成大类型以便运算。
int a = 100;
long long b = a;
// int类型的a被隐式转换为long long类型后赋值给b
double x = 1.5;
int y = 10;
double z = x * y;
// int类型的y被隐式转换为double类型后和x相乘
显式类型转换
- 除了隐式类型转换,在需要的时候,我们也可以显式地对变量的类型进行转换。其实我也比较推荐大家尽量使用显式类型转换,这样可以避免某些可能的错误。显示转换的方法是(type)x,其中type是要转换成的类型。假如后面要转换的是一个表达式,需要加上括号,即
(type)(a+b)
,这是由于运算符优先级的问题,后面会再次提到。
int a = 1000000000;
long long b = (long long)a * a;
- 这里int类型的a被显式转换成long long类型后和int类型的a相乘,由于相乘的两个类型不同,后面int类型的a会被隐式转换成long long类型后再与前面的a相乘。这里不进行显式类型转换的话,由于相乘的两个类型都是int,就会发生溢出,不过溢出这种错误运行时并不会报错。
基本类型间的转换
- 实型->整型:去除小数部分,仅保留整数部分
- 整型->实型:无变化,精度可能会损失
- 整型<->字符型:ASCII码
- 布尔型->整型:true变成1,false变成0
- 整型->布尔型:0变成false,其他变成true
注意有些转换可能会溢出,例如unsigned->int,long long->int等
- 由于有隐式类型转换,将数字字符转换成数字可以直接写成ch-‘0’,类似的还有ch-‘a’,其中ch表示数字字符或小写字母字符。
- 假如要从大类型转换为小类型(如long long转换为int、double转换为int),因为精度可能会损失,建议使用显式类型转换提示自己。
指针类型
指针是指向特定类型内存地址的类型。C++中的&运算符可以取出某个变量在内存中的地址,以便赋值给相应的指针类型。后面讲运算符时还会介绍通过new的方式给指针赋值。空指针的值为0(也可以用NULL表示)。
int a = 100;
int *b = &a;
// b是一个指向int类型的指针
// 并且将它初始化为a变量的地址
*b = *b * 2;
// 相当于a变量被乘2了
int *c = 0; // c是一个空指针
*c = *c * 2; // 运行到这条时会错误
引用类型
引用和指针有相似的地方,但更恰当的理解是给变量取别名。引用在定义时必须被恰当地初始化,并且之后就不能再修改成其他变量的别名。
int a = 100;
int &b = a;
// b是一个int的引用类型
// 并且它被初始化指向a
b = b * 2;
// 相当于a变量被乘2了
注意点
- 引用指针类型指向的地址时,需要在指针变量名前加
*
,但引用是和普通变量一样直接使用。 - 定义指针和引用变量时需注意,每一个指针或引用变量前都要加
*
或&
。
int *a, b, &c = b;
// a是指向int的指针类型
// b是普通的int类型
// c是指向int的引用类型
const类型
和Pascal中一样,C++里也可以定义常量,适当地定义常量不仅方便编程,也能够使程序意义更明确
const double pi = 3.141592653;
const