数据类型

1.常量与变量

1.1 数据类型

数据类型的作用:编译器预算对象(变量)分配的内存空间大小。

1.2 常量

  • 在程序运行过程中,其值不能被改变的量
  • 常量一般出现在表达式或赋值语句中
整型常量 100,200,-100,0
实型常量 3.14 , 0.125,-3.123
字符型常量 ‘a’,‘b’,‘1’,‘\n’
字符串常量 “a”,“ab”,“12356”

1.3 变量

  1. 变量的定义

    • 在程序运行过程中其值可以改变
    • 变量在使用前必须先定义,定义变量前必须有相应的数据类型
  2. 标识符命名规则:

    • 标识符不能是关键字
    • 标识符只能由字母、数字、下划线组成
    • 第一个字符必须为字母或下划线
    • 标识符中字母区分大小写
  3. 变量的特点

    • 变量在编译时为其分配相应的内存空间
    • 可以通过其名字地址访问相应内存
  4. 声明和定义的区别

    • 声明变量不需要建立存储空间,如:extern int a;
    • 定义变量需要建立存储空间,如:int b;
    • extern 关键字只做声明,不能做任何定义,没有空间就不可以赋值。
    • 从广义的角度来讲声明中包含着定义,即定义是声明的一个特例,所以并非所有的声明都是定义:
      • int b 它既是声明,同时又是定义
      • 对于 extern b来讲它只是声明不是定义
    • 一般的情况下,把建立存储空间的声明称之为“定义”,而把不需要建立存储空间的声明称之为“声明”。

1.4 示例

#include <stdio.h>
//声明了一个常量,名字叫MAX,值是10,常量的值一旦初始化不可改
#define MAX 10

int main()
{
	//定义了一个变量,其类型为int,名字叫a
	int a;
	//extern 告诉编译器有这个变量,并没有定义,不能赋值
	//声明变量 b 并没有开辟空间
	extern short b;
	//可以将常量的值赋给变量
	a = MAX;
	//%d以整型输出
	printf("%d\n",a);
	//const 修饰的变量,不能通过变量名去修改变量的内容
	const int c = 100;
	printf("%d\n",c);
}

2. 整数

2.1 整型变量的输入和输出

打印格式 含义
%d 输出一个有符号的10进制int类型
%o(字母o) 输出8进制的int类型
%x 输出16进制的int类型,字母以小写输出
%X 输出16进制的int类型,字母以大写输出
%u 输出一个10进制的无符号数
#include <stdio.h>

int main()
{
	int a;
	printf("请输入a的值:");
	//scanf()	从键盘(标准输入)获取数据
	//不能加"\n"
	scanf("%d",&a);

	printf("a = %d\n",a);
	printf("a = %o\n", a);
	printf("a = %x\n", a);
	printf("a = %X\n", a);
	printf("a = %u\n", a);
}

2.2 short、int、long、long long

数据类型 占用空间
short(短整型) 2字节
int(整型) 4字节
long(长整形) Windows为4字节,Linux为4字节(32位),8字节(64位)
long long(长长整形) 8字节

注意:

  • 需要注意的是,整型数据在内存中占的字节数与所选择的操作系统有关。虽然 C 语言标准中没有明确规定整型数据的长度,但 long 类型整数的长度不能短于 int 类型, short 类型整数的长度不能长于 int 类型。
  • 当一个小的数据类型赋值给一个大的数据类型,不会出错,因为编译器会自动转化。但当一个大的类型赋值给一个小的数据类型,那么就可能丢失高位。
整型常量 所需类型
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类型
#include <stdio.h>

int main()
{
	short a = 10;
	int b = 100;
	long c = 1000L;
	long long d = 10000LL;
	//sizeof不是函数,所以不需要包含任何头文件,它的功能是计算一个数据类型的大小,单位为字节
	printf("short长度 = %u\n", sizeof(a));
	printf("int长度 = %u\n", sizeof(b));
	printf("long长度 = %u\n", sizeof(c));
	printf("long long长度 = %u\n", sizeof(d));

	printf("short a = %hd\n",a);
	printf("int b = %d\n", b);
	printf("long c = %ld\n", c);
	printf("long long d = %lld\n", d);

	unsigned short a2 = 20u;
	unsigned int b2 = 200u;
	unsigned long c2 = 2000ul;
	unsigned long long d2 = 20000ull;

	printf("unsigned short a = %hu\n",a2);
	printf("unsigned int a = %u\n", b2);
	printf("unsigned long a = %lu\n", c2);
	printf("unsigned long long a = %llu\n", d2);

	return 0;
}

3.字符型

