05 数据类型与表达式
1.数据的储存与基本数据类型
1.1 数据的存储
计算机的存储单位:
所有计算机外部的数据都采用统一的数据表示法转换后存入计算机中,当数据从计算机中输出时再还原回来。
这种工作模式叫位模式。
1)位(bit):即数位,是计算机中最小的数据单位,代表设备的某一种状态,0或1。
2)字节(Byte):一个字符在计算机内部存储的时候用了8位。人们选定8位为一个字节(Byte,简记为B)。字节是计算机中用来表示存储空间大小最基本的容量单位。
3)字(Word):字由若干字节构成(一般为字节的整数倍),如16位、32位、64位等。它是计算机进行数据处理和运算的单位。字长是计算机性能的重要标志,不同档次的计算机有着不同的字长。
存储空间容量的单位除用字节表示外,还可以用千字节(KB)、兆字节(MB)及十亿字节(GB)等表示。
缩写 | 全称 | 换算 |
B | Byte 字节 | 1B=8bit |
KB | KiloByte 千字节 | 1KB=1024B |
MB | MegaByte 兆字节 | 1MB=1024KB |
GB | GigaBYte 吉字节/千兆 | 1GB=1024MB |
TB | TeraByte 太字节 | 1TB=1024GB |
在C语言中,各个数据类型所占的字节数根据操作系统的位变化而变化。
1.2 基本数据类型
字符型(character 字符)
char 的使用
char 定义的字符要用单引号‘’将其包围(区分字符串需要用双引号“”包围),用于储存字符,如英文字母、数字或标点。
char a='a';
char b='1';
char c='&';
char d=' ';
单个字符的输入输出
//输入
char ch;
ch = getchar();
scanf("%c",&ch);
//输出
ch = putchar();
printf("%c",ch);
char 的定义与ASCII码
C 语言中保证 char 占用空间的大小足以储存系统所用的基本字符集的编码。
C 语言定义一个字节(byte)的位数为 char 的位数,所以一个字节可能是 16 位,也可能是 32 位,而不仅仅限于 8 位。
char 分配1字节,存储的是ASCII码。
ASCII值 | 控制字符 | ASCII值 | 控制字符 | ASCII值 | 控制字符 | ASCII值 | 控制字符 |
---|---|---|---|---|---|---|---|
0 | NUT | 32 | (Space) | 64 | @ | 96 | 、 |
1 | SOH | 33 | ! | 65 | A | 97 | a |
2 | STX | 34 | " | 66 | B | 98 | b |
3 | ETX | 35 | # | 67 | C | 99 | c |
4 | EOT | 36 | $ | 68 | D | 100 | d |
5 | ENQ | 37 | % | 69 | E | 101 | e |
6 | ACK | 38 | & | 70 | F | 102 | f |
7 | BEL | 39 | , | 71 | G | 103 | g |
8 | BS | 40 | ( | 72 | H | 104 | h |
9 | HT | 41 | ) | 73 | I | 105 | i |
10 | LF | 42 | * | 74 | J | 106 | j |
11 | VT | 43 | + | 75 | K | 107 | k |
12 | FF | 44 | , | 76 | L | 108 | l |
13 | CR | 45 | - | 77 | M | 109 | m |
14 | SO | 46 | . | 78 | N | 110 | n |
15 | SI | 47 | / | 79 | O | 111 | o |
16 | DLE | 48 | 0 | 80 | P | 112 | p |
17 | DCL | 49 | 1 | 81 | Q | 113 | q |
18 | DC2 | 50 | 2 | 82 | R | 114 | r |
19 | DC3 | 51 | 3 | 83 | S | 115 | s |
20 | DC4 | 52 | 4 | 84 | T | 116 | t |
21 | NAK | 53 | 5 | 85 | U | 117 | u |
22 | SYN | 54 | 6 | 86 | V | 118 | v |
23 | TB | 55 | 7 | 87 | W | 119 | w |
24 | CAN | 56 | 8 | 88 | X | 120 | x |
25 | EM | 57 | 9 | 89 | Y | 121 | y |
26 | SUB | 58 | : | 90 | Z | 122 | z |
27 | ESC | 59 | ; | 91 | [ | 123 | { |
28 | FS | 60 | < | 92 | / | 124 | | |
29 | GS | 61 | = | 93 | ] | 125 | } |
30 | RS | 62 | > | 94 | ^ | 126 | ` |
31 | US | 63 | ? | 95 | _ | 127 | DEL |
依ASCII码对照表,可得
char a=48;
char b=65;
char c=97;
a == '0';
b == 'A';
c == 'a';
整型(integer 整数)96
表达整数类型的数据。97
int a =1; //定义了一个专门用来存储整数的变量a,范围是-2147483648到2147483647。
整形修饰符
- short(短整型):缩短整型变量的尺寸,减少取值范围,节省内存。
- long(长整型):增长整型变量的尺寸,增大取值范围,占用更多内存。
- long long(长长整型):增长整型变量的尺寸,增大取值范围,占用更多内存。
- unsigned(非负整型):除整型变量的符号位,使得整型变量只能表达非负整数。
short int a; // 短整型
long int b; // 长整型
long long int c; // 长长整型
unsigned int e; // 无符号整型
unsigned short int f; // 无符号短整型
unsigned long int g; // 无符号长整型
unsigned long long int h; // 无符号长长整型,以上int可以省略
格式控制符
- int 整型:%d
- short 整型:%hd (h代表half,即一半的存储字节)
- long 整型:%ld
- long long 整型:%lld
浮点型(实数)
分类 | 典型尺寸(占用内存越多,精度越高) |
1.单精度浮点型(float) | 4字节(单精度) |
2.双精度浮点型(double)
|
8字节(双精度) |
3.长精度浮点型(long double) | 16字节(长双精度) |
空类型(void*)
指针(*)
结构类型(struct /enum /union)
2.变量的定义与常量的表示
2.1 变量的定义与声明
变量的定义(definition)本质就是要在内存的某个位置开辟空间,用来保存数据,为变量分配存储空间,还可为变量指定初始值。程序中,变量有且仅有一个定义。
定义变量的格式 类型 变量名 = 默认值 ;
int a,b;//定义变量
double d=3.14;//定义变量并初始化
char ch='a';//初始化
ch='d';//赋值->该变量已经存在,即该变量对应的空间已经被开辟,将字符d直接放到一个已经存在的空间中
变量的声明(declaration)向程序表明变量的类型和名字,告知某个变量已经定义好了,不用再重新分配空间,变量的声明可以多次。
2.2 局部变量与全局变量
- 生命周期:该变量从定义到释放(开辟的空间被释放)的时间范围,是描述生存时间长短的问题。
- 作用域:变量的有效区域,衡量影响范围的问题。
- 局部变量的作用域:只在本代码块内有效,全局变量的作用域:整个程序运行期间都有效。
在代码块内定义的变量叫局部变量,局部变量具有临时性,进入代码块自动形成局部变量,退出代码块释放局部变量。
#include<stdio.h>
int main()
{
int a = 10;
if (a == 10){
int b = 20;
printf("a:%d,b:%d\n", a, b);//b只在本代码块内有效
}
printf("a:%d,b:%d\n", a, b);//报错,b不能被访问
return 0;
}
在函数外定义的变量叫全局变量,定义完成之后程序运行的整个生命周期内该变量一直有效,程序结束释放全局变量。
#include<stdio.h>
int a = 100; //全局变量
void fun()
{
printf("fun:全局变量:%d\n",a);
}
int main()
{
fun();
printf("main:全局变量:%d\n",a);
return 0;
}
局部变量与全局变量命名相同时,优先使用局部变量,所有不建议将局部变量与全局变量定义相同的名字。
2.3 常量的表示
整型常量
- 十进制整型常量 由0~9数字组成,不能以0开始,没有前缀。
- 八进制整型常量 以0为前缀,其后由0~7的数字组成,没有小数部分。
- 十六进制整型常量 以0x或0X开头,其后由0~9的数字和a~f(或A~F字母组成)。
- 长整型常量后加后缀L(或1),无符号常量后加后缀U(或u)。
浮点型常量
- 十进制小数形式:由数字和小数点组成,必须有小数点。
- 指数形式:有十进制数、阶码标志“e”或“E”和阶码组成,阶码只能是整数。e和E前面必须有数字,后面必须是整数。
符号常量
C语言中,可以用一个标识符表示一个常量,称之为符号常量,即标识形式的常量。
符号常量是一种特殊的常量,其值和类型是通过符号常量的定义决定的。
符号常量在使用之前必须定义,形式:#define 标识符常量。
#define是一条预处理命令,其功能是把命令格式中的标识符定义为其后的常量值。
字符型常量
字符常量又称字符常数,C语言中的字符常量是用单引号括起来的字符,区分大小写。
1.字符常量只能用单引号括起来。单引号只起界定作用,不表示字符本身;单引号中只能由一个字符,字符可以是字符集中的任意字符;单引号中的字符不能是单引号(')和反斜线(\)。
2.每个字符常量都有一个整数值,就是该数的ASCII码。
3.字符常量区分大小写。
对于一些常用但却难以用一般形式表示的不可显示字符,C语言提供了一种特殊形式的字符常量,即用一个转义标识符“\”(反斜线)开头的字符序列,如表(转义字符及其含义):
字符串常量:字符串常量是用一对双引号括起来的字符串序列。
C语言规定字符串常量的存储方式为:
字符串中的每个字符以其ASCII码值得二进制形式存放在内存中,并且系统自动在该字符串末尾加一个“字符串结束标志”('\0',即ASCII码值为0的字符,它不引起人和控制动作,也不是可显示的字符),以便系统判断字符串是否结束。
例:字符串"a",实际长度为2,包含'a'和'\0'。
3.数据的输入与输出
3.1 scanf() & printf() 函数
都是在stdio.h中声明的函数,因此使用前必须加入#include。
scanf()
1.scanf("输入控制符", 输入参数);
#include <stdio.h>
int main(void)
{
int i;
scanf("%d", &i); //&i 表示变量 i 的地址,&是取地址符
printf("i = %d\n", i);
return 0;
}
2.一次给多个变量赋值
#include <stdio.h>
int main(void)
{
int i, j;
scanf("%d%d", &i, &j);
printf("i = %d, j = %d\n", i, j);
return 0;
}
printf()
printf("格式控制字符串", 输出列表);
1、格式化输出整型:d 格式,用来输出十进制整数。
- %d:按整型数据的实际长度输出;
- %md:m为指定的输出宽度。如果数据的位数小于m,则左端补空格;若大于m,则按实际位数输出;
- %0md:同上,但这里如果数据的位数小于m,则左端补0;若大于m,则按实际位数输出。
#include <stdio.h>
int main()
{
int x=1;
int y=2;
printf("1.x: %d,y: %d\n",x,y);
printf("2.x: %4d,y: %4d\n",x,y);
printf("3.x: %04d,y: %04d\n",x,y);
return 0;
}
2、格式化输出浮点型:f 格式,用来输出小数。
- %f:整数部分全部输出,并输出6位小数;
- %.nf:整数部分全部输出,并输出n位小数;
- %m.nf:输出共占m列,n位小数,若数值宽度小于m则左端补空格。
#include <stdio.h>
int main()
{
double x=8.12345678;
double y=16.12345678;
printf("1.x: %f,y: %f\n",x,y);
printf("2.x: %.2f,y: %2f\n",x,y);
printf("3.x: %6.2f,y: %6.2f\n",x,y);
printf("3.x: %06.2f,y: %06.2f\n",x,y);
return 0;
}
3.格式化输出字符串:s 格式,用来输出字符串。
- %s:输入全部字符串;
- %ms:输出的字符串共占m列,若字符串本身的长度小于m,则左补空格;若字符串本身的长度大于m,则全部输出。
#include <stdio.h>
int main()
{
char s[] = "hello";
printf("1. s: %s\n", s);
printf("2. s: %8s\n", s);
return 0;
}
4.输出的数据向左对齐 %-m.nf