C++入门(1)

一、第一个C++程序

#include <iostream>
using namespace std;
int main()
{
	cout << "hello world" << endl; 
	return 0;
}
1. main函数
main 函数是程序的入口,C++ 的程序不管有多少行代码,都是从 main 函数开始执行的, main 函数也被叫做:主函数。main前面的int 表示main函数执行结束的时候返回⼀个整型类型的值,而在 main 函数的最后写 return 0; 正好前后呼应。要注意的是,main函数有且仅有一个。一个项目中可以有多个 .cpp 文件,但是只能有一个 main 函数(因为程序的入口只能有一个)。
 
2. 字符串
在 C 语言中,使用单引号括起来一个字符,表示字符字面值,比如: '1' , 'a' ,使用双引号括起来多个字符表示一个字符串,比如:"abcdef" , "hello world" ,字符串中可以有⼀个或者多个字符,也可以没有任何字符, "" 表示空字符串。上面代码中的 "hello world!" 就是一个字符串。这类字符和字符串表示的方式在C++也完全支持的。在C++的 STL 中又引入了 string 来表示字符串,功能更加强大,C 语言不支持,后期会详细介绍。
 
3. 头文件
前面的代码中,写的 #include <iostream>,就是在包含头文件,头文件的名字叫:iostream,使用#include <> 的形式进行包含。iostream文件中的 io 指的是输入进入程序的信息,简单理解就是可以给程序输入数据)和输出(从程序中输出的信息,简单理解就是程序会打印数据在屏幕上)。
在 C++ 程序中要完成输⼊和输出的操作会涉及到 iostream 文件中的多个定义,所以就要包含这个头文件的。比如:代码中的 cout 是输出流对象,就是用来完成数据输出的,就需要包含头文件。
注意:
在C语言中头文件的扩展名是 .h ,但是C++中的用法发生了一些变化,对老式C的头文件保留了扩展名 .h ,但是C++自己的文件没有扩展名了。也有一些C的头文件被转换成C++头文件,这些文件名被重命名,去掉了.h扩展名,并在文件名的前面加上了前缀c(表示来自C语言);例如:C语言中有关数学的头文件名字是 math.h ,在C++中就是 cmath 。当然还得注意,有时这种头文件的C语言版本和C++版本相同,而有时候,新版本做了一些修改。
 
4. cin 和 cout 初识
cout << "hello world!" << endl; 这句代码在上面的程序中是最重要的代码,其他所有的代码都是为了编写这句代码。代码中的 cout 是标准输出流对象(针对控制台,也就是屏幕),其实还有标准输入流对象(针对的是键盘) cin 。cout 是告诉程序把后面双引号中的内容打印到标准输出设备(屏幕)上,双引号中的内容可以替换的。endl 是 C++ 中⼀个特殊的操作符,效果是换行和刷新缓冲区,使用时必须包含在 iostream 头文件。<< 是流插入运算符,和 cout 配合使用, >> 是流提取运算符,和 cin 配合使用。
#include <iostream>
using namespace std;
int main()
{
	int a,b;
	cin >> a >> b;
	cout << b << endl;
	return 0;
}

在上面的代码中我们实现的是输入两个数然后输出第二个数,可以分两次读入,也可以一次读入,只有获取到第二个输入值才能输出结果。我们能够知道cin 是支持连续读入几个数值的 ,cout 也是支持连续输出几个数值的。