字符型变量用于存储一个单一字符,在 C 语言中用 char 表示,其中每个字符变量都会占用 1 个字节。在给字符型变量赋值时,需要用一对英文半角格式的单引号(' ')把字符括起来。

字符变量实际上并不是把该字符本身放到变量的内存单元中去,而是将该字符对应的 ASCII 编码放到变量的存储单元中。char的本质就是一个1字节大小的整型

3.1 字符变量的输入和输出

#include <stdio.h>

int main()
{
	char ch;
	printf("请输入ch的值:");

	scanf("%c",&ch);
	//打印输入的字符
	printf("ch = %c\n",ch);
	//打印输入字符的ASCII的值
	printf("ch = %d\n", ch);

	char ch1 = ' ';
	//空字符的ASCII值为32
	printf("空字符:%d\n",ch1);

	//大小写转换
	printf("A = %c\n",'a'-ch1);
	printf("a = %c\n", 'A' + ch1);

	return 0;
}

3.2 转义字符

转义字符 含义 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范围09,af,A~F 3位16进制

4. 浮点型:float、double

实型变量也可以称为浮点型变量,浮点型变量是用来存储小数数值的。在C语言中, 浮点型变量分为两种: 单精度浮点数(float)、 双精度浮点数(double), 但是double型变量所表示的浮点数比 float 型变量更精确。

由于浮点型变量是由有限的存储单元组成的,因此只能提供有限的有效数字。在有效位以外的数字将被舍去,这样可能会产生一些误差。

不以f结尾的常量是double类型,以f结尾的常量(如3.14f)是float类型。

#include <stdio.h>

int main()
{
	//传统方式赋值
	float a = 3.14F;
	double b = 3.14F;
	//打印时默认输出6位小数点
	printf("a = %f\n",a);
	printf("b = %lf\n", b);

	//科学法赋值
	a = 3.2E3F;//3.2*1000
	printf("a = %f\n", a);
	a = 3.2E-3F;//3.2*0.001
	printf("a = %f\n", a);

	//精度损失
	a = 3.1415926;
	//float类型能够保证的精度是7位有效数字
	printf("a = %.8f\n",a);//3.14159250
	//double类型能够保证的精度是15位有效数字
	b = 3.1415926535897939;
	printf("b = %.16lf\n",b);//3.1415926535897940

	return 0;
}

5. 类型限定符

限定符 含义
extern 声明一个变量,extern声明的变量没有建立存储空间。

extern int a;//变量在定义的时候创建存储空间
const 定义一个常量,常量的值不能修改。

const int a = 10;
Volatile 防止编译器优化代码
register 定义寄存器变量,提高效率。register是建议型的指令,而不是命令型的指令,如果CPU有空闲寄存器,那么register就生效,如果没有空闲寄存器,那么register无效。

6. 字符串

  • 字符串是内存中一段连续的char空间,以'\0'(数字0)结尾。
  • 字符串常量是由双引号括起来的字符序列,如“china”、“C program”,“$12.5”等都是合法的字符串常量。
打印格式 对应数据类型 含义
%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 <stdio.h>

int main()
{
	char ch1;
	char ch2;
	char ch3;
	int a;
	int b;
	double c;

	printf("请输入ch1的字符:");
	ch1 = getchar();
	printf("ch1 = %c\n", ch1);

	getchar(); //测试此处getchar()的作用

	printf("请输入ch2的字符:");
	ch2 = getchar();
	////putchar只有一个参数,就是要输出的char
	putchar(ch2);

	putchar('\n');

	getchar(); //测试此处getchar()的作用

	printf("请输入ch3的字符:");
	scanf("%c", &ch3);
	printf("ch3 = %d\n", ch3);

	printf("请输入a的值:");
	scanf("%d", &a);
	printf("a = %d\n", a);
	printf("%ld, %lx, %lo\n", a, a, a);//%ld, %lx, %lo分别表示以十进制,十六进制,八进制输出a的值

	printf("请输入b的值:");
	scanf("%d", &b);
	printf("b = %d\n", b);
	printf("b = '%6d'\n", b);//数据宽度为6,不足部分用空格填充
	printf("b = '%-6d'\n", b);//左对齐且数据宽度为6,不足部分用空格填充
	printf("b = '%06d'\n", b);//数据宽度为6,不足部分用0填充
	printf("b = '%-06d'\n", b);//左对齐且数据宽度为6,不足部分用0填充

	printf("请输入c的值:");
	scanf("%lf", &c);
	printf("c = %lf\n", c);
	printf("c = \'%-10.3f\'\n", c);//数据宽度为10,小数点后保留3位,不足部分用空格填充;

	return 0;
}
posted @ 2024-04-20 21:58  行源之水  阅读(3)  评论(0编辑  收藏  举报