数据类型 第3章 3.1 C数据类型概述 3.2 常量 3.3 变量 3.4 基本输入与输出
3.1 C数据类型概述 数据类型是一个值的集合以及定义在这个值集上的一组操作的总称。如:整数类型int,其值为[-32768,32767],基本操作为:加、减、乘、整除和取模。 枚举类型 (Ch12) 数据类型 基本类型 整型 数组类型 (Ch6) 字符型 实型 结构体类型 (Ch9) 共用体类型 (Ch12) 指针类型 (Ch8、Ch11) 空类型(void) 构造类型 注:数据可分为常量和变量,它们分属上述类型。
? 3.2 常 量 常量——就是其值在程序运行过程中不能被改变的量,它相当于数学中的常数。 常量是什么呢 3.2 常 量 ? 常量——就是其值在程序运行过程中不能被改变的量,它相当于数学中的常数。 常量是什么呢 在C语言中常量可分为一般常量和符号常量共两类。
常量的使用 一般常量的使用 …… int year; year=1999; year=year+1; /* 1999 和 1 为一般常量 */
符号常量的使用 #define PI 3.14159 //定义符号常量 void main() { int r; float l; r=10; l=2*PI*r; printf(“周长=%f\n”, l); } void main() { int r; float l; r=10; l=2*3.14159*r; printf(“周长=%f\n”, l); } PI也是一个常量,称之为符号常量,由#define 命令定义,代表常数3.14159。编绎时编译系统自动将所有的PI替换成3.14159。 符号常量定义方法: #define 常量标识符 常量
3.3 变 量 变量——就是其值在程序运行过程中可以改变的量。 3.3 变 量 变量——就是其值在程序运行过程中可以改变的量。 变量就相当于图中用同一杯子装载不同的物质,当装载物质不同时,整个杯子的值也就发生了变化。
cup 物质性质 杯中物质 杯 子 液体 变量名 变量值 char ‘w’ ‘m’ ‘c’ ‘g’ 变量类型 水、牛奶 咖啡、汽油 杯 子 变量名 cup 变量值 ‘w’ ‘m’ ‘c’ ‘g’ 变量类型 char (字符型)
变量定义(声明) 变量定义(声明)的格式: 类型标识符 变量表列; 例如:int a, b, sum; 注意变量标识符的命名规则。 类型标识符 变量表列; 例如:int a, b, sum; 注意变量标识符的命名规则。 C语言严格区分大小写,大小写为不同字符,标识符有效长度为31个字符。
变量定义(声明) #include <stdio.h> void main() { int num1, num2, sum; sum=num1+num2; printf(“sum=%d\n”, sum); num1=-5; // 变量赋值 num2=num1+3; } 变量定义(声明) 程序中的num1, num2和sum都是变量,它们的值在程序运行过程中都发生了变化。 变量定义(声明)之后,各变量的初值都是不确定的。 num1的第一个确切值是10,当再次给num1赋值后,它的值就变成了-5。变量num2和sum的变化情况类似。如下图所示: 初始状态: 第1次赋值后: 第2次赋值后: 不确定 10 -5 num1 25 -2 num2 35 -7 sum
变量赋值与初始化 变量初始化 变量赋值格式 例如: int k=1000; 变 量 = 表达式 例如: i=10; j=100; 并且初值为1000 */ 变 量 = 表达式 例如: i=10; j=100; i=j+30; sum=100+j; int k; k=1000;
整型数据 整型常量 1. 十进制整数:30,100,70 2. 八进制整数 3 . 十六进制整数 例如: void main() { 1. 十进制整数:30,100,70 2. 八进制整数 3 . 十六进制整数 例如: void main() { int a, b, c; a=50; b=35; c=10; printf(“a=%d, b=%d, c=%d\n”, a, b, c); } a=50,b=35, c=10
整型变量 整型变量类型 基本型:int 短整型:short [int] 长整型:long [int] 无符号型:unsigned [int] , unsigned short , unsigned long 例如: int a=-2; short int b=32765; long int c=-2; unsigned int d=65534; unsigned short e=32765; unsigned long f=-2;
整型变量存储形式及范围 对于有符号整数: 最高位为1表示负数; 最高位为0表示正数。 对于无符号整数: 最高位也是数值位! 类型 字节 数据范围 在内存中的存储情况 int ▊ ▊ -215~(215-1) -32768 ~ 32767 1111111111111110 [-2] short int ▊ ▊ -215~(215-1) 0111111111111101[32765] long int ▊ ▊ ▊ ▊ -231~(231-1) 1111111111111111 1111111111111110 [-2] unsigned int ▊ ▊ 0~(216-1) 1111111111111110[65534] unsigned short ▊ ▊ 0~(216-1) 0111111111111101[32765] unsigned long ▊ ▊ ▊ ▊ 0~(232-1) 0000000000000000 1111111111111111[65535] 对于有符号整数: 最高位为1表示负数; 最高位为0表示正数。 对于无符号整数: 最高位也是数值位!
整型数据的输出格式 %d 十进制带符号整数形式 %u 十进制无符号整数形式 %ld 十进制带符号长整数形式 %lu 十进制无符号长整数形式 void main() { int a=-1, b=32767; long c=-1; printf("a=%d, %u\n", a, a); printf("b=%d, %u\n", b, b); printf("c=%ld, %lu\n", c, c); } 输出结果是:
整型常量的类型 值在-32768 ~ +32767之间为int型,可赋给int、long int型变量 值在-231 ~ -32769或32768 ~ (231-1)之间为long型,可赋给long 型变量 若short int 与int在内存中长度相等 ,int型常量也是short int型,可以赋给int、short int型变量 常量中无unsigned型
实型数据 实型常量 实型变量 实型数据的输出格式:%f 1. 十进制:.678, 798., 123.0, 0.123 (必须有小数点) 1. 十进制:.678, 798., 123.0, 0.123 (必须有小数点) 2. 指数形式:数 e或E 整数 123E3, 123e3 相当于123103 实型变量 float 4B 6~7位有效数字 3.4×10-38 ~ 3.4×1038 double 8B 15~16位有效数字 1.7×10-308 ~ 1.7×10308 long double 10B 18~19位有效数字 3.4×10-4932 ~ 3.4×104932 实型数据的输出格式:%f
字符型数据 字符常量 1、用单引号括起来的1个字符:‘a’ ‘A’ ‘#’ ‘*’ 2、以“\”开头的转义字符 \n \r \t \\ \v 功 能 \n 换行 \r 回到同行首部 \t 横向跳格 (跳到下一个输出区) \\ 反斜杠字符 \v 竖向跳格 \' 单引号字符 \b 退格 \" 双引号字符
字符型数据 例如 void main() { printf(“□c\t□de\ra\tY\b=\n”); printf(“\376”); } 结果 123456789 显示结果:a =de ■ □c □de a Yde a =de 变化情况
字符变量 字符数据在内存中存储形式及使用方法: 定义(声明):char 变量名; 注:只能存放一个字符,不能存放若干个字符 如:char c1=‘A’, c2=‘#’; 字符数据在内存中存储形式及使用方法: char数据在内存中占1B,存储该字符的ASCII码,可以以字符或整数输出 如:c1=‘a’ ASCII为97 内存存储形式: 01100001 c2=‘A’ ASCII为65 内存存储形式: 01000001 注:在TC中字符型变量最高位被当成符号位; 在TC中允许使用unsigned char即无符号字符型变量
字符串常量 由一对双引号括起来的字符(或转义字符)序列。 如:“How are you ?” “Hello World !\n” 区 别: ‘a’ “a” 存储形式: ┌─┐ ┌─┬─┐ │97│ │97│\0│ └─┘ └─┴─┘ 存放变量: 字符变量 字符数组 实际长度: 1 2
3.4 基本输入与输出 例:输入两个字符并回显这两个字符。 # include <stdio.h> void main() { 3.4 基本输入与输出 例:输入两个字符并回显这两个字符。 # include <stdio.h> void main() { char c1, c2; c1=getchar(); c2=getchar(); putchar(c1); putchar(c2); } 使用命令:#include <stdio.h> 字符I/O:getchar / putchar 格式化I/O:scanf / printf 字符输出函数: putchar() 字符输入函数: getchar() 不能按如下形式输入: x<CR> y<CR> 因为输入x<CR>后,c1得‘x’,c2得‘\n’,因此输出结果为: x 运行情况如下: xy<CR> xy
格式化输出函数printf 格式:printf(“格式控制”,输出参数表列) 例:printf(“a=%d,b=%d\n”, a, b); 格式控制: 格式字符:%格式字符 (如%d、%s、%c、%f ) 普通字符:字母、汉字、数字等 转义字符:\n,\t 等 输出参数表列: 变量:printf(“x=%d, y=%d\n”, x, y); 字符串:printf(“%s\n”, “How do you do?”); 表达式:printf(“%d%d\n”, x+y/10, x*y);
格式字符 u 以无符号十进制形式输出整数 c 以字符形式输出,只输出一个字符 s 输出字符串 格式字符 说 明 d 以带符号的十进制形式输出整数(正数不输出符号) u 以无符号十进制形式输出整数 c 以字符形式输出,只输出一个字符 s 输出字符串 f 以小数形式输出单、双精度数,隐含输出六位小数 e 以标准指数形式输出实数,尾数部分保留六位有效数字 g 自动选用%f或%e格式输出,不输出无意义的0
整型数据格式字符 基本整型数据格式字符: (1) d格式符,以十进制形式输出基本整型数据; (2) ld格式符,以十进制形式输出长整型数据; (3) lu格式符,以十进制形式输出无符号长整型数据。 例如: int a=-2; printf("%d, %ld, %lu\n", a, a, a); 输出结果为: -2, -2, 4294967294
指定输出宽度 两个附加格式字符m和-。其中m为一正整数,用来指定输出宽度,如果数据的实际宽度比指定输出宽度小,则补上空格后按指定宽度输出,如果数据的实际宽度比指定输出宽度大,则按实际宽度输出; 附加格式符“-”是用来说明采用左对齐方式,没有“-”时默认是右对齐方式。附加格式符放在%和格式符之间使用。 运行结果为: a=□-4,□b=□45,□c=456,□d=4567 a=-4□,□b=45□,□c=456,□d=4567 u=456□□,□u=□□456,□l=456□□,□l=□□456 【例】 void main() { int a=-4, b=45, c=456, d=4567; unsigned u=456; long l=456; printf("a=%3d, b=%3d, c=%3d, d=%3d\n", a, b, c, d); printf("a=%-3d, b=%-3d, c=%-3d, d=%-3d\n", a, b, c, d); printf("u=%-5u, u=%5u, l=%-5ld, l=%5ld\n", u, u, l, l); }
字符和字符串类型数据格式字符 字符类型数据格式字符: c c格式符用来输出字符类型数据,亦可以对整型数据进行输出。例如: char c1='A', c2='B'; int a=97, b=98; printf("%c%c%c%c%c\n", c1, c2, '\n', a, b); 的输出结果为: AB ab 字符串类型数据格式字符: s s格式符是用来输出字符串类型数据,如: printf("%s\n%s\n", "Jiang Xi", "Nan Chang"); 的输出结果为: Jiang Xi Nan Chang
指定输出宽度 【例】 void main() { char c1='A'; int c2=98; printf("c1=%-3c, c2=%3c\n", c1, c2); printf("str1=%-8s, str2=%8s\n", "JXCJDX", "JXCJDX"); printf("str3=%-8.2s, str4=%8.4s\n", "JXCJDX", "JXCJDX"); printf("str5=%-.4s, str6=%.4s\n","Information","Information"); } .n的作用时只取字符串左端n个字符输出 运行结果如下: c1=A□□, c2=□□B str1=JXCJDX□□, str2=□□JXCJDX str3=JX□□□□□□, str4=□□□□JXCJ str5=Info, str6=Info
实型数据格式字符 格式符: f 指定输出宽度: (1) %m.nf m列,保留n位小数 (2) %-m.nf m列,保留n位小数,左对齐
注意: 1.数据类型与格式说明字符要匹配,否则将会出现错误。 2.Turbo C要求格式字符要用小写字母 3.可以在格式控制字符串内包含转义字符 4.上面介绍的d,, u, c, s, f, e, g等字符,如用在“%”后面就作为格式符号,否则作为普通字符。 5.如果想输出字符‘%’,则应该在格式控制字符串中用连续两个%表示 6.不同的系统在实现格式输出时,输出结果可能会有一些小的差异。
指定输出宽度 【例】 void main() { float a=34.567898765; double b=12345678.87654321; printf("a=%f, a=%8.2f, a=%8.2f, a=%.2f\n",a,a,a,a); printf("a=%e, a=%-12.3e, a=%12.3e, a=%.3e\n ",a,a,a,a); printf("a=%10e,b=%f, b=%e, b=%g, b=%8.4g\n", a,b,b,b); } 运行结果如下:
格式输入函数 scanf 一般形式: scanf(“格式控制”, 地址表列); “格式控制”的含义同printf函数,地址表列是由若干个地址组成的表列,可以是变量的地址,或字符串的首地址。 【例】 void main() { int a, b, c; scanf("%d%d%d", &a, &b, &c); printf("a=%d, b=%d, c=%d\n", a, b, a+b); }
注意: 1、格式控制中的普通字符照原样输入: scanf(“a=%d, b=%d”, &a, &b); 输入:a=12, b=4↙ 2、对于格式符“%c%c”,输入的若干字符之间不必使用分隔符,它会读取遇到的任何字符,包括换行符’\n’及空格符’□’。 3、在输入数值数据(整数或实数)时,遇以下情况结束该数据: (1) 遇空格符,或回车换行符或跳格(Tab健)符。 (2) 遇宽度结束,如“%3d”,只取3列。 (3) 遇非法输入。如: scanf("%d%c%f", &a, &b, &c); scanf("%c%f", &d, &e); 若输入:1234a123o.26<CR> 则:将1234送给变量a;字符'a'送给变量b;123送给变量c;'o'赋给变量d,将.26赋给变量e。
根本无法实现正确输入!!! 运行情况如下: Please input 2 int number: a=12, b=24<CR> Please input 2 real number: c=3.14, d=2.5<CR> a=12, b=24 c=3.14, d=2.50 例:带分隔符的整型数据的格式输入。 #include <stdio.h> void main() { int a, b; float c, d; printf("Please input 2 int numbers:\n"); scanf("a=%d, b=%d", &a, &b); getchar(); /* 用来读取给变量a, b输入数据后的回车换行符 */ printf("Please input 2 real nembers:\n"); scanf("c=%f, d=%f", &c, &d); printf("a=%d, b=%d\n", a, b); printf("c=%.2f, d=%.2f\n", c, d); } 建议在输入函数的格式控制中,不要使用普通字符。特别是如下语句: scanf(“%d\n”, &x); 根本无法实现正确输入!!!