5. 名字空间
using namespace std; 这句代码的意思是:使用名字空间 std (名字空间也叫命名空间)。在C++中,变量、函数和类都是大量存在的,这些变量、函数和类的名称如果都存在于全局作用域中,可能会导致很多冲突。使用以名字空间的目的是对标识符的名称进行隔离,以避免命名冲突或名字污染, namespace 关键字的出现就是针对这种问题的。std 是C++标准库的名字空间名,C++将标准库的定义实现都放到这个命名空间中,当我们需要使用标准库中的内容时,就需要加上: using namespace std ;当有了这句代码的时候,表示名字空间 std 中信息都是可见和可用的,比如: cin 、 cout 、 endl 等。名字空间也是根据需要自己可以定义的,这里就不加详细介绍,可以自行拓展学习。当然直接使用using namespace std; 是⼀种简单粗暴的做法,直接这样使用,就意味着后续在std 这个名字空间中的各种定义都可以直接使用,但是我们往往只是使用部分。所以名字空间其实也可以这样使用:
#include <iostream>
//using namespace std;
int main()
{
	std::cout << "hello world" << std::endl; 
	return 0;
}
代码中的 std::cout 的意思就是使用 std 名字空间中的 cout 。
采用 std::cout 这种写法,如果频繁使用,在算法竞赛中比较麻烦,耽搁时间。但是在企业中做软件开发基本上都这样写的,这样写更好的避免名字冲突的问题,后期在慢慢琢磨。
 
6. 注释
在C++里主要有两种形式:单行注释 // 和多行注释 /* */
注释是放在代码中对代码进行解释的文字,无需编译。注释是给程序员自己看的,编译器会忽略注释,基于注释是被编译器忽略的这个特点,在代码中有些代码不再需要的时候也会使用注释的方式屏蔽。
在VS环境中注释和取消注释的快捷键: Ctrl + K + C , Ctrl + K + U
在DevC++中注释和取消注释的快捷键: Ctrl + /
单行注释
#include<stdio.h>
int main()
{
	//printf("%d", 2); 这是单行注释
	return 0;
}

多行注释

#include<stdio.h>
/* 这是多行注释
int main()
{
	printf("%d", 2);
	return 0;
}*/

二、数据类型

C++中提供了丰富的数据类型来描述生活中的各种数据。比如:可以使用整型类型来描述整数,使用字符类型来描述字符,使用浮点型类型来描述小数。所谓 “类型”,就是相似的数据所拥有的共同特征,编译器只有知道了数据的类型,才知道怎么去操作数据。
 
1.字符型
char  //character的缩写 
在键盘上可以敲出各种字符,如: a , q , @ , # 等,这些符号都被称为字符,字符是用单引号括起来的,如: 'a' , 'b' , '@' 。为了能说明这些字符,给他们抽象出⼀种类型,就是字符型,C语言中就是 char 。
 
2.ASCII编码
我们知道在计算机中所有的数据都是以二进制的形式存储的,那这些字符在内存中分别以什么样的二进制存储的呢?如果我们每个人中间给这些字符中的每个字符编⼀个二进制序列,这个叫做编码,为了不造成混乱,美国国家标准学会(ANSI)出台了一个标准 ASCII 编码,C语言中的字符就遵循了 ASCII 编码的方式。
下面就是一张ASCII码表。
8f3d3b2d25c448c69eac867c8a948005.png
当然我们不需要将这张表全部记下来,使用时查看就可以,不过我们最好能掌握几组特殊的数据:
(1)字符 A~Z 的ASCII码值从 65~90
(2)字符 a~z 的ASCII码值从 97~122
(3)对应的大小写字符(a和A)的ASCII码值的差值是 32
(4)数字字符 0~9 的ASCII码值从 48~57
(5)换行 \n 的ASCII值是: 10
(6)ASCII码值从0~31 这32个字符是不可打印字符,无法打印在屏幕上观察
#include <iostream>
using namespace std;
int main()
{
	char m='A';
	cout << m << endl;
	char n=65;
	cout << n << endl;
	return 0;
}

在上面的代码中虽然n为65,但是打印出来和m一样为'A'。这是因为在定义另一个字符变量 n时,用ASCII码值65初始化它。在ASCII编码中,65对应于大写字母 'A'。

 

3.整型

