目录
- 1、C语言中数据类型
- 2、常量与变量
- 2.1 常量
- 2.2 变量
- 3、整型:int
- 3.1 整型变量的定义、输入和输出
- (1)整型变量的定义:
- (2)整型变量的输出:
- (3)整型变量的输入:
- 3.2 short、int、long、long long
- 4、字符型:char
- 4.1 字符变量的定义、输入和输出
- 4.2、转义字符
- 5、浮点型:float、double
- 6、字符串格式化输出和输入
- 6.1、字符串常量
- 6.2、printf函数和putchar函数
- (1)printf()
- (2)putchar()
- 6.3 scanf函数与getchar函数
- (1)scanf()
- (2)getchar()
数据类型的作用:编译器预算对象(变量)分配的内存空间大小。
常量:
在程序运行过程中,其值不能被改变的量;
常量一般出现在表达式或赋值语句中。
常量的定义方式有两种:
(1)宏定义:(推荐)
#define 常量名 值
(2)const关键字定义:(c中不安全,不推荐)
const 数据类型 常量名 = 值;
变量:
在程序运行过程中,其值可以改变;
变量在使用前必须先定义,定义变量前必须有相应的数据类型。
定义格式:
数据类型 变量名 = 值;
注:在定义局部变量的时候,可以在数据类型的前面加auto,也可以不加。
int a = 123; //定义变量a,以10进制方式赋值为123
int b = 0567; //定义变量b,以8进制方式赋值为0567,注意:八进制以0(零)开头
int c = 0xabc; //定义变量c,以16进制方式赋值为0xabc,注意:十六进制以0x开头(零)
unsigned int d; //定义无符号数
signed int e; //定义有符号数,这个等于 int e
打印格式(占位符) | 含义 |
---|---|
%d | 输出一个有符号的10进制int类型 |
%o(字母o) | 输出8进制的int类型 |
%x | 输出16进制的int类型,字母以小写输出 |
%X | 输出16进制的int类型,字母以大写输出 |
%u | 输出一个10进制的无符号数 |
例子:
#include
int main()
{
int a = 123; //定义变量a,以10进制方式赋值为123
int b = 0567; //定义变量b,以8进制方式赋值为0567
int c = 0xabc; //定义变量c,以16进制方式赋值为0xabc
printf("a = %d\n", a);
printf("8进制:b = %o\n", b);
printf("10进制:b = %d\n", b);
printf("16进制:c = %x\n", c);
printf("16进制:c = %X\n", c);
printf("10进制:c = %d\n", c);
unsigned int d = 0xffffffff; //定义无符号int变量d,以16进制方式赋值
printf("有符号方式打印:d = %d\n", d);
printf("无符号方式打印:d = %u\n", d);
return 0;
}
输入就是下面这样很简单,但是在visual studio中运行不过去,解决办法贴在下面:
int a;
scanf("%d", &a);
scanf安全问题解决,复制下面的任意一条:
#define _CRT_SECURE_NO_WARNINGS // 必须在首行
pragma warning(disable:4996) // 不必在首行
下面看看整型的类型:
数据类型 | 占用空间 |
---|---|
short(短整型) | 2字节 |
int(整型) | 4字节 |
long(长整形) | Windows为4字节,Linux为4字节(32位),8字节(64位) |
long long(长长整形) | 8字节 |
注意:
整型常量 | 所需类型 |
---|---|
10 | 代表int类型 |
10l, 10L | 代表long类型 |
10ll, 10LL | 代表long long类型 |
10u, 10U | 代表unsigned int类型 |
10ul, 10UL | 代表unsigned long类型 |
10ull, 10ULL | 代表unsigned long long类型 |
打印格式 | 含义 |
---|---|
%hd | 输出short类型 |
%d | 输出int类型 |
%ld | 输出long类型 |
%lld | 输出long long类型 |
%hu | 输出unsigned short类型 |
%u | 输出unsigned int类型 |
%lu | 输出unsigned long类型 |
%llu | 输出unsigned long long类型 |
下面看一下,这几种类型在计算机中占的字节数,我们用sizeof()关键字获取:
- sizeof不是函数,所以不需要包含任何头文件,它的功能是计算一个数据类型的大小,单位为字节
- sizeof的返回值为size_t
- size_t类型在32位操作系统下是unsigned int,是一个无符号的整数
#include
int main(void) {
short a = 10;
int b = 10;
long c = 10l; //或者10L
long long d = 10ll; //或者10LL
// sizeof()计算数据类型在内存中占的字节(byte)大小,得到的结果是:无符号int类型
//格式为:sizeof(数据类型) or sizeof(变量名) or sizeof 变量名
printf("%d\n", sizeof(a)); //2
printf("%d\n", sizeof(b)); //4
printf("%d\n", sizeof(c)); //4
printf("%d\n", sizeof(d)); //8
// 下面是无符号数的表示
unsigned short a2 = 20u;
unsigned int b2 = 20u;
unsigned long c2 = 20ul;
unsigned long long d2 = 20ull;
printf("unsigned short a = %hu\n", a2);
printf("unsigned int b = %u\n", b2);
printf("unsigned long c = %lu\n", c2);
printf("unsigned long long d = %llu\n", d2);
return 0;
}
字符型变量用于存储一个单一字符,在 C 语言中用 char 表示,其中每个字符变量都会占用 1 个字节。在给字符型变量赋值时,需要用一对英文半角格式的单引号(’ ')把字符括起来。
字符变量实际上并不是把该字符本身放到变量的内存单元中去,而是将该字符对应的 ASCII 编码放到变量的存储单元中。char的本质就是一个1字节大小的整型。
看一个例子:
#define _CRT_SECURE_NO_WARNINGS //VS中使用的
#include
int main()
{
char a;
scanf("%c", &a); //键盘输入一个字符,占位符为%c
printf("%c\n", a); //打印出这个字符,占位符为%c
printf("%d\n", a); //打印出这个字符对应的ASCII码
printf("%d\n", sizeof(a)); //打印这个字符在内存中占用的字节数
return 0;
}
所以要是忘记了一个字符的ASCII码,不查表的情况下,使用下面的语句也可以知道:
printf("%d\n", a); //打印出这个字符对应的ASCII码
转义字符 | 含义 | ASCII码值(十进制) |
---|---|---|
\a | 警报 | 007 |
\b | 退格(BS) ,将当前位置移到前一列 | 008 |
\f | 换页(FF),将当前位置移到下页开头 | 012 |
\n | 换行(LF) ,将当前位置移到下一行开头 | 010 |
\r | 回车(CR) ,将当前位置移到本行开头 | 013 |
\t | 水平制表(HT) (跳到下一个TAB位置) | 009 |
\v | 垂直制表(VT) | 011 |
\\ | 代表一个反斜线字符"" | 092 |
\’ | 代表一个单引号(撇号)字符 | 039 |
\" | 代表一个双引号字符 | 034 |
\? | 代表一个问号 | 063 |
\0 | 数字0 | 000 |
\ddd | 8进制转义字符,d范围0~7 | 3位8进制 |
\xhh | 16进制转义字符,h范围0~9,a-f,A-F | 3位16进制 |
注意:加粗字体标注的为不可打印字符。
这里还有个字符,就是"%"怎么打印,%%这样就可以打印出一个%号了。
实型变量也可以称为浮点型变量,浮点型变量是用来存储小数数值的。在C语言中, 浮点型变量分为两种: 单精度浮点数(float)、 双精度浮点数(double), 但是double型变量所表示的浮点数比 float 型变量更精确。
由于浮点型变量是由有限的存储单元组成的,因此只能提供有限的有效数字。在有效位以外的数字将被舍去,这样可能会产生一些误差。
不以f结尾的常量是double类型,以f结尾的常量(如3.14f)是float类型。
我们查看一下float、double类型占用的字符:
#include
int main() {
float a = 9.0;
double b = 2.0;
printf("%d\n", sizeof(a)); //4
printf("%d\n", sizeof(b)); //8
return 0;
}
然后我们看一下整型变量和浮点型变量在内存中保存的位置:
其中:%p是一个占位符,表示输出一个变量对应的内存地址编号(无符号十六进制整型数)
int main() {
int a = 10;
float b = 2.0;
// %p是一个占位符,表示输出一个变量对应的内存地址编号(无符号十六进制整型数)
printf("%p\n", &a);
printf("%p\n", &b);
return 0;
}
科学计数法怎么表示呢?看下面:
int main() {
float a = 2e-3; //e后面是负数,表示乘0.1的次方
float b = 2e3; //e后面是正数,表示乘10的次方
printf("%f\n", a);
printf("%f\n", b);
printf("%e\n", 33242.656); //%e占位符,将这个数用科学计数法表示
return 0;
}
- 字符串是内存中一段连续的char空间,以’\0’(数字0)结尾。
- 字符串常量是由双引号括起来的字符序列,如“china”、“C program”,“$12.5”等都是合法的字符串常量。
字符串常量与字符常量的不同:
每个字符串的结尾,编译器会自动的添加一个结束标志位’\0’,即 “a” 包含两个字符’a’和’\0’。
printf是输出一个字符串,putchar输出一个char。
下面对printf的输出格式做一个总结:
打印格式 | 对应数据类型 | 含义 |
---|---|---|
%d | int | 接受整数值并将它表示为有符号的十进制整数 |
%hd | short int | 短整数 |
%hu | unsigned short | 无符号短整数 |
%o | unsigned int | 无符号8进制整数 |
%u | unsigned int | 无符号10进制整数 |
%x,%X | unsigned int | 无符号16进制整数,x对应的是abcdef,X对应的是ABCDEF |
%f | float | 单精度浮点数 |
%lf | double | 双精度浮点数 |
%e,%E | double | 科学计数法表示的数,此处"e"的大小写代表在输出时用的"e"的大小写 |
%c | char | 字符型。可以把输入的数字按照ASCII码相应转换为对应的字符 |
%s | char * | 字符串。输出字符串中的字符直至字符串中的空字符(字符串以’\0‘结尾,这个’\0’即空字符) |
%p | void * | 以16进制形式输出指针 |
%% | % | 输出一个百分号 |
printf的附加格式:
字符 | 含义 |
---|---|
l(这是字母l) | 附加在d,u,x,o前面,表示长整数 |
-(这个是减号) | 左对齐 |
m(代表一个整数) | 数据最小宽度 |
0(数字0) | 将输出的前面补上0直到占满指定列宽为止不可以搭配使用- |
m.n(代表一个整数) | m指域宽,即对应的输出项在输出设备上所占的字符数。n指精度,用于说明输出的实型数的小数位数。对数值型的来说,未指定n时,隐含的精度为n=6位。 |
看一下这个附加格式的例子:
#include
int main() {
float a = 3.1415926;
printf("===%-12.3f===", a);
return 0;
}
结果:
这个函数就是输出一个字符,里面的参数是一个ASCII码值,所以要是输入字符,其实就会自动转成ASCII码值。
例子:
int main() {
char ch = 'd';
putchar(ch); //输出变量,结果:d
putchar('a'); //输出字符,结果:a
putchar(97); //输出数字(0-127才能显示),结果:a
putchar('\n'); //输出转义字符,结果:换行
return 0;
}
- getchar是从标准输入设备读取一个char。
- scanf通过%转义的方式可以得到用户通过标准输入设备输入的数据。
scanf()函数输入多个时,默认是使用空格或者换行为结束的,所以要是在这多个输入之间用别的符号(如逗号)作为分割,那就要在转义符%后面加这个符号,看具体例子吧:
#define _CRT_SECURE_NO_WARNINGS //VS避错
#include
int main() {
int a, b, c, d; // 定义四个整型
printf("接下来这个输入默认用空格或者换行作为结束:\n");
scanf("%d%d", &a, &b); // 这个输入默认用空格或者换行作为结束
printf("%d,%d\n", a, b);
printf("下面这个输入改用逗号作为结束:\n");
scanf("%d,%d", &c, &d);
printf("%d,%d\n", c, d);
return 0;
}
getchar是从标准输入设备读取一个char,注意:只能读取一个字符。
例子:
int main() {
char ch;
ch = getchar(); //接收键盘获取字符
putchar(ch); //输入这个字符
return 0;
}