以并无实际意义 表达式语句常见的形式有:赋值语句、函数调用语句和空语句 1.赋值语句 赋值语句由赋值表达式加上一个分号构成 C语言的赋值语句先计算赋值运算符(=)右边子表达式的值,然后将 此值赋值给左边的变量。 对变量的赋值:<变量=<表达式> 例:b=30.0,∥将表达式的值300赋给变量b a=sin(b*3.14159/180),∥将表达式(正弦函数)的值赋给变量a 变量赋值的特点: ①变量必须先定义,后使用。intd,ef,定义三个变量为整数类型。如 未定义,则在编译时认为非法,提示错误 ②变量被赋值前,值不确定 ③对变量的赋值过程是“覆盖”过程,即用新值去替换旧值 ④读出变量的值,变量的值保持不变。 ⑤参与表达式运算的所有变量都保持原来的值不变。 ⑥赋值运算是右结合性,即“取右送左”。若有声明语句: int al. b=2. c=3 则执行表达式: 结果a、b、c的值都是3(先运算b=c,再运算a=b) 2.函数调用语句 函数调用语句由函数调用表达式加一个分号构成 例如:pint(" This is a C statement") 3.空语句 即只有一个分号的语句,它什么也不做(表示这里需要一个语句,但是 不需要做任何工作) 12c程序运行过程 12.1源程序、目标程序和可执行程序的概念 程序:程序是一组计算机可以识别和执行的指令,每一条指令使计 算机执行特定的操作。 2.源程序:程序可以用高级语言或汇编语言编写,用高级语言或汇编 语言编写的程序称为源程序。C源程序的扩展名为“C
11 以并无实际意义 表达式语句常见的形式有:赋值语句、函数调用语句和空语句。 1. 赋值语句 赋值语句由赋值表达式加上一个分号构成。 C 语言的赋值语句先计算赋值运算符(=)右边子表达式的值,然后将 此值赋值给左边的变量。 对变量的赋值:<变量>=<表达式> 例:b=30.0; // 将表达式的值 30.0 赋给变量 b a=sin(b*3.14159/180); //将表达式(正弦函数)的值赋给变量 a 变量赋值的特点: ① 变量必须先定义,后使用。int d,e,f; 定义三个变量为整数类型。如 未定义,则在编译时认为非法,提示错误。 ② 变量被赋值前,值不确定。 ③ 对变量的赋值过程是“覆盖”过程,即用新值去替换旧值。 ④ 读出变量的值,变量的值保持不变。 ⑤ 参与表达式运算的所有变量都保持原来的值不变。 ⑥ 赋值运算是右结合性,即“取右送左”。若有声明语句: int a=1,b=2,c=3; 则执行表达式: a=b=c; 结果 a、b、c 的值都是 3(先运算 b=c,再运算 a=b)。 2. 函数调用语句 函数调用语句由函数调用表达式加一个分号构成。 例如:printf("This is a C statement."); 3. 空语句 即只有一个分号的语句,它什么也不做(表示这里需要一个语句,但是 不需要做任何工作)。 1.2 C 程序运行过程 1.2.1 源程序、目标程序和可执行程序的概念 1. 程序:程序是一组计算机可以识别和执行的指令,每一条指令使计 算机执行特定的操作。 2. 源程序:程序可以用高级语言或汇编语言编写,用高级语言或汇编 语言编写的程序称为源程序。C 源程序的扩展名为“.C
源程序不能直接在计算机上执行,需要用“编译程序”将源程序翻译为 二进制形式的代码。 3.目标程序:源程序经过“编译程序”翻译所得到的二进制代码称为 目标程序。目标程序的扩展名为 目标代码尽管已经是机器指令,但是还不能运行,因为目标程序还没有 解决函数调用问题,因此需要将各个目标程序与库函数连接起来,才能形成 完整的可执行程序。 4.可执行程序:目标程序与库函数连接,形成完整的可在操作系统下 独立执行的程序称为可执行程序。可执行程序的扩展名为“EXE”(在 DOS/ Windows环境下)。 122C程序上机步骤 C语言采用编译方式将源程序转换为二进制目标代码。程序的开发过程 包括编辑、编译、连接和运行几个步骤,如图1.1所示。 1.编辑 将编写完成的源程序输入到计算机中,并保存为磁盘文件,扩展名为C 编辑的对象是源程序,它以 ASCII代码的形式输入和存储,不能被计算机 执行。常用的编辑软件是 Turbo C、 Borland c,也可以使用 Windows下的记 事本等字处理软件。 开始 2.编译 编译具体分为执行预处 编辑 源程序 理和编译两个阶段 (1)执行预处理:如果程 匚编译卜 序中有预处理命令(如 目标程序 有错 # include命令或# define命令), 则首先要处理预处理指令,然 函数库 后再进行下面的编译过程;如 果源程序中无预处理指令,那 么就直接进行下面的编译过 有错? 程 (2)执行编译:编译是将 执行十 源程序代码翻译为二进制目 标代码的形式一一目标程序 有错? 扩展名为OBJ。编译过程中, 如果发现语法错误,则在屏幕 结束 上显示出错信息并中止编译 图11c程序的上机步骤 此时应对源程序的错误进行
12 源程序不能直接在计算机上执行,需要用“编译程序”将源程序翻译为 二进制形式的代码。 3. 目标程序:源程序经过“编译程序”翻译所得到的二进制代码称为 目标程序。目标程序的扩展名为“.OBJ”。 目标代码尽管已经是机器指令,但是还不能运行,因为目标程序还没有 解决函数调用问题,因此需要将各个目标程序与库函数连接起来,才能形成 完整的可执行程序。 4. 可执行程序:目标程序与库函数连接,形成完整的可在操作系统下 独立执行的程序称为可执行程序。可执行程序的扩展名为“.EXE”(在 DOS/Windows 环境下)。 1.2.2 C 程序上机步骤 C 语言采用编译方式将源程序转换为二进制目标代码。程序的开发过程 包括编辑、编译、连接和运行几个步骤,如图 1.1 所示。 1. 编辑 将编写完成的源程序输入到计算机中,并保存为磁盘文件,扩展名为.C。 编辑的对象是源程序,它以 ASCII 代码的形式输入和存储,不能被计算机 执行。常用的编辑软件是 Turbo C、Borland C,也可以使用 Windows 下的记 事本等字处理软件。 2. 编译 编译具体分为执行预处 理和编译两个阶段。 ⑴ 执行预处理:如果程 序 中 有 预 处 理 命 令 ( 如 #include 命令或#define 命令), 则首先要处理预处理指令,然 后再进行下面的编译过程;如 果源程序中无预处理指令,那 么就直接进行下面的编译过 程。 ⑵ 执行编译:编译是将 源程序代码翻译为二进制目 标代码的形式——目标程序, 扩展名为.OBJ。编译过程中, 如果发现语法错误,则在屏幕 上显示出错信息并中止编译。 此时应对源程序的错误进行 开 始 结 束 编 辑 编 译 连 接 执 行 有 错? 有 错? Y N Y N 有 错? Y N 源程序 f.c 目标程序 f.obj 可执行 程 序 f.exe 函数库 图1.1 C程序的上机步骤
修改,然后重新进行编译,如此反复进行,直到完全正确为止,最后生成目 标代码程序 应当指出,经编译后得到的二进制目标代码还是不能直接执行,因为每 一个模块往往是单独编译的,必须把经过编译的各个模块的目标代码与系统 提供的标准模块(如C语言中的标准库函数)连接后才能运行 3.连接 将各模块的二进制目标代码与系统标准模块连接在一起,生成扩展名 为EXE的可执行文件。 4.执行 执行经过编译和连接的可执行文件。一般在显示器上显示运行结果,可 根据运行结果来判断程序是否有错。如果有错误,则须改正,并重新进行编 译和连接,然后运行。这样反复运行,直到得到正确的运行结果。 集成化的工具环境(如 Borland c和 isual C++等)已经将编辑、编译、 连接和调试工具集于一身,用户可以方便地在窗口状态下连续进行编辑、编 译、连接、调试和运行的全过程 C程序的上机步骤如图1.1所示。 Turbo C的使用见C语言实验教材 1.3编写简单的C语言程序 程序设计时,通常采用三种不同的程序结构,即顺序结构、选择结构和 循环结构,其中顺序结构是最基本、最简单的程序结构。现在开始最简单的 C程序设计,即顺序程序设计的学习 【例14】已知a=5,b=10,试交换a、b的值。 分析:交换两个变量的值,就像一个瓶装酱油,一个瓶装醋要交换内容 需要借助第三个空瓶一样。交换两个数也需要借助第三个变量 C语言程序 #include <stdio.h> void main() int a=5, b=10, temp: temp=a, printf("a=%d, b=%d\n", a, b) 运行结果:a=10b=5 【例1.5】编写一个显示基本算术运算功能的程序
13 修改,然后重新进行编译,如此反复进行,直到完全正确为止,最后生成目 标代码程序。 应当指出,经编译后得到的二进制目标代码还是不能直接执行,因为每 一个模块往往是单独编译的,必须把经过编译的各个模块的目标代码与系统 提供的标准模块(如 C 语言中的标准库函数)连接后才能运行。 3. 连接 将各模块的二进制目标代码与系统标准模块连接在一起,生成扩展名 为.EXE 的可执行文件。 4. 执行 执行经过编译和连接的可执行文件。一般在显示器上显示运行结果,可 根据运行结果来判断程序是否有错。如果有错误,则须改正,并重新进行编 译和连接,然后运行。这样反复运行,直到得到正确的运行结果。 集成化的工具环境(如 Borland C 和 Visual C++等)已经将编辑、编译、 连接和调试工具集于一身,用户可以方便地在窗口状态下连续进行编辑、编 译、连接、调试和运行的全过程。 C 程序的上机步骤如图 1.1 所示。Turbo C 的使用见 C 语言实验教材。 1.3 编写简单的 C 语言程序 程序设计时,通常采用三种不同的程序结构,即顺序结构、选择结构和 循环结构,其中顺序结构是最基本、最简单的程序结构。现在开始最简单的 C 程序设计,即顺序程序设计的学习。 【例 1.4】 已知 a=5,b=10,试交换 a、b 的值。 分析:交换两个变量的值,就像一个瓶装酱油,一个瓶装醋要交换内容 需要借助第三个空瓶一样。交换两个数也需要借助第三个变量。 C 语言程序: #include <stdio.h> void main( ) { int a=5,b=10,temp; temp=a; a=b; b=temp; printf("a=%d,b=%d\n",a,b); } 运行结果:a=10,b=5 【例 1.5】 编写一个显示基本算术运算功能的程序
分析:C语言的基本算术运算符包括两类 ①单目运算符:-(负)、+(正)。 ②双目运算符:+(加)、-(减)、*(乘)、/(除)、%(取余,模)。 所谓单目运算,是指只需要一个操作数,如-5、+23等。双目运算是需 要两个操作数,如a+b、3*c、n/m等 C语言程序 #include <stdio. h printf("n30%7 is %d", 30%07 printf("\n30%%7 is%d, 30%7) printf("n2.0-3+1.8is%f",20-3.0+1.8) printf("In2/3*10000s%d",2/3*10000 printf("In2/3*10000is%",2/3*10000 pnfn2.0/3*10000s%f",2.0/3*10000 printf("In2.0/3*10000is%d",2.0/3*10000; printf("In2.0/3*10000is%e",2.0/3*10000) 运行结果: 30%7is%d 30%7is2 2.0/-3+1.8isl.133333 2/3*10000is0 2/3*10000is0.000000 2.0/3*10000is6666666667 2.0/3*10000is-21845 2.0/3*10000is6666667e+03 说明: (1)求模运算符%,得到的是余数。注意 printi()中“%”是格式符,要 输出“%”需要再加一个“%”。 tu: printf("\n30%7 is %d", 30%7 的输出为:30%7is%d,%使用错误使得后面的格式字符都失效了 (2)C语言的算术运算符中,单目运算符的优先级高于双目运算符:双 目算术运算的优先级与普通数学中的相同:单目算术运算符是自右向左结合 (3)输出结果中,2/3*10000的值为0,因为C语言规定两个整数相除结 果为整数,即舍去小数部分。但是如果除数或被除数中有一个为负值,则舍 入的方向是不固定的,多数机器采用“向0取整”的方法,取整后向零靠拢
14 分析:C 语言的基本算术运算符包括两类: ① 单目运算符:-(负)、+(正)。 ② 双目运算符:+(加)、-(减)、*(乘)、/(除)、%(取余,模)。 所谓单目运算,是指只需要一个操作数,如-5、+2.3 等。双目运算是需 要两个操作数,如 a+b、3*c、n/m 等。 C 语言程序: #include <stdio.h> void main( ) { printf("\n30%7 is %d",30%7); printf("\n30%%7 is %d",30%7); printf("\n2.0/-3+1.8 is %f",2.0/-3.0+1.8); printf("\n2/3*10000 is %d",2/3*10000); printf("\n2/3*10000 is %f",2/3*10000); printf("\n2.0/3*10000 is %f",2.0/3*10000); printf("\n2.0/3*10000 is %d",2.0/3*10000); printf("\n2.0/3*10000 is %e",2.0/3*10000); } 运行结果: 30%7 is %d 30%7 is 2 2.0/-3+1.8 is 1.133333 2/3*10000 is 0 2/3*10000 is 0.000000 2.0/3*10000 is 6666.666667 2.0/3*10000 is -21845 2.0/3*10000 is 6.666667e+03 说明: ⑴ 求模运算符%,得到的是余数。注意 printf( )中“%”是格式符,要 输出“%”需要再加一个“%”。 如:printf("\n30%7 is %d",30%7); 的输出为:30%7 is %d,%使用错误使得后面的格式字符都失效了。 ⑵ C 语言的算术运算符中,单目运算符的优先级高于双目运算符;双 目算术运算的优先级与普通数学中的相同;单目算术运算符是自右向左结合 的。 ⑶ 输出结果中,2/3*10000 的值为 0,因为 C 语言规定两个整数相除结 果为整数,即舍去小数部分。但是如果除数或被除数中有一个为负值,则舍 入的方向是不固定的,多数机器采用“向 0 取整”的方法,取整后向零靠拢
如-5/3=1。 那么如何才能得到浮点数呢? 方法1:将参加运算的变量定义为实型(foat或 double)。似乎我们可 以把所有的变量都定义为实型,这样就不会出现错误了。但是,实型在内存 中占用的字节数大于整型,同时实型数据运算需要的时间也比整型长。这不 利于程序的优化和执行效率的提高,所以只在需要使用时才定义为实型。 方法2:令f=1.0*ab:(设有ita=1,b=2),因为C语言规定如果参加+ 、*、/运算的两个数有一个为实数,则结果为 double型,因为所有实数都 按 double型进行计算。这样1.0a的数据类型就是实型(因为10是实数) 最终的结果就是实数0.5。 方法3:利用强制类型转换。即:f=(noat)a/b;C语言允许将一种数据 类型强制转换成另一种数据类型,方法是:(数据类型)变量。这样a就被转 换成实型。 【例1.6】试计算圆柱体的表面积 分析:为了计算圆柱体的表面积,可以利用公式2r(r为半径)得到 底面周长d,利用公式d×h计算侧面积sl,利用π×r2计算底面积s2,则 表面积s=s+2×s2。可以按照以下步骤: ①设圆柱体的高为h,半径为r,表面积为s ②输入r、h的值 ③计算底面周长d=2r; ④计算侧面积sl=d ⑤计算底面积s2=r2 ⑥计算表面积:s=sl+2×s2 ⑦输出s的值。 这是用自然语言描述的计算圆柱体表面积的算法。我们在计算过程中 有些步骤可以合并。现在我们将其转换为C语言程序。注意r、h和s的数 据类型 C语言程序: # include< stdio h>/预编译命令* # define pl3.1415926/*定义符号P代表常量3.1415926* void main( /*主函数main,void是类型说明符* float r, h, s *声明部分:定义变量* printf(" input r, h: n");/*执行部分:输出语句* canf("%r%of",&r,&h),/执行部分:输入语句* $a2*PIr*h+2*pi*r*r /*执行部分:计算表面积* printf(" otal area is%2fn"s),/*执行部分:输出表面积
15 如-5/3=-1。 那么如何才能得到浮点数呢? 方法 1:将参加运算的变量定义为实型(float 或 double)。似乎我们可 以把所有的变量都定义为实型,这样就不会出现错误了。但是,实型在内存 中占用的字节数大于整型,同时实型数据运算需要的时间也比整型长。这不 利于程序的优化和执行效率的提高,所以只在需要使用时才定义为实型。 方法 2:令 f=1.0*a/b;(设有 int a=1,b=2),因为 C 语言规定如果参加+、 -、*、/运算的两个数有一个为实数,则结果为 double 型,因为所有实数都 按 double 型进行计算。这样 1.0*a 的数据类型就是实型(因为 1.0 是实数)。 最终的结果就是实数 0.5。 方法 3:利用强制类型转换。即:f=(float)a/b;C 语言允许将一种数据 类型强制转换成另一种数据类型,方法是:(数据类型)变量。这样 a 就被转 换成实型。 【例 1.6】 试计算圆柱体的表面积。 分析:为了计算圆柱体的表面积,可以利用公式 2πr(r 为半径)得到 底面周长 d,利用公式 d×h 计算侧面积 s1,利用π×r 2 计算底面积 s2,则 表面积 s=s1+2×s2。可以按照以下步骤: ① 设圆柱体的高为 h,半径为 r,表面积为 s; ② 输入 r、h 的值; ③ 计算底面周长 d=2πr; ④ 计算侧面积 s1=dh; ⑤ 计算底面积 s2=πr 2 ; ⑥ 计算表面积:s=s1+2×s2; ⑦ 输出 s 的值。 这是用自然语言描述的计算圆柱体表面积的算法。我们在计算过程中, 有些步骤可以合并。现在我们将其转换为 C 语言程序。注意 r、h 和 s 的数 据类型。 C 语言程序: #include <stdio.h> /* 预编译命令 */ #define PI 3.1415926 /* 定义符号 PI 代表常量 3.1415926 */ void main( ) /* 主函数 main,void 是类型说明符 */ { float r,h,s; /* 声明部分:定义变量 */ printf("input r,h:\n"); /* 执行部分:输出语句*/ scanf("%f%f",&r,&h); /* 执行部分:输入语句 */ s=2*PI*r*h+2*PI*r*r; /* 执行部分:计算表面积 */ printf("Total area is %.2f\n",s); /* 执行部分:输出表面积 */ }