整型类型是对所有整数的抽象,为了能对整数形成统一的类型标识,就有整型;在 C 和 C++ 中整型被分为四大类: short 、 int 、 long 、 long long 。short,long,long long后的int可以省略。
#include <iostream>
using namespace std;
int main()
{
	short int a;//短整型 
	int b;//整型 
	long int c;//长整型 
	long long int d;//更长的整型 
	return 0;
}

4.浮点型

浮点型式对所有小数的抽象,为了能对小数进行统一的类型标识,就有了浮点型。浮点型有三种:

#include <iostream>
using namespace std;
int main()
{
	float a;//单精度浮点型 
	double b;//双精度浮点型 
	long double c;//更长的双精度浮点型 
	return 0;
}
在C/C++中小数的书写形式:
#include <iostream>
using namespace std;
int main()
{
	3.14; //编译器会默认识别为double类型 
	3.14f; //编译器会默认识别为float类型 
	1e5; //这种写法是科学计数法的形式,意思是1.0*10^5
	1e5+10; //1*100000+10 == 100010
	1.23e5+10; //1.23*100000+10 = 123010
	return 0;
}

5.布尔类型

C++有⼀种类型叫:bool (布尔类型),布尔类型的变量的值可以是 true 或 false ,这种类型类型的变量专门用来表示真或假的。当然在C和C++中,0表示假,非0表示真。
#include <iostream>
using namespace std;
int main()
{
	bool flag=true;
	if(flag)
	{
		cout << "I like C++!" << endl;
	}
	return 0;
}
#include <iostream>
using namespace std;
int main()
{
	int flag=1;
	if(flag)
	{
		cout << "I like C++!" << endl;
	}
	return 0;
}

当if语句()中的值为真,就会执行。在第一段代码中flag为true,也就是为真;在第二段代码中flag为1,非0也表示真。所以这两个代码都可以打印出I like C++!这段话。

6.signed 与 unsigned

signed 和 unsigned 关键字修饰字符型和整型类型的。
signed 关键字,表示一个类型带有正负号,包含负值;比如:温度、银行存款。
unsigned 关键字,表示该类型不带有正负号,只能表示零和正整数,比如:年龄。
有了 signed 和 unsigned 的修饰,字符和整型类型其实更加丰富,可以有以下这些:
#include <iostream>
using namespace std;
int main()
{
	char m1;//字符型
	signed char m2;//有符号的字符类型
	unsigned char m3;//无符号的字符类型
	short int m4;//短整型
	signed short int m5;//有符号的短整型
	unsigned short int m6;//无符号的短整型
	int m7;//整型
	signed int m8;//有符号的整型
	unsigned int m9;//无符号的整型
	long int m10;//长整型
	signed long int m11;//有符号的长整型
	unsigned long int m12;//无符号的长整型
	long long int m13;//更长的整型
	signed long long int m14;//有符号的更长的整型
	unsigned long long int m15;//无符号的更长的整型
	return 0;
}
对于 int 类型,默认是带有正负号的,也就是说 int 等同于 signed int 。由于这是默认情况,关键字 signed ⼀般都省略不写,但写了也没事。int 类型也可以不带正负号,只表⽰⾮负整数。这时就必须使用关键字 unsigned 声明变量。
变量声明为 unsigned 的好处是,同样长度的内存能够表示的最大整数值,增大了⼀倍。比如,16位的 signed short int 的取值范围是: -32768~32767 ,最大是 32767 ;而unsigned short int 的取值范围是: 0~65535 ,最大值增大到了 65535 。32位的 signed int 的取值范围可以参看 climits 中给出的定义。下面的定义是Dev-C++环境中, climits 中相关定义,其实如果仔细看 climits 中也是包含的limits.h 。a2165c4d9266428fa5a6c3ff979de621.png
 
