配色: 字号:
《C语言程序设计》第1章 程序设计和C语言写字字帖
2023-05-24 | 阅:  转:  |  分享 
  
第1章 程序设计和C语言学习目标 本章主要介绍C语言程序设计的入门知识,如算法、常量和变量、数据类型、各类表达式。这些知识点是后续章节中进
行程序设计的必备知识。第1章 程序设计和C语言1.1 C语言程序结构和标识符1.2 算法1.3 标识符、常量和变量 1.4 数据类
型 1.5 算术表达式 1.6 赋值运算符 1.7 自加、自减运算符和逗号运算符1.1 C语言程序结构和标识符1.1.1 C语言程
序和程序设计概述1.1.2 最简单的C语言程序举例1.1.3 C语言程序的结构1.1.4 运行C程序的步骤与方法 1.1.1 C
语言程序和程序设计概述计算机是一种具有内部存储能力、由程序自动控制的电子设备。人们把这种可以连续执行的一条条指令的集合称为“程序”
。1.1.1 C语言程序和程序设计概述由高级语言编写的程序称为“源程序”,把由二进制代码表示的程序称为“目标程序”。为了把源程序转
换成机器能接受的目标程序,软件工作者编制了一系列软件,通过这些软件可以把用户按规定语法写出的语句一一翻译成二进制的机器指令。这种具
有翻译功能的软件称为“编译程序”,每种高级语言都有与之对应的编译程序。1.1.1 C语言程序和程序设计概述由C语言构成的指令序列称
为C源程序;按C语言的语法编写C程序的过程,称为C语言的代码编写。1.1.1 C语言程序和程序设计概述C源程序经过C编译程序编译之
后生成一个后缀为.obj的二进制文件(称为目标文件)然后由称为“连接程序”(Link)的软件,把此.obj文件与C语言提供的各种库
函数连接起来生成一个后缀为.exe的可执行文件。在操作系统环境下,只需点击或输入此文件的名字(而不必输入后缀.exe),该可执行文
件就可运行。1.1.1 C语言程序和程序设计概述简单的程序设计一般包含以下几个部分。1.确定数据结构。根据任务书提出的要求、指定的
输入数据和输出结果,确定存放数据的数据结构。2.确定算法。针对存放数据的数据结构来确定解决问题、完成任务的步骤。有关算法的概念将在
1.2节中介绍。1.1.1 C语言程序和程序设计概述3.编码。根据确定的数据结构和算法,使用选定的计算机语言编写程序代码,输入到计
算机并保存在磁盘上,简称编程。4.在计算机上调试程序。消除由于疏忽而引起的语法错误或逻辑错误;用各种可能的输入数据对程序进行测试,
使之对各种合理的数据都能得到正确的结果,对不合理的数据能进行适当的处理。5.整理并写出文档资料。1.1.1 C语言程序和程序设计概
述例1.1 以下叙述中正确的是(2009年9月全国计算机等级考试二级C试题选择题第11题)。A)程序设计的任务就是编写程序代码并上
机调试B)程序设计的任务就是确定所用数据结构C)程序设计的任务就是确定所用算法D)以上三种说法都不完整1.1.1 C语言程序和程序
设计概述例1.2 计算机高级语言程序的运行方法有编译执行和解释执行两种,以下叙述正确的是(2011年3月全国计算机等级考试二级C试
题选择题第11题)。A)C语言程序仅可以编译执行B)C语言程序仅可以解释执行C)C语言程序既可以编译执行又可以解释执行D)以上说法
都不对1.1.1 C语言程序和程序设计概述例1.3 以下叙述中错误的是(2011年3月全国计算机等级考试二级C试题选择题第12题)
。A)C语言的可执行程序是由一系列机器指令构成的B)用C语言编写的源程序不能直接在计算机上运行C)通过编译得到的二进制目标程序需要
连接才可以运行D)在没有安装C语言集成开发环境的机器上不能运行C源程序生成的.exe文件1.1.2 最简单的C语言程序举例例1.4
要求在屏幕上输出以下一行信息。 Welcome to our school.解题思路: 在主函数中用printf函数原样输
出以上文字。1.1.2 最简单的C语言程序举例函数的名字,表示主函数C程序必须有一个 main 函数#include .h>int main( ){ print
f (” Welcome to our school.\n”); return 0;
} 1.1.2 最简单的C语言程序举例#include int main( ){
printf (” Welcome to ou
r school.\n”); return 0; } 主函数
类型1.1.2 最简单的C语言程序举例#include int main( ){
printf (” Welcome to our school.\n”)
; return 0; } 函数体1.1.2 最简单的C语言
程序举例输出函数输出语句#include int main( ){
printf (” Welcome to our school.\n”); ret
urn 0; } 1.1.2 最简单的C语言程序举例#inclu
de int main( ){
printf (” Welcome to our school.\n”); return 0;
} 输出语句1.1.2 最简单的C语言程序举例#include in
t main( ){ printf (”
Welcome to our school.\n”); return 0;
} 当main函数执行结束前将整数0作为函数值1.1.2 最简单的C语言程序举例#include >int main( ){ printf
(” Welcome to our school.\n”); return 0;
} 用到函数库中的输入输出函数时表示语句结束1.1.2 最简单的C语言程序举例C语言允许用两种注释方式://
:单行注释可单独占一行可出现在一行中其他内容的右侧/……/:块式注释可包含多行例1.5 求两个整数之和。解题思路:设置3个变
量a和b用来存放两个整数sum用来存放和数用赋值运算符“=”把结果传送给sum#include int main
( ){ int a,b,sum; a = 123; b = 456;
sum = a + b; printf(”sum is
%d\n”,sum); return 0; }
定义整型变量a,b,sum对变量a,b赋值将a与b的和赋给sum#include int main( ){
int a,b,sum; a = 123; b = 456;
sum = a + b; printf(”sum is %d\n”,
sum); return 0; } 用sum的值替
代希望输出的字符例1.6 从键盘输入两个整数,并显示这两个整数之和 。解题思路:包括主函数、被调用函数ADDxy 定义函数ADDx
y 输入两个整数调用函数ADDxy将调用结果返回值赋给变量z 输出两个整数之和#include int ADDx
y(int a,int b) 定义函数ADDxy { int c; c=a+b; return c; 返回
c的值,return是关键字}int main( ) 主函数{ int x,y,z; 声明部分,定义变量 scanf(“
%d%d” , &x, &y); z=ADDxy(x,y); 调用ADDxy函数,将得到返回值赋给变量z print
f(“sum=%d \n”, z); 输出两个整数之和 return 0; }1.1.3 C语言程序的结构C语言程序的结
构特点:1.一个程序由一个或多个源程序文件组成小程序往往只包括一个源程序文件例1.4,例1.5只有一个函数例1.6有两个函数只包括
一个源程序文件1.1.3 C语言程序的结构C语言程序的结构特点:一个源程序文件中可以包括三个部分:预处理指令全局声明函数定义#i
nclude 等在函数之外进行的数据声明每个函数用来实现一定的功能1.1.3 C语言程序的结构C语言程序的结构
特点:2.函数是C程序的主要组成部分一个C程序是由一个或多个函数组成的必须包含一个main函数(只能有一个)每个函数都用来实现一个
或几个特定功能被调用的函数可以是库函数,也可以是自己编制设计的函数1.1.3 C语言程序的结构C语言程序的结构特点:3.一个函数
包括两个部分:函数首部int max ( int x, int y )函数类型函数名参数类型参数名函数的第1行
1.1.3 C语言程序的结构C语言程序的结构特点:3.一个函数包括两个部分:函数首部int max ( int x
, int y )若函数无参,在括弧中写void或空括弧int main( void) 或 int main()
1.1.3 C语言程序的结构C语言程序的结构特点:3.一个函数包括两个部分:函数体声明部分定义在本函数中所用到的变量对本函数所调
用函数进行声明执行部分:由若干个语句组成,指定在函数中所进行的操作可以没有声明部分1.1.3 C语言程序的结构C语言程序的结构特
点:3.一个函数包括两个部分:函数体void dump ( ){ }可以是空函数1.1.3 C语言程序的结构C语言
程序的结构特点:4. 程序总是从main函数开始执行5. C程序对计算机的操作由C语句完成C程序书写格式是比较自由的一行内可以写几
个语句一个语句可以分写在多行上为清晰起见,习惯上每行只写一个语句1.1.3 C语言程序的结构C语言程序的结构特点:4. 程序总是
从main函数开始执行5. C程序对计算机的操作由C语句完成6. 数据声明和语句最后必须有分号7. C语言本身不提供输入输出语句8
. 程序应当包含注释,增加可读性1.1.4 运行C程序的步骤与方法Visual C++ 6.0既可以对C++程序进行编译,也可以对
C程序进行编译。Visual C++ 6.0是在Windows环境中运行的,它有英文版和中文版,二者使用方法相同,只是中文版在界面
上用中文代替了英文。本书介绍的是Visual C++ 6.0中文版,在Visual C++ 6.0中运行C程序一般要经过以下几个步
骤:1.1.4 运行C程序的步骤与方法1.双击桌面上Visual C++ 6.0图标,就能进入Visual C++ 6.0集成环境
,屏幕上出现Visual C++ 6.0的主窗口,见图1.1。图1.1 Visual C++ 6.0主窗口1.1.4 运行C程序的
步骤与方法2.在Visual C++ 6.0主窗口的主菜单栏中选择“文件”,然后选择“新建”,见图1.2,图1.2 新建源程序图1
.3 “新建”对话框1.1.4 运行C程序的步骤与方法3.单击“确定”按钮后,回到Visual C++主窗口,可以看到光标在程序编
辑窗口闪烁,表示程序编辑窗口已激活,可以输入和编辑源程序了。在此输入例1.4程序,见图1.4。图1.4 编辑源程序1.1.4 运行
C程序的步骤与方法4.如果经检查无误,在主菜单栏中选择“文件”,并在其下拉菜单中选择“保存”,见图1.5。图1.5 保存源程序1.
1.4 运行C程序的步骤与方法5.若需要对该源文件进行编译,单击主菜单栏中的“组建”,在其下拉菜单中选择“编译[c1-1.c]”,
见图1.6。图1.6 编译源程序1.1.4 运行C程序的步骤与方法6.单击编译命令后,屏幕上出现一个对话框,内容是“此编译命令要求
一个有效的项目工作区,你是否同意建立一个默认的项目工作区”,见图1.7。图1.7 “创建工作区”对话框1.1.4 运行C程序的步骤
与方法7.在得到后缀为.obj的目标程序后,还不能直接运行,还要把程序和系统提供的资源(如函数库)建立连接,此时应选择“组建[c1
-1.exe]”,见图1.8。表示要求连接并建立一个可执行文件c1-1.exe,该文件也存放在D:\cwork\Debug文件夹下
。图1.8 组建程序1.1.4 运行C程序的步骤与方法8.在得到可执行文件c1-1.exe后,就可以直接执行c1-1.exe了。选
择“执行[c1-1.exe]”,见图1.9。也可以用Ctrl+F5一次完成程序的编译、连接与执行。程序执行后,屏幕切换到输出结果的
窗口,显示出运行结果,见图1.10。图1.9 执行程序图1.10 程序运行结果1.1.4 运行C程序的步骤与方法9.如果已完成对一
个程序的操作,不再对它进行其他处理,应当选择“文件”,然后选择“关闭工作区”,以结束对该程序的操作。1.2 算法1.2.1 简单算
法举例1.2.2 用流程图表示算法1.2.1 简单算法举例例2.1 求1×2×3×4×5可以用最原始的方法进行:步骤1:先求12
,得到结果2。步骤2:将步骤1得到的乘积2再乘以3,得到结果6。步骤3:将6再乘以4,得24。步骤4:将24再乘以5,得120。这
就是最后的结果。太繁琐1.2.1 简单算法举例改进的算法:设变量p为被乘数变量i为乘数用循环算法求结果1.2.1 简单算法举例例1
.8 先后输入若干个整数,要求打印出其中最大的数,当输入的数小于0时结束。我们可以设置一个变量max,让max始终存放当前比较过的
数中的最大值。然后输入数,与max比较,如果第二个数大于max,则用第二个数代替max中原来的值,如此先后输入和比较,每次比较后都
将较大值放在max中,直到输入的数小于0时结束。最后max中的值就是所有输入数中的最大值。例1.9 判定键盘输入的年份是否为闰年,
并将结果输出。闰年的条件: (1)能被4整除,但不能被100整除的年份都是闰年,如2008、2012、2048年 (2)能被400
整除的年份是闰年,如2000年不符合这两个条件的年份不是闰年例如2009、2100年设year为被检测的年份。算法表示如下:S1:
2000?yearS2:若year不能被4整除,则输出year 的值和“不是闰年”。然后转到S6S3:若year能被4整除,不能被
100整除,则输出year的值和“是闰年”。然后转到S6S4:若year能被400整除,则输出year的值和“是闰年” ,然后转到
S6S5: 其他情况输出year的值和“不是闰年”S6:year+1?yearS7:当year≤2500时,转S2,否则停止非闰年
year被4整除,但不能被100整除闰年year被100整除,又能被400整除闰年其他非闰年year不能被4整除逐渐缩小判断的范围
例1.10 给出一个大于或等于3的正整数,判断它是不是素数。。所谓素数(prime),是指除了1和该数本身之外,不能被其他任何整数
整除的数例如,13是素数,因为它不能被2,3,4,…,12整除。判断一个数n(n≥3)是否素数:将n作为被除数,将2到(n-1)各
个整数先后作为除数,如果都不能被整除,则n为素数S1:输入n的值S2:i=2 (i作为除数)S3:n被i除,得
余数rS4:如果r=0,表示n能被i整除,则输出n“不是素数”,算法结束;否则执行S5S5:i+1?iS6:如果i≤n-1,返回S
3;否则输出n “是素数”,然后结束。一个有效算法应该具有以下特点:(1) 有穷性。一个算法应包含有限的操作步骤,而不能是无限的。
(2) 确定性。算法中的每一个步骤都应当是确定的,而不应当是含糊的、模棱两可的。一个有效算法应该具有以下特点:(3) 有零个或多个
输入。所谓输入是指在执行算法时需要从外界取得必要的信息。(4) 有一个或多个输出。算法的目的是为了求解,“解” 就是输出。没有输出
的算法是没有意义的。(5) 有效性。算法中的每一个步骤都应当能有效地执行,并得到确定的结果。1.2.2 用流程图表示算法 1.2.
1节介绍的算法是用自然语言表示的用自然语言表示通俗易懂,但文字冗长,容易出现歧义性用自然语言描述包含分支和循环的算法,不很方便除了
很简单的问题外,一般不用自然语言流程图是描述算法的很好的工具,一般的流程图由图1.11中所示的几种基本图形组成。起止框输入输出框处
理框判断框流程线连接点注释框图1.11 流程图符号下面将结合结构化程序设计中的三种基本结构来介绍这两种流程图的基本结构。顺序结构。
在后面中将要介绍的如赋值语句、输入、输出语句都可构成顺序结构。当执行由这些语句构成的程序时,将按这些语句在程序中的先后顺序逐条执行
,没有分支,没有转移。顺序结构可用图1.12所示的流程图表示,其中(a)是一般的流程图,(b)是N-S流程图。图1.12 顺序结构
选择结构。在本书第3章中将要介绍的if语句、switch语句都可构成选择结构。当执行到这些语句时,将根据不同的条件去执行不同分支中
的语句。选择结构可由图1.13所示的流程图表示,其中(a)是一般的流程图,(b)是N-S流程图。图1.13 选择结构循环结构。在本
书第4章中将要介绍不同形式的循环结构。它们将根据各自的条件,使同一组语句重复执行多次或一次也不执行。循环结构的流程图如图1.14和
图1.15所示,每个图中(a)是一般的流程图,(b)是N-S流程图。图1.14 当型循环结构图1.15 直到型循环结构以上三种基本
结构,有以下共同特点:(1) 只有一个入口(2) 只有一个出口一个判断框有两个出口一个选择结构只有一个出口(3) 结构内的每一部分
都有机会被执行到。也就是说,对每一个框来说,都应当有一条从入口到出口的路径通过它(4) 结构内不存在“死循环”例1.11 将例1.
7的算法分别用一般流程图和N-S流程图表示,如图1.16所示。图1.16. 例1.7算法流程图例1.12 将例1.8的算法分别用一
般流程图和N-S流程图表示,如图1.17所示。图1.17 例1.8算法流程图例1.13 将例1.9中判定2000—2500年闰年的
算法分别用一般流程图和N-S流程图表示,如图1.18所示。图1.18 例1.9算法流程图例1.14 将例1.10中判断素数的算法用
一般流程图表示,如图1.19(a)所示。可以看出,图1.19(a)不是由3种基本结构组成的。图中间的循环部分有两个出口(一个从第1
个判断框右面出口,另一个在第2个判断框下边出口),不符合基本结构的特点。由于不能分解为3种基本结构,就无法直接用N-S流程图的3种
基本结构的符号来表示。因此,我们要对图1.19(a)做出必要的修改。将第1个判断框(“r是否为0”)的两个出口合并在一点,以解决两
个出口的问题。当r是0时意味着n为非素数,但此时不马上输出n“不是素数”的信息,而使标志变量flag的值由0改为1(flag的初始
值为0)。如果r不是0,则保持flag值为0,见图1.19(b)。图1.19(b)已变成由3种基本结构组成的结构图。可以改用N-S
图表示此算法,见图1.19(c)。图1.19 例1.10算法流程图1.3 标识符、常量和变量1.3.1 标识符1.3.2 常量1.
3.3 变量1.3.1 标识符在C语言中,有许多符号的命名,如变量名、函数名、数组名等,都必须遵守一定的规则,按此规则命名的符号称
为标识符。1.3.1 标识符C语言规定标识符只能由字母、数字和下划线3种字符组成,且第1个字符必须为字母或下划线。下面列出的是合法
的标识符:area、_ini、a_array、s1234以下都是非法的标识符:456P、cade-y、w.w、a&b1.3.1 标
识符C语言的标识符可以分为以下三类。1. 关键字2. 预定义标识符3.用户标识符1.3.1 标识符例1.15 以下选项中合法的标识
符是 (2009年3月全国计算机等级考试二级C试题选择题第11题)。A)1_1 B)1-1 C) _11
D)1_ _分析:C语言标识符只能由字母、数字和下划线3种字符组成,第1个字符必须为字母或下划线,因此选项A、B、D均错
误,选C。1.3.1 标识符例1.16 以下选项中,能用作用户标识符的是(2009年9月全国计算机等级考试二级C试题选择题第12题
)。A)void B)8_8 C)_0_ D)unsigned分析:用户标识符不能使用关键字,选项A、D错误。选C
。1.3.2 常量常量:在程序运行过程中,其值不能被改变的量整型常量:如12、0、-3; 实型常量十进制小数形式:如0.34
-56.79 0.0指数形式:如12.34e3 (代表12.34?103)字符常量:如‘a’、‘b’ 字符串常量:”Beij
ing”、”abc”符号常量:用#define指令,用一个符号名来代表一个常量。 1.3.2 常量例1.17 计算圆面积。#inc
lude “stdio.h”#define PI 3.14159 //注意行末没有分号main(){ dou
ble r,s; r=5.0; s=PIrr; printf(“s=%f\n”,s);}运行结果:s=78.539750 1
.3.3 变量变量:在程序运行期间,变量的值是可以改变的变量必须先定义,后使用定义变量时指定该变量的名字和类型变量名和变量值是两个
不同的概念变量名实际上是以一个名字代表的一个存储地址从变量中取值,实际上是通过变量名找到相应的内存地址,从该存储单元中读取数据1.
4 数据类型1.4.1 整型数据1.4.2 浮点型数据1.4.3 字符型数据C语言允许使用的类型见图1.20。图1.20 C语言的
数据类型1.4.1 整型数据 整型数据可以分为整型常量和整型变量。1.整型常量可以用十进制、八进制和十六进制等形式表示:(1)十进
制整型常量:十进制整型常量没有前缀。以下各数是合法的十进制整型常量:237、-568、65535、1627;以下各数不是合法的十进
制整型常量:023 (不能有前导0)、23D (含有非十进制数码)。1.4.1 整型数据(2)八进制整型常量:八进制整型常量必须以
0开头,即以0作为八进制数的前缀。数码取值为0~7。八进制数通常是无符号数以下各数是合法的八进制数:015(十进制为13)、010
1(十进制为65)、0177777(十进制为65535);以下各数不是合法的八进制数:256(无前缀0)、03A2(包含了非八进制
数码)、-0127(出现了负号)。1.4.1 整型数据(3)十六进制整型常量:十六进制整型常量的前缀为0X或0x。其数码取值为0~
9,A~F或a~f。以下各数是合法的十六进制整型常量:0X2A(十进制为42)、0XA0 (十进制为160)、0XFFFF (十进
制为65535);以下各数不是合法的十六进制整型常量:5A (无前缀0X)、0X3H (含有非十六进制数码)。2 整型数据在内存中
的存放形式计算机中,内存储器的最小存储单位为“位(bit)”。由于只能存放0或1,因此称为二进制位。大多数计算机把8个二进制位组成
一个“字节(byte)”,并给每个字节分配一个地址。若干字节组成一个“字(word)”,用一个“字”来存放一条机器指令或一个数据。
一个字含多少个字节随机器的不同而不同。如果一台计算机以两个字节(16个二进制位)来存放一条机器指令,则称此计算机的字长为16位;如
果以四个字节(32个二进制位)来存放一条机器指令,则称此计算机的字长为32位。对于一个有符号(signed)整数,若是正整数,最高
位放置0;若是负整数,最高位放置1。(1)正整数当用两个字节存放一个short类型正整数时,例如正整数5,其在内存中的二进制码为:
0000000000000101对于正整数的这种存储形式称为用“原码”形式存放。因此用两个字节存放short类型的最大正整数是:0
111111111111111它的值为32767。为简单起见,若一个字节能够正确表示一个整数时,本书则用一个字节表示。(2)负整数
负整数在内存中是以“补码”形式存放的。正数补码即原码;负数的补码是将其对应原码的各位(除符号位外)按位求反,然后加1。例如求100
00101(十进制数-5)的补码,步骤如下:求原码的反码。例如10000101的反码为11111010。11111010加1得11
111011,这就是-5在内存中的二进制码。若用两个字节表示,即为: 1111111111111011把内存中以补码形式
存放的二进制码转化成十进制的负整数,步骤如下:先对除符号位之外的各位取反。例如有补码11111011,取反后为10000100。将
所得二进制数转换成十进制数。例如10000100的十进制数为-4。对所求得的数再减1,即为-5。3 整型变量变量定义的一般形式为:
类型说明符 变量名标识符,变量名标识符,...;例如: int a,b,c; (a,b,c为整型变量)C语言规定,可以在定
义变量的同时给变量赋初值,也称变量初始化。例如:main( ){ int i=1,k=2; /定义i、k为整型变量,它们的初
值分别为1和2 / }应注意,在定义中不允许连续赋值,如a=b=c=5是不合法的。不同的编译系统为int变量开辟的内
存单元大小不同。表1-1列出了在Visual C++6.0中定义的整型数所占用的字节数和数值范围。表中方括号内的单词可以省略。表1
-1 Visual C++6.0中定义的整型数所占用的字节数和数值范围1.4.2 浮点型数据1 实型常量又称实数或浮点数。有两种表
示形式:① 十进制小数形式,由数字和小数点组成。如:123.456、0.345、-16.7、0.0等。即小数形式表示的实型常量必须
要有小数点。② 指数形式,在数学中,一个数可以用幂的形式来表示,如2.3026可以表示为0.23026×、2.3026×、23.0
26×等形式。在C语言中,则以“e”或“E”后跟一个整数来表示以10为底的幂数。2.3026可以表示为0.23026E1、2.30
26e0、23.026e-1。C语言的语法规定,字母e或E之前必须要有数字,且e或E后面的指数必须为整数。如e3、.5e2.1、.
e3等都是非法的指数形式。1.4.2 浮点型数据例1.18 以下选项中,能用作数据常量的是 (2009年9月全国计算机等级考试二级
C试题选择题第13题)。A)o115 B)0118 C)1.5e1.5 D)115L分析:实型常量如果用指数形式表示,C语
言规定,字母e(或E)前后必须要有数字,且e(或E)后面的指数必须为整数。因此选项C不合法。八进制整数常量以数字0开始,A是以字母
o开始所以也错误,而且八进制数的有效数字为0~7,不含8,所以选项B错误。选D,其中L表示长整型。1.4.2 浮点型数据2 实型变
量(1)实型数据在内存中的存放形式实型数据一般占4个字节(32位)内存空间。按指数形式存储。实数3.14159在内存中的存放形式如
下:+.3141591 数符 小数部分 指数小数部分占的位
(bit)数愈多,数的有效数字愈多,精度愈高。指数部分占的位数愈多,则能表示的数值范围愈大。1.4.2 浮点型数据(2)实型变量的
分类实型变量分为:单精度(float型)、双精度(double型)两种。分别用类型名float和double进行定义。单精度型变量
定义的形式如下:float a,b,c;双精度型变量定义的形式如下:double x,y,z;在Visual C++6.0中单精度
型占4个字节(32位)内存空间,其数值范围为~,只能提供5~6位有效数字。双精度型占8个字节(64位)内存空间,其数值范围为~,可
提供15~16位有效数字,具体精确到多少位与机器有关。1.4.3 字符型数据1。字符常量。有两种表示形式:(1)普通字符,用单引号
括起来的一个字符,如:’a’、’E’、’?’、’#’。不能写成’ab’或’123’。(2)转义字符,C语言还允许用一种特殊形式的字
符常量,就是以字符\开头的字符序列。例如,’\n’代表一个“换行”符,’\t’代表输出的位置跳到下一个tab位置(制表位置),一个
tab位置为8列。表1-2列出了C语言中的转义字符。表1-2 C语言中的转义字符2.字符串常量。它是一对双引号(””)括起来的字符
序列。字符的个数称为其长度,简称为字符串。 长度为n的字符串,在计算机存储器中占n+1个字节,分别存放字符的编码,最后一个字节存放
是NULL字符(或叫空字符,编码为0,在C语言中也用‘\0’来表示,也就是说任何一个字符串最后一个存储字节都是‘\0’)。例如“h
ellow”在计算机中表示形式为:图1.21 字符串存储形式例1.19 以下选项中能表示合法常量的是(2010年9月全国计算机等级
考试二级C试题选择题第15题)。 A)整数:1,200 B)实数:1.5E2.0 C)字符斜杠:’\’ D)字符串”\007
”分析:整数常量表示形式中不能有千位分隔符,A错误。实数常量的指数形式字母e(或E)后面的指数必须为整数,B错误。字符斜杠应用转义
字符的形式表示’\\’,C错误。选D。例1.20 以下选项中关于 C 语言常量的叙述错误的是(2011年9月全国计算机等级考试二级
C试题选择题第13题)。A)所谓常量,是指在程序运行过程中,其值不能被改变的量 B)常量分为整型常量、实型常量、字符常量和字符串常
量C)常量可分为数值型常量和非数值型常量 D)经常被使用的变量可定义成常量分析:所谓常量是指在程序运行过程中,其值不能改变的量。在
C语言中,有整型常量、实型常量、字符常量和字符串常量等类型。整型常量和实型常量又称为数值型常量,它们有正值和负值的区分。所谓变量是
指在程序运行过程中其值可以改变的量。C语言规定,程序中所有变量都必须先定义后使用。变量和常量有明显的区分,D错误。3.字符变量字符
变量用来存储字符常量,即单个字符。字符变量的类型说明符是char。字符变量类型定义的格式和书写规则都与整型变量相同。例如: cha
r a,b;例1.21 有以下定义语句,编译时会出现编译错误的是(2009年9月全国计算机等级考试二级C试题选择题第22题)。A)
char a=’a’; B)char a=’\n’;C)char a=’aa’; D)char a=’\x2d’;分析:本
题中a为一个字符型变量,只能为其赋值一个字符常量。选项C中a赋值了一个字符串常量,所以会编译错误。B、D选项为转义字符,所以不会出
现编译错误。4.字符数据在内存中的存储形式及使用方法每个字符变量被分配一个字节的内存空间,因此只能存放一个字符。字符值是以ASCI
I码的形式存放在变量的内存单元之中的。如x的十进制ASCII码是120,y的十进制ASCII码是121。对字符变量a,b赋予''x''
和''y''值:a=''x'';b=''y'';实际上是在a,b两个单元内存放120和121的二进制代码:a:b:5.可对字符量进行的运算在C
程序中,字符量可参与任何整数运算。例如:‘B’-‘A’≡66-65≡1 ‘a’+1≡97+1≡98≡‘b’此处符合≡表示等价的
意思。在以上表达式中的66、65、97、98都是十进制数,它们分别是字母B、A、a、b的ASCII代码值。因此很容易利用算术运算把
大写字母转换成小写字母或把小写字母转换成大写字母,例如:‘A’+32≡65+32≡97≡‘a’ ‘b’-32≡98-32≡66≡‘
B’也可以通过算术运算把数字字符转换为整数值或把一位整数转换成数字字符,例如:‘9’-‘0’ ≡57-48≡9 ‘3’-‘0’
≡51-48≡3‘9’+’0’ ≡9+48≡57≡‘9’ 4+‘0’ ≡4+48≡52≡‘4’在上述表达式中,57、48、51
、52分别是用十进制数表示的字符9、0、3、4的ASCII代码值。1.5 算术表达式1.5.1 基本的算术运算符1.5.2 算术运
算符的优先级、结合性和算术表达式1.5.3 强制类型转换1.5.1 基本的算术运算符在C语言中,基本的算术运算符是:+、-、、/
、%,分别为加、减、乘、除、求余运算符。这些运算符需要两个运算对象,称为双目运算符。除求余运算符%外,运算对象可以是整型,也可以是
实型。1.5.1 基本的算术运算符例1.22 除法运算符的运用。main(){ printf("%d,%d\n",20/7,-2
0/7); printf("%f,%f\n",20.0/7,-20.0/7); }运行结果:2,-22.857143,-2.85
7143分析:本例中,20/7,-20/7的结果均为整型,小数全部舍去。而20.0/7和-20.0/7由于有实数参与运算,因此结果
也为实型。1.5.1 基本的算术运算符例1.23 求余运算符的运用。main(){ printf("%d\n",100%3);}
运行结果:1分析:求余运算符要求参与运算的量均为整型,求余运算的结果等于两数相除后的余数。例1.24 若有语句double x=
17;int y;,当执行y=(int)(x/5)%2;之后y的值为___ 。(2009年9月全国计算机等级考试二级C试题填空题第
7题)分析:本题考察了运算符以及常量类型的强制转换,先计算x/5,因为x为double类型,所以得到的结果为3.4,强制类型转换为
int类型,结果为3.再做除以2取余的运算,结果为1。1.5.2 算术运算符的优先级、结合性和算术表达式表达式是由常量、变量、函数
和运算符组合起来的式子。一个表达式有一个值及其类型, 它们等于计算表达式所得结果的值和类型。表达式求值按运算符的优先级和结合性规定
的顺序进行。单个的常量、变量、函数可以看作是表达式的特例。1.算术表达式用算术运算符和括号将运算对象(也称操作数)连接起来的、符合
C语法规则的式子。以下是算术表达式的例子:a+b(a2)/c(x+r)8-(a+b)/7++Isin(x)+sin(y)(++
i)-(j++)+(k--)2.运算符的优先级C语言中,运算符的运算优先级共分为15级。1级最高,15级最低。在表达式中,优先级较
高的先于优先级较低的进行运算。而在一个运算量两侧的运算符优先级相同时,则按运算符的结合性所规定的结合方向处理。3.运算符的结合性C
语言中各运算符的结合性分为两种,即左结合性(自左至右)和右结合性(自右至左)。例如算术运算符的结合性是自左至右,即先左后右。如有表
达式x-y+z则y应先与“-”号结合,执行x-y运算,然后再执行+z的运算。这种自左至右的结合方向就称为“左结合性”。而自右至左的
结合方向称为“右结合性”。 最典型的右结合性运算符是赋值运算符。如x=y=z,由于“=”的右结合性,应先执行y=z再执行x=(y=
z)运算。C语言运算符中有不少为右结合性,应注意区别,以避免理解错误。运算符的优先级和结合性见附录3。1.5.3 强制类型转换强制
类型转换表达式的形式如下: (类型说明符) (表达式)上述形式中,(类型名)称为强制类型转换运算符,利用强制类型转换运算符
可以将一个表达式的值转换成指定的类型,这种转换是根据人为要求进行的。例如: (float)a 把a转换为单精度型
(int)(x+y) 把x+y的结果转换为整型在使用强制转换时应注意以下问题:1.类型说明符和表达式都必须加括号(单
个变量可以不加括号),如把(int)(x+y)写成(int)x+y则成了把x转换成int型之后再与y相加了。2.无论是强制转换或是
自动转换,都只是为了本次运算的需要而对变量的数据长度进行的临时性转换,而不改变数据说明时对该变量定义的类型。例1.25 表达式:(
int)((double)9/2)-(9)%2的值是(2009年9月全国计算机等级考试二级C试题选择题第14题)。A)0
B)3 C)4 D)5分析:这是一道计算题,考察了算术运算符的优先级和强制类型转换。运算符“( )”的
优先级最高,所以先算括号里的内容“((double)9/2)”,这是强制类型转换表达式的形式,首先将“9/2”转换成double类
型再转换成int类型,这部分结果为4;“%”的优先级高于“-”,所以先进行求余,“(9)%2”结果为1,再进行减法,也就是“4-1
”,选B。1.6 赋值运算符1.6.1 赋值运算符和赋值表达式1.6.2 复合赋值表达式1.6.3 赋值运算中的类型转换1.6.1
赋值运算符和赋值表达式简单赋值运算符记为“=”。由“= ”连接的式子称为赋值表达式。其一般形式为:变量=表达式例如: x=
a+b w=sin(a)+sin(b) y=i+++--j1.6.1 赋值运算符和赋值表达式凡是表达式可以出现的地方均
可出现赋值表达式。例如:x=(a=5)+(b=8)是合法的。它的意义是把5赋予a,8赋予b,再把a,b相加,和赋予x,故x应等于1
3。1.6.2 复合赋值表达式赋值符“=”之前加上其它二目运算符可构成复合赋值符。如+=,-=,=,/=,%=,<<=,>>=,
&=,^=,|=。 构成复合赋值表达式的一般形式为:变量 双目运算符=表达式它等效于变量=变量 运算符 表达式1.6.2 复合赋
值表达式例1.26 若有定义语句:int x=10;,则表达式x-=x+x的值为(2009年9月全国计算机等级考试二级C试题选择题
第15题)。A)-20 B)-10 C)0 D)10分析:本题考查复合赋值表达式的运算。先做x+x结果为20,再做x-20,
结果为-10赋值给x。选B。1.6.2 复合赋值表达式例1.27 表达式a+=a-=a=9的值是(2010年9月全国计算机等级考试
二级C试题选择题第16题)。 A)9 B)_9 C)18 D)0 分析:本题中表达式的计算顺序是a+=(a-=(a=9)),
首先a=9,则a-=9即a=a-9=9-9=0;最后a+=0;即a=a+0=0+0=0;选D。1.6.3 赋值运算中的类型转换如果
赋值运算符两边的数据类型不相同,系统将自动进行类型转换,即把赋值号右边的类型换成左边的类型。具体规定如下:实型赋予整型,舍去小数部
分。整型赋予实型,数值不变,但将以浮点形式存放,即增加小数部分(小数部分的值为0)。字符型赋予整型,由于字符型为一个字节,而整型为
二个字节,故将字符的ASCII码值放到整型量的低八位中,高八位为0。整型赋予字符型,只把低八位赋予字符量。1.6.3 赋值运算中的
类型转换应注意:(1)当赋值号左边的变量为短整型,右边的值为长整型时。短整型变量只能接受长整型数低位上两个字节中的数据,高位上两个
字节中的数据将丢失。也就是说,右边的值不能超出短整型的数值范围,否则将得不到预期的结果。1.6.3 赋值运算中的类型转换(2)当赋
值号左边的变量为无符号整型,右边的值为有符号整型时。则把内存中的内容原样复制。右边数值的范围不应超出左边变量可以接受的数值范围。同
时需要注意,这时负数将转换为正数。 (3)当赋值号左边的变量为有符号整型,右边的值为无符号整型时,复制的机制同上。这时符号位为1,
将按负数处理。1.6.3 赋值运算中的类型转换在C语言的表达式(不包括赋值表达式)中,如果运算符两边的整数类型不相同,将进行类型之
间的自动转换。转换规则如下:1.若参与运算量的类型不同,则先转换成同一类型,然后进行运算。2.转换按数据长度增加的方向进行,以保证
精度不降低。如int型和long型运算时,先把int量转成long型后再进行运算。1.6.3 赋值运算中的类型转换3.所有的浮点运
算都是以双精度进行的,即使仅含float单精度量运算的表达式,也要先转换成double型,再作运算。4.char型和short型参
与运算时,必须先转换成int型。5.在赋值运算中,赋值号两边量的数据类型不同时,赋值号右边量的类型将转换为左边量的类型。如果右边量
的数据类型长度左边长时,将丢失一部分数据,这样会降低精度,丢失的部分按四舍五入向前舍入。1.6.3 赋值运算中的类型转换例1.28
赋值运算中类型转换的规则。main(){ int a,b=322; float x,y=8.88; char c1=''k'',c2; a=y; x=b; a=c1; c2=b; printf("%d,%f,%d,%c",a,x,a,c2);}运行结果:107,322.000000,107,B分析: a为整型,赋予实型量y值8.88后只取整数8。x为实型,赋予整型量b值322后增加了小数部分。字符型量c1赋予a变为整型,整型量b赋予c2后取其低八位成为字符型(b的低八位为01000010,即十进制66,按ASCII码对应于字符B)。1.6.3 赋值运算中的类型转换例1.29 若有定义语句:int a=10;double b=3.14;,则表达式‘A’+a+b 值得类型是(2011年9月全国计算机等级考试二级C试题选择题第14题)。 A.char B.int C.double D.float分析:’A’是字符型,变量a是整型,变量b是double型;字符型数据占1个字节、整型占2个字节、双精度型占8个字节,故三者相加后向数据长度增加的方向转换,即double型,选C。1.7 自加、自减运算符和逗号运算符1.7.1 自加、自减运算符1.7.2 逗号运算符和逗号表达式1.7.1 自加、自减运算符自增1运算符记为“++”,其功能是使变量的值自增1。自减1运算符记为“--”,其功能是使变量值自减1。自增1,自减1运算符均为单目运算,都具有从右到左的结合性。可有以下几种形式:++i i自增1后再参与其它运算。--i i自减1后再参与其它运算。i++ i参与运算后,i的值再自增1。i-- i参与运算后,i的值再自减1。例1.30 自加、自减运算符的使用。main(){ int i=8; printf("%d\n",++i); printf("%d\n",--i); printf("%d\n",i++); printf("%d\n",i--); printf("%d\n",-i++); printf("%d\n",-i--);} 运行结果:9889-8-91.7.2 逗号运算符和逗号表达式在C语言中逗号“,”也是一种运算符,称为逗号运算符。 其功能是把两个表达式连接起来组成一个表达式, 称为逗号表达式。其一般形式为:表达式1,表达式2其求值过程是分别求两个表达式的值,并以表达式2的值作为整个逗号表达式的值。逗号运算符的结合性为从左到右,在所有运算符中,逗号运算符的优先级最低。例1.31 设有定义:int x=2;,以下表达式中,值不为6的是(2009年3月全国计算机等级考试二级C试题选择题第14题)。A)x=x+1 B)x++,2x C)x=(1+x) D)2x,x+=2分析:本题考查运算符的定义及使用以及运算符的优先级。首先选项A因为赋值运算符比算术运算符优先级低,所以先做x+1,此时为3,然后再x=3,所以为6;选项B中,x++得3,然后2x得6;选项C与选项A原理一致,2x虽然结果为4,但此时x的值仍为2,因此x+=2得4。选D。
献花(0)
+1
(本文系小磊老师首藏)