C/C++ 语法教程(1)——数据类型与输入输出
Contents
数据类型与输入输出
常用数据类型(变量类型)
变量由数据类型和值构成。这下面的都是可能用到的较常见的基础数据类型。
下面所说的位都是二进制位,也就是 $0/1$。
数值型
- 整型:
short
:范围为 $-32768(-2^{15}) \sim 32767(2^{15}-1)$,占用 $16$ 位 $2$ 个字节。(较少使用)int
:范围从 $-2147483648(-2^{31}) \sim 2147483647(2^{31}-1)$,占用 $32$ 位 $4$ 个字节。一般整型都采用int
。long long
:范围从 $-2^{63} \sim 2^{63} - 1$,占用 $64$ 位 $8$ 个字节。char
:范围从 $-128 \sim 127$ 或者 $0 \sim 255$,占用 $8$ 位 $1$ 个字节,一般用于字符类型,大小代表字符的ASCII 码。- 除此之外,还有对应的
unsigned
类型(无符号类型),占用内存不变,但范围下界变为 $0$,上界变为原来上下界的绝对值之和(比如 $2^{32}-1$)。一般signed
的前缀(符号类型)不写,如果出现可以忽略。 bool
:值为 $0(false)$ 或 $1(true)$,占用 $1$ 位 $1$ 个字节。- 理论上还有一种
long
变量,但是因为 $32$ 位跟 $64$ 位电脑其范围占用字节不同,故一般不使用。
- 浮点型:
float
:大概 $7$ 位有效数字,上下限大概 $\pm 3.4 \times 10^{38}$,占用 $32$ 位 $4$ 个字节。double
:大概 $15$ 位有效数字,上下限大概 $\pm 1.7 \times 10^{308}$,占用 $64$ 位 $8$ 个字节。一般浮点型都采用double
。long double
:大概 $15$ 位有效数字,上下限大概 $\pm 1.2 \times 10^{4932}$,不同编译平台不同,有的是 $8$ 字节,有的是 $10$ 字节,有的是 $12$ 字节或 $16$ 字节。
非数值型
常用的就是 string
类型,用于储存字符串,某种意义上与 char
数组(不知道不急)相似,但又有区别之处。
获取类型信息
可以通过 sizeof(类型名)
获取一个数据类型占用字节数,比如 sizeof(int)
一般就是 $4$。
也可以用一些常数比如 INT_MIN
、INT_MAX
获取某种整型类型的上下限。
输入输出
C 常用的输入输出
scanf
:最常用的输入函数之一,基本格式形如scanf("%d",&n);
,其中%d
称为格式控制符(不用知道),表示输入的类型,&n
用以获取变量 $n$ 的地址(如果输入的数组则可能不需要&
),用于将输入的信息存储到对应的内存空间。常见的格式控制符与类型对应表如下:
格式控制符 | 类型和输出格式 |
---|---|
%hd | short |
%d | int (d 改成 o 就是八进制,改成 x 就是十六进制) |
%lld | long long |
%c | char |
%f | float |
%lf | double 、long double (有时需要 %Lf ) |
%u | unsigned int |
%llu | unsigned long long |
%s | string 、char 数组 |
%e | 指数形式的浮点数的格式输出,比如 1.235e+001 |
%g | 在满足输出精度的情况下,由系统决定用 %f 还是用 %e 输出;未指定,输出精度则默认 $6$ 位有效数字 |
%p | 指针型(输出变量内存地址) |
printf
:最常用的输出函数之一,基本格式形如printf("%d",n);
,前面的格式控制符与scanf
相同,但注意后面不需要使用&
获取地址。除此之外还有一些特殊符号比如:\n
表示换行,\t
表示制表符。使用形如printf("%d\n",n);
即可。如果想要输出若干位小数(四舍五入),可以用如下形式
printf("%.5lf",a);
表示输出 $a$ 保留 $5$ 位小数。一般来说,
printf("%m.nf",a);
(%lf
和%e
、%g
同理)表示输出浮点型小数点后(指数形式上面那个例子就是 $3$ 位)保留 $n$ 位,总输出占位长度不小于 $m$ 位,少的用空格在左侧补齐。除此之外,其他的格式控制符也可以写成大概形如
%md
、%mc
的形式,表示控制总输出占位不小于 $m$ 位,少的用空格在左侧补齐。特别地,如果想要左对齐,也就是空格补在右侧,只需在 $m$ 前加一个
-
即可,对于浮点型同理,也就是%-md
和%-m.nf
。%0nd
和%.nd
均表示占 $n$ 位,右对齐,左侧补零。%ns
跟第 5 条相同,%.ns
则对于字符串长度大于 $n$ 的字符串只截取前 $n$ 个字符。在
%
后面紧跟一个+
用于表示总是显示符号(也就是+
和-
),比如%+d
、%+-12.2f
。如果想要将上述中的 $n$ 和 $m$ 由程序变量决定,可以使用
printf("%*.*lf",m,n,a);
这种形式。如果想输出
%
符号,需要使用%%
。输入的时候也同样可以通过类似的方法确定输入的位数(不能用于
char
变量,且不能规定小数点后位数)。如果使用
scanf("%d,%d,%d",&a,&b,&c);
则必须在每一个输入的整型后紧跟一个逗号(通配符)(一般不建议使用)。getchar
:一个字符输入函数(常用于输入优化),用于获取一个字符,获取的类型为char
,可以用ch=getchar();
这样子获取。特别的,还有
_getch()
和_getche()
和_ungetch()
函数,用处极小,可以不用特别记忆。(需要再查就行)putchar
:一个字符输出函数(常用于输出优化),用于打印一个字符,调用格式一般形如putchar('a');
或者putchar(67);
。puts
:一个字符串输出函数,打印完一个字符串后自动换行,调用格式一般形如puts("Hello World!");
。
注:这里的主要要知道 1、2、3、14、15、16、17 条即可。
C++ 常用输入输出
C++ 提供了输入输出流,用法十分多样,但这里只介绍最常用的几种(需要 iostream
库并 using namespace std;
):
cin
:最常用的输入函数之一,与 C 不同的是,它的运算符采用>>
,调用形式是cin>>a>>b;
表示输入 $a$ 和 $b$ 两个变量,而输入的类型自动由 $a$ 和 $b$ 的类型获得。cout
:最常用的输出函数之一,它采用<<
运算符,调用形式为cout<<a<<b<<endl;
,其中变量部分与cin
相同,而endl
表示输出一个换行,但一般较慢,建议使用cout<<"\n";
。cerr
:格式与cout
相同,但是其输出必定位于屏幕(如果有文件输出时,cout
会输出到文件中),一般用于调试。- 对于因为各种考虑没有
using namespace std;
的情况,可以采用std::cin
这种方法调用cin
、cout
、endl
和cerr
。
常用的头文件
一般会写如下几种:
#include <iostream>
,C++ 专用,C++ 输入输出相关#include <cstdio>
,C++ 专用,C 输入输出相关,C 版本为#include <stdio.h>
#include <cmath>
,C++ 专用,数学函数相关,C 版本同理(去c
加.h
)#include <cstring>
,C++ 专用,字符串函数相关,C 版本同理#include <algorithm>
,C++ 专用,常用模板函数相关#include <bits/stdc++.h>
,C++ 专用,包含了几乎全部会用到的头文件,包括以上 $5$ 种。
一般 C++ 会在头文件引入后加上一句 using namespace std;
。
代码示例
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a,b;
scanf("%d",&a);
cin>>b;
printf("%d\n",a+b);
cout<<a-b<<endl;
return 0;
}
其他类型的输入输出请自行体验。
Comments: 2
long double
应该用%Lf
;代码示例printf
里面少了一个\
。感谢提醒