c6bec9b9d70b4e2d9bf787d6f4574ba8.png
unsigned int 里面的 int 可以省略,所以上面的变量声明也可以写成下面这样。
#include <iostream>
using namespace std;
int main()
{
	unsigned a; 
	return 0;
}
注意,char 类型到底是 signed char 还是 unsigned char ,由编译器决定。大部分的编译器上 char 就是signed char 。这就是说, char 不等同于 signed char ;它有可能是 signed char ,也有可能是unsigned char 。这⼀点与 int 不同, int 就是等同于 signed int 。
 
7.数据类型长度
每⼀种数据类型都有自己的长度,使用不同的数据类型,能够创建出长度不同的变量,变量长度的不同,存储的数据范围就有所差异。
那我们先来介绍一个关键字sizeof,也是操作符,专门是用来计算特定数据类型的长度的,单位是字节。sizeof 操作符的操作数可以是类型,也可是变量名或者表达式, sizeof 的操作数如果不是类
型,是表达式的时候,可以省略掉后边的括号的。
sizeof( 类型 )
sizeof 表达式
sizeof 的计算结果是 size_t 类型的, size_t 指的是无符号整数(该类型包含了所有可能,unsigned int , unsigned long , unsigned long long 等类型,具体是取决于编译器的)。sizeof计算操作数所占内存的大小,在下面的代码中,因为a是整型变量,所以所占内存就是整型类型所需的四个字节。
#include <iostream>
using namespace std;
int main()
{
	int a=10;
	cout << sizeof(a) <<endl;//4
	cout << sizeof a <<endl;//4
	cout << sizeof(int) <<endl;//4
	return 0;
}

bd6c5b5e60394980b246fc4cda831e22.png

该如何理解这些数据类型的长度呢?其实我们使用这些数据类型可以向内存申请空间(也就是创建变量),不同的数据类型⼀次性申请的空间大小是有差异的。你可以这样理解:
a76e0667407440e7bef79534847a303f.png
前面的知识已经让我们了解到了很多的数据类型,不同的数据类型所创建的变量的长度是有差异的,这个长度差异又决定了这种变量中能存储的值的大小。其实每⼀种数据类型有自己的取值范围,也就是存储的数值的最大值和最小值的区间。不同数据类型的取值范围我们可以在下面两个文件中查找到。
limits.h 文件中说明了整型类型的取值范围。(C++中头文件的名字是 <climits> )
float.h 这个头文件中说明浮点型类型的取值范围。(C++中头文件的名字是 <cfloat> )
 
这里选取一个进行说明,我们知道int所占内存为四个字节,也就是32个比特,每个比特位存着0或1,所以int的取值范围为2^32,平分正负数就是下面的结果,而unsigned int因为不包括负数,所以是从0开始。
a6f5e0a08a9545839b3b0ac5fb0a2f9d.png
我们对这些类型的取值范围还得大概知道取值范围的数量级,像 int 类型取值大概是:-2.1*10^9~2.1*10^9,这里就是10^9这样的数量级。
 
8.typedef
在C++中有⼀个关键字是和类型有关的,是用来给类型重命名的。当有一个类型比较复杂的时候,可以简化类型。 typedef 在竞赛中经常使用,可以提升编码速度。typedef使用的基本语法形式:
typedef 旧类型名 新类型名;
typedef unsigned int uint;
//将unsigned int重命名为uint
上面代码的意思是将 unsigned int 类型重命名为 uint ,使用uint 创建的变量和使用unsigned int 是⼀样的。
uint num1 = 0;//等价于 unsigned int num1 = 0;

我们再来看一段输入ASCII码输出相应字符的代码。

#include <iostream>
using namespace std;
int main()
{
	int n = 0;
	cin >> n;
	char ch = n;
	cout << ch << endl;
	return 0;
}
输入⼀个整数,即字符的 ASCII 码,那么就必须使用⼀个int类型的变量来输入数值。因为C++的 cin 是根据变量的类型在缓冲区读取数据的。换成 char 类型是不行的。比如我们输入65,如果直接使用char类型来接受,cin根据char类型读取一个字符,也就是'6'。

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值