C++语言-2-数据类型与输入输出

本章将学习基本数据类型与输入输出的方法。


首先,请大家先熟悉下面的计算指定的a+b的和并输出的代码。

1
2
3
4
5
6
7
8
9
10
11
#include<iostream>
using namespace std;
int main()
{
int a,b,c;
cin>>a>>b;
c=a+b;
cout<<c;
system("pause");
return 0;
}

样例输入:2 3

样例输出:5

在前一篇中讲过的部分就不再赘述,直接从第五行开始讲起。

第五行

int a,b,c;

定义三个变量,分别叫做a,b,c,返回int类型(整型),句末要有分号。可以在定义里赋值,如int a=1,b=1,c=1;。int后面要有一个空格。

常用数据类型:

short有符号(即表示有正负,下同)短整型,范围-32768~32767(-2^15~2^15-1),只支持整数。

unsigned short无符号短整型,范围0~65535(2^16-1),只支持整数。

int有符号整型,范围-2147483648~2147483647(-2^31~2^31-1),只支持整数。

unsigned int无符号整型,范围0~4294967295(2^32-1),只支持整数。

long long有符号长整型,范围-9223372036854775808~9223372036854775807(-2^63~2^63-1),只支持整数。

unsigned long long无符号长整型,范围0~18446744073709551615(2^64-1),只支持整数。

float单精度,支持小数,有效数字约8位,范围-3.40(10的38次方)~3.40(10的38次方)。

double双精度,支持小数,有效数字约16位,范围-1.79(10的308次方)~1.79(10的308次方)。

char有符号字符型,不支持字符串,范围-128~127。

unsigned char无符号字符型,不支持字符串,范围0~255。

string字符串,在第五章中有具体说明。

bool布尔型,范围true或false,即非0或0。

*当遇见有的程序只写一个unsigned时,默认是unsigned int。

*在没有特殊强调时,整数类型一般用int,超过int的范围时可以使用long long或unsigned long long,别的一般不常用;浮点数类型一般用double,少用float。

标识符:

上文中提到的变量,就是标识符的一种。

对于所有的标识符,均需要满足如下名称要求:

  1. 只能是字母或下划线开头,严格区分大小写。
  2. 不可以包含数字或字母或下划线以外的其余符号。
  3. 不可以是系统正在使用的名称。如在linux系统中time是一个系统变量,则不可以使用time作为变量名称。

变量定义的写法:

  1. 定义一个int类型的变量a,写作int a;
  2. 定义一个long long类型的变量a,写作long long a;
  3. 定义一个float类型的变量a,写作float a;
  4. 定义一个double类型的变量a,写作double a;
  5. 定义一个char类型的变量a,写作char a;
  6. 定义一个string类型的变量a,写作string a;

*string在编程环境中不会变色,但仍是可用类型。

*要使用string类型,需要#include<string>

*string的具体用法在第五章中有具体说明。

*定义里可以直接赋值,如int a=123;

*定义里一句可以写多个变量,如int a,b,c;

*如在定义时直接对变量赋值,需要对每个想赋值的变量都赋值。

 如:int a,b=1;则a是未赋值变量,b被赋值为1

 再如:int a=2,b=1;则a被赋值为2,b被赋值为1

第六行

cin

cin>>a>>b;

按顺序输入一个变量a和一个变量b。cin包含在iostream中。句末有分号。

*每输入一个变量都需要写两个>符号(该符号是半角大于号),箭头指向要输入的变量。

*cin和cout会自动识别输入/输出的值的类型,无需特意说明。

*若是使用cstdio头文件的话,需要写成scanf(“%d%d”,&a,&b);句末有分号,在变量前需加&这个符号,相邻变量以逗号隔开。"%d"的意思是按整型来操作,有两个变量所以写两个%d。

*scanf会比cin快一些,在输入量很大(大于10万个数据)时建议使用scanf。printf同理。

scanf

对于scanf和printf,其均满足以下写法:

scanf(格式说明字符串,操作数);

printf(格式说明字符串,操作数);

其中,scanf和printf均可以只写格式说明字符串而不写操作数。当且仅当格式说明字符串中出现格式说明符(又叫占位符)时,才填写操作数。

并且,scanf和cin一样,均会自动跳过回车,且在格式说明符不为%c和%s时均会跳过空格。

示例:

仅格式说明字符串:

scanf("a=b=");

当输入是a=b=时可以正常执行

printf("a=b=");

输出字符串a=b=

仅占位符:

scanf("%d%d",&a,&b);

当输入仅有两个数字时可以正常执行,按格式说明符%d来操作变量a和b

printf("%d",c);

按格式说明符%d来操作变量c

混用:

