数组
数组的定义
对于有些需要处理的数据,只用简单的数据类型是不够的,难以反映出数据的特点,也难以有效地进行处理。例如,一个班有30个学生,每个学生有一个成绩。那么如何表示这些成绩呢?可以用30个float型变量s1,s2,s3,…,s30。但是这里存在着两个问题:一是烦琐,要定义30个简单变量,如果有1000名学生怎么办呢?二是没有反映出这些数据的内在联系,实际上这些数据是同一个班级、同一门课程的成绩,它们具有相同的属性。
既然它们都是同一类性质的数据,就可以用同一个名字(如s)来代表它们,而在名字的右下角加一个数字来表示这是第几名学生的成绩。这个右下角的数字称为下标(subscript)。一批具有同名的同属性的数据就组成一个数组(array),s就是数组名。
由此可知:
(1) 数组是一组有序数据的集合。数组中各数据的排列是有一定规律的,下标代表数据在数组中的序号。
(2) 用一个数组名和下标来唯一地确定数组中的元素。
(3) 数组中的每一个元素都属于同一个数据类型。不能把不同类型的数据放在同一个数组中。
如何定义一维数组
要使用数组,必须在程序中先定义数组,即通知计算机:由哪些数据组成数组,数组中有多少元素,属于哪个数据类型。否则计算机不会自动地把一批数据作为数据处理。
下面是对数组的定义:
int a[10]; //它定义了一个整型数组,数组名为a,此数组中有10个整型元素
定义一维数组的一般形式为
类型符 数组名[常量表达式];
说明:
(1)数组名的命名规则和变量名相同,遵循标识符命名规则。
(2)在定义数组时,需要指定数组中元素的个数,方括号中的常量表达式用来表示元素的个数,即数组长度。例如,指定a[10],表示a数组中有10个元素。注意,下标是从0开始的,这10个元素是:a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9]。需要注意的是,按上面的定义,不存在数组元素a[10]。
(3)常量表达式中可以包括常量和符合常量,如“int a[3+5];”是合法的。不能包含变量,如“int a[n];”是不合法的。也就是说,C语言不允许对数组的大小作动态定义,即数组的大小不依赖于程序运行过程中变量的值。例如,下面这样定义数组是不行的:
int n;
scanf("%d",&n); //企图在程序中临时输入数组的大小
int a[n];
经过上面的定义,在内存中划出一片存储空间(如图),存放了一个有10个整型元素的数组。可以看到,用一个“int a[10];”,就相当定义了10个简单的整型变量。
操作符
说明:
(1)同一优先级的运算符,运算次序由结合方向决定。例如 * 和 / 具有相同的优先级别,其结合方向为自左至右,因此 3 *5 / 4 的运算次序是先乘后除。- 和 ++ 为同一优先级,结合方向为自右至左,因此 - i + + 相当于 -(i++)。
(2)不同的运算符要求有不同的运算对象个数,如 +(加) 和 -(减) 为双目运算符,要求在运算符两侧各有一个运算对象(如3+5、8-3等)。而 ++ 和 -(负号)运算符是单目运算符,只能在运算符的一侧出现一个运算对象(如 -a、i++、–i、(float)i、sizeof(int)、 *p等 )。条件运算符是C语言中唯一的三目运算符,如 x ? a : b。
(3)从上表中可以大致归纳出各类运算符的优先级:
初等运算符 > 单目运算符 > 算术运算符(先乘除后加减) > 关系运算符 > 逻辑运算符(不包括!) > 条件运算符 > 赋值运算符 > 逗号运算符
初等运算符优先级最高,逗号运算符最低。位运算符的优先级比较分散(有的在算术运算符之前(如~),有的在关系运算符之前(如 << 和 >> ),有的在关系运算符之后(如 & 、^、|))。
C语言中的关键字
auto; break; case; char; const;
continue; default; do; double; else;
enum; extern; float; for; goto;
if; inline; int; long; register;
restrict; return; short; signed; sizeof;
static; struct; switch; typedef; union;
unsigned; void; volatile; while; _bool;
_Complex; _Imaginary;