第一节 常量
-
2.1 数据形式
-
数据有两种表现形式:
常量
和变量
。 -
常量:在程序运行过程中,值不能被改变的量称为常量。
-
-
代码示例:
-
//整型常量 #include <stdio.h> int main() { int a, b, c; a = 1001; b = 21; c = a + b; printf("c = %d\n", c); return 0; }
-
//实型常量-->十进制小数形式 #include <stdio.h> int main() { double a = 12.3, b = 2.35, c; c = a + b; printf("c = %f\n", c); return 0; }
-
//实型常量-->指数形式 #include <stdio.h> int main() { double a = 12.3e4, b = 2.35e4, c; c = a + b; printf("c = %f\n", c); return 0; }
-
//字符常量-->普通字符 #include <stdio.h> int main() { char c = 'a'; printf("%c\n", c); return 0; }
-
//字符常量-->转义字符 #include <stdio.h> int main() { char c = 'a'; printf("%c\n", c); return 0; }
-
-
转义字符
-
转义字符 字符值 输出结果 \’ 一个单撇号( ’ ) 输出单撇号字符 ’ \" 一个双撇号( " ) 输出双撇号字符 " \? 一个问号( ? ) 输出问号字符 ? \\ 一个反斜线( \ ) 输出反斜线字符 \ \a 警告(alert) 产生声音或视觉信号 \b 退格(backspace) 将光标当前位置后退一个字符 \f 换页(form feed) 将光标当前位置移到下一页的开头 \n 换行 将光标当前位置移到下一行的开头 \r 回车(carriage return ) 将光标当前位置移到本行的开头 \t 水平制表符 将光标当前位置移到下一个Tab位置 \v 垂直制表符 将光标当前位置移到下一个垂直制表符对齐点 \o、\oo或\ooo
其中o代表一个八进制数字与该八进制码对应的ASCII字符 与该八进制码对应的ASCII字符 \xh[h…]
其中h表示一个十六进制数字与该十六进制码对应的ASCII字符 与该十六进制码对应的ASCII字符 //字符常量-->转义字符 #include <stdio.h> int main() { char c = '\''; printf("%c\n", c); return 0; }
-
//字符串常量 #include <stdio.h> int main() { char a[15] = "hello world"; printf("%s", a); return 0; }
-
//符号常量 #define PI 3.1415926 #include <stdio.h> int main() { printf("%f\n", PI); return 0; }
-
-
第二节 变量&常变量&标识符命名规则
-
变量:变量代表一个有名字、具有特定属性的一个存储单元。用来存放数据,也就是存放变量的值。
变量必须先定义,后使用
。在定义时指定该变量的名字和类型。变量名实际上是以一个名字代表的一个存储地址。从变量中取值,实际上是通过变量名找到相应的内存地址,从该存储单元中读取数据。-
在程序运行期间,变量的值是可以改变的。
-
-
代码示例
-
//变量 #include <stdio.h> int main() { double a = 12.3, b = 2.35; a = a + b; printf("a = %f\n", a); return 0; }
-
变量和常量的关系:变量中存储了常量,例如上述代码中的a和b,但a和b里面存储了常量中的双精度浮点型常量12.3和2.35。
-
-
常变量:在定义变量时,前面加一个关键字
const
,例如 const int a = 3;-
const
在变量存在期间其值不能改变。 -
代码示例:
-
//常变量 #include <stdio.h> int main() { const int a = 3; a = a + 1; //报错,常变量在变量存在期间值不能改变 printf("a = %d\n", a); return 0; }
-
常变量与符号常量的区别:
- 在程序中都可以使用,但是性质有不同;在预编译后,符号常量就不存在,直接置换成对应的值,符号常量的名字不分配存储单元,而常变量要占用存储单元。
-
-
标识符:在计算机高级语言中,用来对变量、符号常量名、函数、数组、类型等命名的有效字符序列统称为标识符。
- 命名规则:只能由字母、数字、下划线3种字符组成,且第一个字符必须为字母或下划线。
- 注:大写字母和小写字母是两个不同的字符。因此例如A_1和a_1是两个不同的变量。
第三节 数据类型
-
C语言要求在定义所有的变量时都要指定变量的类型。
-
为什么要指定数据类型?
- 计算机存储空间是有限的,不能无限存储数据。
- 所谓类型,就是对数据分配存储单元的安排,包括存储单元的长度(占多少字节)以及数据的存储形式。不同的类型分配不同的长度和存储形式。
-
-
整型数据的分类:
-
基本整型(int)
-
编译系统分配给int型数据2个字节或4个字节,visual c++分配4个字节,可容纳的数值范围为
-2^31 ~ 2^31 - 1
,即-2147483648 ~ 2147483647
。 -
-
在存储单元中的存储方式:用整数的补码形式存放。
-
在存放整数的存储单元中,最左面一位是用来表示符号的。如果该位为0,表示数值为正;如果该位为1,表示数值为负。
-
求负数补码的方法:先将所求数的绝对值写成二进制形式,然后对其所有二进位按位取反,再加1。
-
代码示例:
-
#include <stdio.h> int main() { int a,b; a = 2147483647; printf("a = %d\n", a); return 0; }
-
-
短整型(short int)
-
类型名为short int或short,编译系统分配2个字节,可容纳的数值范围为
-2^15 ~ 2^15 - 1
,即-32768 ~ 32767
。 -
代码示例
-
//短整型 #include <stdio.h> int main() { short int a = 32766; printf("a = %d\n", a); return 0; }
-
-
长整型(long int)
-
类型名为long int或long,编译系统分配4个字节,可容纳的数值范围为
-2^31 ~ 2^31 - 1
,即-2147483648 ~ 2147483647
。 -
代码示例
-
//长整型 #include <stdio.h> int main() { long int a = 2147483647; printf("a = %d\n", a); return 0; }
-
-
双长整型(long long int)
-
类型名为long long int或long long,编译系统分配8个字节,可容纳的数值范围为
-2^63 ~ 2^63 - 1
,即-9223372036854775808 ~ 9223372036854775807
。 -
代码示例
-
//双长整型 #include <stdio.h> int main() { long long int a = 9223372036854775807; printf("a = %d\n", a); return 0; }
-
-
-
整数变量的无符号属性(unsigned)
-
在实际应用中,有些数据的范围只有正数值(如学号、年龄等),为了利用整型数据值的范围,可以将变量定义为“无符号”类型。
-
-
代码示例
-
//无符号双长整型 #include <stdio.h> int main() { unsigned long long a = 9923372036854775807; printf("a = %d\n", a); return 0; }
-
整型数据常见的存储空间和值的范围
-
类型 字节数 取值范围 int(基本整型) 4 -2^31 ~ 2^31 - 1
,即-2147483648 ~ 2147483647
unsigned int(无符号基本整型) 4 0 ~ (2^32 - 1),即0 ~ 4294967295
short(短整型) 2 -2^15 ~ 2^15 - 1
,即-32768 ~ 32767
unsigned short(无符号短整型) 2 0 ~ (2^16 - 1),即0 ~ 65535
long(长整型) 4 -2^31 ~ 2^31 - 1
,即-2147483648 ~ 2147483647
。unsigned long(无符号长整型) 4 0 ~ (2^32 - 1),即0 ~ 4294967295
long long(双长型) 8 -2^63 ~ (2^63 - 1)
,即-9223372036854775808 ~ 9223372036854775807
unsigned long long(无符号双长整型) 8 0 ~ (2^64 - 1),即0 ~ 18446744073709551615
-
第四节 字符型数据&浮点型数据
-
字符型数据
- 由于字符是按其代码(整数)形式需相互的,因此C99把字符型数据作为整数类型的一种。但是,字符型数据在使用上有自己的特点。
- 使用
char
定义字符变量,占1个
字节,对应ASCII码范围:0 ~ 127
。 - 字符类型也属于整型,也可以用unsigned修饰符。
unsigned char
:占用1个
字节,取值范围:0 ~ 255
。- 代码示例
//字符常量 # include <stdio.h> int main() { char c = 97; printf("%c\n", c); return 0; }
-
浮点型数据
-
-
浮点型数据是用来表示具有小数点的实数的,如:10是整型常量,10.0是浮点型常量。
-
为什么在C中把实数称为浮点数?
- 实数是以指数形式存放在存储单元中。如: 3.14159可以表示为3.14159×10^0, 0.314159×10^1, 31.4159×10^-1 ,小数点可以在314159几个数字之间、之前或之后浮动 。
-
代码示例
-
//float #include <stdio.h> int main() { float a;//分配4个字节,6位有效数字 a = 3.40E37f;//出现警告,由于系统默认使用双精度,故在末尾加上f printf("a = %f\n", a); return 0; }
-
//double #include <stdio.h> int main() { double b;//分配8个字节,15位有效数字 b = 1.7e308; printf("b = %f\n", b); return 0; }
-
-
第五节 运算符和表达式
-
C语言提供了以下运算符:
-
运算符 表示 算术运算符 (+ - * / % ++ --) 关系运算符 ( > < == >= <= !=) 逻辑运算符 (! && ||) 位运算符 (<< >> ~ | ^ &) 赋值运算符 ( = 及其扩展赋值运算符) 条件运算符 (? :) 逗号运算符 ( , ) 指针运算符 ( * &) 求字节数运算符 (sizeof) 强制类型转换运算符 ( (类型) ) 成员运算符 (. ->) 下标运算符 ( [ ] ) 其他 ( 如函数调用运算符( ) )
-
-
除法运算符:/
-
两个实数相除的结果是双精度实数,两个整数相除的结果为整数,例如5/3= 1;舍去了小数部分。但是如果除数或被除数中有一个为负数,则舍入的方向不固定。例如-5/3,有的系统中得到的结果为-1,有的系统为-2。多数编译器(如visual C++)采取向零靠拢,即结果为-1。
-
-
代码示例
-
//除法运算符 / #include <stdio.h> int main() { float a = 5, b = 3, c; c = a / b; printf("sum = %f\n", c);//结果为双精度数1.66667 return 0; }
-
//求余运算符 % #include <stdio.h> int main() { int a = 10, b = 3, c; c = a % b; printf("sum = %d\n", c); return 0; }
-
-
自增(++)、自减(–) 运算符
-
自增(++)、自减(–)运算符的作用是使变量的值加1或减1;
-
++i 在使用i之前,先使i的值加1
–i 在使用i之前,先使i的值减1
i++ 在使用i之后,使i的值加1
i-- 在使用i之后,使i的值减1
-
代码示例
-
//++ --运算符 #include <stdio.h> int main() { int a = 3; printf("a1 = %d\n", a++); //3 printf("a2 = %d\n", ++a); //5 printf("b1 = %d\n", a--); //5 printf("b2 = %d\n", --a); //3 return 0; }
-
-
运算符的优先级
-
-
代码示例
-
//运算符优先级 #include <stdio.h> int main() { int a = 2, b; b = 3 + 4 * (-2) % (++a); printf("b = %d\n", b); //b = 1 return 0; }
-
-
-
不同类型数据间的混合运算
-
规律:
- +、-、*、/运算的两个数中有一个数为float或double型,系统将所有float型数据转换为double型,然后进行运算,结果为double型。
- 如果int型与float或double型数据进行运算,先把int型和float型转换为double型,然后进行运算,结果为double型。
- 字符(char)型数据与整型数据进行运算,就是把字符的ASCII代码与整型数据进行运算。如果与实型数据进行运算,将对应字符的ASCII码转换为double型数据,然后进行运算。
-
代码示例
-
//不同类型数据间的混合运算 #include <stdio.h> int main() { int a = 2; char b = 'y';//y字符对应的ASCII码121 float c = 1.34f; printf("a + c = %f\n", a + c);//系统自动完成类型转换 printf("a + b = %f\n", a + b);//系统自动完成类型转换 return 0; }
-
-
练习:给定一个大写字母,输出对应的小写字母
-
#include <stdio.h> int main() { char c; printf("请输入一个大写字母:"); scanf("%c", &c); c += 32; printf("对应的小写字母为:%c\n", c); return 0; }
-
-
-
强制类型转换运算符
-
利用强制类型转换运算符将一个表达式转换成所需类型。例如:
- (double)b 将b的值强制转换为double型
- (int)(a+b) 将a+b的结果强制转换为int型
- (float)(5%3) 将5%3的结果强制转换为float型
-
代码示例
-
//强制类型转换-1 #include <stdio.h> int main() { int a = 2; float b = 1.34f; printf("%d\n", (int)(a+b));//3 return 0; }
-
//强制类型转换-2 #include <stdio.h> int main() { float a = 7.98f; printf("%d\n", (int)(a%3));//1 return 0; }
-
-
第六节 赋值语句
-
赋值运算符
=
-
将一个数据赋给一个变量。
-
代码示例
-
//赋值运算符 #include <stdio.h> int main() { int a; a = 4; }
-
-
-
复合赋值运算符
-
在
=
之前加上其他运算符,可以构成符合的运算符,例如:- a += 3 等价于a = a+3
- a *= 3 等价于a = a*3
- a %= 3 等价于a = a%3
-
代码示例
-
//复合赋值运算符 #include <stdio.h> int main() { int a = 8; a += 4; // -= /= *= %= printf("%d\n", a);//12 return 0; }
-
-
-
赋值表达式
-
规则:赋值运算符按照“自右而左”的结合顺序,如:
- a = (b = 5) 等效于b = 5 , a = b
- a = 5 +(c =6) c的值为6,a的值为11
- a = (b =4) + (c =6) c为6 ,b为4,a的值为10
- a = (b = 10)/(c =2) c为2,b为10, a的值为5
-
代码示例
-
//赋值表达式 #include <stdio.h> int main() { int a, b; a = (b = 5); printf("a = %d\nb = %d\n", a, b);//a = 5 b = 5 return 0; }
-
-
-
赋值过程中的类型转换
-
- 如果赋值运算符两侧的类型一致,则直接进行赋值。如:
- i = 123,直接将整数123存储到i对应的存储空间中。
-
- 如果赋值运算符两侧的类型不一致,则在赋值时需要进行类型转换;转换规则为:
- (1)、浮点数赋值给整型变量时,先对浮点数取整(舍弃小数部分),再赋值给变量。
- (2)、整型数据赋值给浮点数时,数值不变,但以浮点数形式存储到变量中。
- (3)、将一个double型数据赋给float变量时,先将双精度数转换为单精度,再进行存储。
- (4)、字符型数据赋给整型变量时,将字符的ASCII码赋给整型变量。
- (5)、将一个占字节多的整型数据赋给一个占字节少的整型变量或字符变量时,只将低字节原封不动的送到被赋值的变量(发生截断)。
- char类型只有一个字节,只保留二进制289的后8位,故为33,见代码示例-2最后。
- 如果赋值运算符两侧的类型不一致,则在赋值时需要进行类型转换;转换规则为:
-
代码示例
-
//赋值过程中的类型转换-1 #include <stdio.h> int main() { int a; a = 4; printf("%d\n", a); }
-
//赋值过程中的类型转换-2 #include <stdio.h> int main() { int a; a = 3.14; printf("%d\n", a);//3 float b; b = 3; printf("%f\n", b);//3.000000 float c; c = 1.434343434343; printf("%f\n", c);//1.434343 int i = 289; char d = 'a'; d = i; printf("%d\n", d); //33 }
-
-
-
变量赋初值
-
可以用赋值语句对变量赋值,也可以在定义变量时对变量赋以初值,使程序简练,例如:int a = 3, b = 2, c = 1;
-
也可以使被定义的变量的一部分赋初值,例如:int a, b, c = 5;
-
一般初始化变量不是在编译阶段完成的(只有在静态存储变量和外部变量的初始化是在编译阶段完成的),而是在程序运行时执行本函数时赋予初值的,相当于执行一个赋值语句,例如 int a = 3; 相当于 int a; a = 3;
-
代码示例
-
//变量赋初值 #include <stdio.h> int main() { //int a = 3, b = 2, c = 1; int a, b, c; a = 3; b = 2; c = 1; // int a = b = c; //错误写法,不允许这样写 printf("%d\n", a); return 0; }
-
-
第七节 数据的输入输出
-
注意:
-
- 所谓输入输出是以计算机主机为主体而言的,从计算机向输出设备(显示器、打印机等)输出数据称为输出,从输入设备(键盘、鼠标、扫描仪等)向计算机输入数据称为输入。
-
-
- C语言本身不提供输入输出语句,输入和输出操作是由C标准函数库中的函数来实现的。在C标准函数库中用来实现输入和输出的函数主要是:scanf和printf。
- 要在程序文件的开头用预处理指令
#include
把有关头文件放在本程序中。
-
-
用printf函数输出数据
-
函数格式:
printf(格式控制, 输出表列)
-
格式控制:用双撇号括起来的一个字符串,称为
格式控制字符串
,简称格式字符串
。包含两部分:
①格式声明:格式声明由
“%”
和格式字符
组成,例如:%d、%f等。它的作用是将输出的数据转换为指定的格式后输出,格式声明总是由"%"字符开始的。②普通字符:需要在输出时
原样输出
的字符。 -
输出表列:程序需要输出的一些数据,可以是常量、变量或表达式。
-
-
格式字符:
-
可以在格式声明中指定输出数据的域宽(所占的列数),如用"%5d",指定输出数据占5列,输出的数据显示在此6列区域的右侧。
printf("%5d\n", 12);//12前面有3个空格
-
-
代码示例
-
//d格式符 #include <stdio.h> int main() { printf("a = %d\nb = %ld\n", 74, -2134748); return 0; }
-
//c格式符 10c域宽 #include <stdio.h> int main() { char c = 's'; printf("c = %10c\n", c);//s前面有9个空格 return 0; }
-
//s格式符 #include <stdio.h> int main() { printf("%s\n", "C程序设计"); return 0; }
-
//f格式符 #include <stdio.h> int main() { float a = 1.0, b = 3.0; printf("%f\n", a/b);//0.333333 printf("%-20.8f\n", a/b);//0.33333333,左对齐,后有10个空格 return 0; }
-
//e格式符 #include <stdio.h> int main() { printf("%E\n", 12.34);//1.234000E+001 return 0; }
-
-
其他格式符
-
格式字符 说明 d,i 以带符号的十进制形式输出整数(正数不输出符号) o 以八进制无符号形式输出整数 x,X 以十六进制无符号形式输出整数,用x则输出十六进制数的a~f时,以小写形式输出,用X时,则以大写字母输出 u 以无符号十进制形式输出整数 c 以字符形式输出,只输出一个字符 s 输出字符串 f 以小数形式输出单、双精度数,隐含输出6位小数 e、E 以指数形式输出实数,用e时指数以‘e’表示,用E时指数以‘E’表示 g,G 选用%f或%e格式中输出宽度较短的一种格式,不输出无意义的0。用G时,若以指数形式输出,则指数以大写表示
-
-
代码示例
-
//g格式字符 #include <stdio.h> int main() { double b = 12.34; printf("%g\n", b); //12.34 return 0; }
-
-
printf函数中用到的格式附加字符
-
字符 说明 l 长整型整数,可以加在格式符d、o、x、u前面 m 数据最小宽度 n 对实数,表示输出n位小数;对字符串,表示截取的字符个数 - 输出的数字或字符在域内向左靠
-
-
-
-
用scanf函数输入数据
-
函数格式:
scanf(格式控制, 地址表列)
-
格式控制:用双撇号括起来的一个字符串,称为
格式控制字符串
,简称格式字符串
。包含两部分:
①格式声明:格式声明由
“%”
和格式字符
组成,例如:%d、%f等。它的作用是将输入的数据转换为指定的格式后输入。②普通字符:需要在输出时
原样输入
的字符。 -
地址表列是由若干个地址组成的表列,可以是变量的地址或字符串的首地址。
-
-
代码示例
-
//scanf函数 #include <stdio.h> int main() { int a; scanf("%d", &a); printf("输入的数字为:%d\n", a); return 0; }
-
-
scanf函数中用到的格式字符
-
格式字符 说明 d,i 输入有符号的十进制整数 o 输入无符号的八进制整数 x,X 输入无符号的十六进制整数(大小写作用相同) u 输入无符号的十进制整数 c 输入单个字符 s 输入字符串,将字符串送到一个字符数组中,在输入时以非空白字符开始,以第一个空白字符结束。字符串以串结束标志 ‘\0’作为其最后一个字符。 f 输入实数,可以用小写形式或指数形式输入 e、E,g、G 与f作用相同,e与f、g可以互相替换(大小写作用相同)
-
-
scanf函数中用到的格式附加字符
-
格式字符 说明 l 输入长整型数据(可用%ld,%lo,%lx,%lu)以及对double型数据(用%lf或%le) h 输入短整型数据(可用%hd,%ho,%hx) 域宽 指定输入数据所占宽度(列表),域宽应为正整数 * 本输入项在读入后不赋给相应的变量
-
-
scanf函数注意事项
-
- scanf函数中的格式控制后面应当是变量地址,而不是变量名。
-
- 如果在格式控制字符串中除了格式声明以外还有其他字符,则在输入数据时在对应的位置上应输入与这些字符相同的字符。
-
- 在用"%c"格式声明输入字符时,空格字符和转义字符中的字符都作为有效字符输入。
-
- 在输入数值数据时,如果输入空格、回车、Tab键或遇到非法字符(不属于数值的字符),认为该数据结束。
-
-
代码示例
-
//scanf函数 #include <stdio.h> int main() { float a, b, c; scanf("a = %f, b = %f, c = %f", &a, &b, &c);//普通字符,需要在输入时原样输入 printf("输入的数字为:%f%f%f\n", a, b, c); return 0; }
-
//scanf 空格字符和转义字符中的字符都作为有效字符输入 #include <stdio.h> int main() { char a, b, c; scanf("%c %c %C", &a, &b, &c); printf("输入的字符为:%c %c %c", a, b, c); return 0; }
-
-
第八节 字符输入输出函数
-
用putchar函数输出一个字符,putchar函数的一般形式为
putchar(c)
,作用是输出字符变量c的值,显然输出的是一个字符。 -
用getchar函数输入一个字符,getchar函数的一般形式为
getchar(c)
,作用是从计算机终端(一般是键盘)输入一个字符,即计算机获得一个字符。getchar函数只能接收一个字符,可以获取控制字符,例如输出B回车,或者输入o回车;可以赋给一个变量,也可以直接作为表达式的一部分。 -
在用键盘输入信息时,并不是在键盘敲一个字符,对应的字符就立即送到计算机中去了,这些字符先暂存在键盘的缓冲器中,只有按了Enter键才把这些字符一起输入到计算机中。然后按先后顺序分别赋给相应的变量。
-
代码示例
-
//putchar #include <stdio.h> int main() { char a = 'B', b = 'O', c = 'Y'; //int a = 66, b = 79, c = 89;结果同上 putchar(a); putchar(b); putchar(c); putchar('\n'); return 0; }
-
//getchar #include <stdio.h> int main() { char a, b, c; a = getchar(); b = getchar(); //c = getchar(); //printf("%c %d %c\n", a, b, c); printf("%c %c %c\n", a, b, getchar()); return 0; }
-
-