scanf("a=%d,b=%d",&a,&b);

当输入格式满足例如a=1,b=2时(就连逗号也不能漏掉),输入取得值1和2,分别赋值给a和b

printf("c=%d",c);

将会原样输出c=,之后将变量c的值按格式说明符%d操作后,输出值

又如,本文开头的代码段可以转化为如下代码段,样例也可转化为对应样例:

1
2
3
4
5
6
7
8
9
10
11
#include<iostream>
using namespace std;
int main()
{
int a,b,c;
scanf(“a=%d,b=%d”,&a,&b);
c=a+b;
printf(“c=%d”,c);
system("pause");
return 0;
}

样例输入:

a=2,b=3

样例输出:

c=5

注意到上文中,scanf的操作数前有加”&”符号,而printf的操作数前没有。关于&,将会在第十章中说明。

附,常见格式说明符:

%d,表示按int类型处理

%lld,表示按long long类型处理

%ull,表示按unsigned long long类型处理

%c,表示按char类型处理

%s,表示按char数组来进行处理(关于数组,后续章节会讲到)

%f,表示按float类型处理

%lf,表示按double类型处理(因为double本质上是long float,所以其格式操作符取long float的缩写)

上述格式操作符均会跳过空格和换行符。也就是说,在使用cin、或在scanf中使用上述格式操作符时,输入的不同值可以使用空格或换行符隔开。

关于格式操作符的特殊操作(以下仅1可以适用于scanf,其余均仅适用于printf):

1、按照指定宽度保留数字的方法:

如对int类型保留4个数字的位宽,格式操作符可选用%4d

*当数字的实际宽度大于要保留的位宽时,按照原宽度输出。所以若是%0d,就是按原宽度输出

*当数字的实际宽度小于要保留的位宽时,将数字右对齐,并在左边补空格填充

2、保留指定位数的小数(直接舍去,并不四舍五入)的方法:

如对double类型保留两位小数,格式操作符可选用%0.2lf

对其中0的说明,参加第1条;而小数点后的2,就表示保留两位小数

此种情况下,0可以省略,如%0.2lf与%.2lf等效

*内部操作是先计算保留小数,再计算保留位宽

*对于小数,小数点也占一个位宽,所以如对于2.15使用格式说明符%4.1lf的话,会因为先计算保留1位小数而变为2.1,此时位宽为3。再因为保留4个位宽,而在2.1前补一个空格后输出

3、可以使用0来代替空格进行填充(填充后需符合保留小数位数的要求,以及不能改变原数字大小):

如对于int类型数字100,使用格式操作符%4d,本来是在左边填充一个空格,如果改用格式操作符%04d的话,就会变成在左边填充一个0,这样执行printf("%04d",100);就会输出0100

4、可以使用-来实现左对齐

如对于int类型数字100,使用格式操作符%-4d,就会在100右边填充一个空格后输出

但如果使用格式操作符%-04d,并不会在右边填充一个0,因为这样会改变100原本的值,所以输出会是100和一个空格

综上,如果想对一个double类型的变量a,保留5位位宽,保留1位小数,用0填充空位,实现左对齐的话,可以写成:printf("%-05.1lf",a);

第七行

c=a+b;

本句的执行过程是,先计算a+b的值,再赋值给c。本语句称之为赋值语句。赋值语句的等号左边必须是一个可以被赋值的对象。

其中,对于+号,=号,我们均称之为运算符。

常见运算符有:

+,-,*,\,分别表示加减乘除

=,表示赋值,先计算等式右边的值,再赋值给左边的对象

%,表示取模,功能类似于取余数。如int a=100%7;最终c的值将等于100除以7的余数2

+=,表示自加运算。如i+=2,表示i=i+2。其它的-=*=/=%=同理

++,表示自加1运算。如i++,表示i=i+1。三个或更多加号则不成立,只有两个+号的++可以表示自加运算。

*特别的,++有前置和后置两种写法,如i++和++i,最终都会导致i=i+1。

*当i++或++i单独存在时,它们并无区别。但当它们处于赋值语句中时,会引发差别。

i++是先取得i的值,再自加;++i是先自加,再取得i的值。

如,现在有int i=1,a;然后令a=i++,则先取得i的值1,赋值给a,然后i再自加,i变成2,所以执行完后a=1,i=2。

相对的,如现在有int i=1,a;然后令a=++i,则i先自加,i变成2,再取得i的值2,赋值给a,所以执行完后a=,2,i=2。

–与++同理。只有加减有这种写法,别的没有。

第二章到此结束。

感谢PTW对本文的援助。

本章练习:

P1001 A+B Problem

P1421 小玉买文具

P1425 小鱼的游泳时间

--It's the end.Thanks for your read.--