C程序设计程序设计入门、数据类型和运算

更新时间:2023-12-30 22:53:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

1 程序设计入门

1.1 C程序的结构与书写格式

【例1.1】在屏幕上显示出“This is a C program!”。

要完成这样的一个程序,需要进入程序开发环境编写与调试程序,输入以下代码: #include // 将库文件stdio.h包含到该文件中 void main() // 主函数 { printf(“This is a C program!\\n”); // 在屏幕上一个字符串 }

程序从main()开始执行,printf(“This is a C program!\\n”);语句输出结果。运行结果如图1.1所示。

图1.1 运行结果

例1.1尽管是一个简单的C程序,但是基本体现了C程序的结构。该程序包括三部分:预处理命令部分、函数定义部分和注释部分。

(1)以#开始的语句是预处理命令。#include 作为程序的一部分,若没有它,printf语句的输出功能不能实现。

(2)C程序必须且只能包含一个主函数main(),花括号{}括起来的部分是函数体。 (3)符号//后的内容是注释部分,用于说明程序或语句的功能,目的是便于阅读程序。 每条语句以分号“;”结束。C语言中区分大小写字母,如main、printf等只能小写。C程序的源文件的名字由用户选定,但扩展名为C ,C++源文件的扩展名为CPP。

1.2 C程序上机引导

C-Free是一款基于Windows的C/C++集成开发软件,利用本软件,可以方便地编辑、调试、运行程序。

【例1.2】编写程序求两个整数之和,并输出结果。 #include void main() { int sum,a,b; // 定义变量 a=10; // 变量赋值 b=130; sum=a+b; // 计算和 printf(\ // 输出结果 }

启动C-Free,单击工具栏上的“新建文件”按钮,在编辑区输入、编辑程序后如图1.2所示。

1

图1.2 C-Free开发环境

单击工具栏上的“运行”按钮,或按功能键F5,或者选择“构建|构建并运行”菜单命令,系统对源程序进行语法检查并翻译成机器代码,连接、装配成可执行文件。如果程序有错,则信息栏将显示错误信息,双击错误信息,编辑区将高亮显示错误的位置,直到全部错误修改完毕。构建并运行过程如图1.3所示。

图1.3运行过程

C-Free下的“运行”命令其执行过程由编译源程序、连接目标程序及库文件、运行程序等步骤组成。编译程序完成语法检查并产生目标代码;连接程序将相关的目标代码连接起来产生可执行文件,其过程如图1.4所示。

2

开始 编辑 源程序 否 编译成功 目标程序 连接 可执行程序 否 运行成功 是 运行成功

图1.4 C程序运行过程图

1.3 格式化输入输出

1.3.1 数据的输入输出

【例1.3】阅读并运行程序,分析结果了解输入输出格式的使用。 #include void main()

{ int a,b,sum; // 定义变量 scanf(\ // 通过scanf输入函数给变量赋值 sum=a+b; // 两个数的加法 printf(\ // 把加法的结果输出到屏幕上 }

程序功能是从键盘输入两个整数,输出两数之和。scanf(\语句完成输入,参数“\%d\&a, &b”表示以十进制形式从键盘输入两个数存放在变量a、b内;printf(\语句输出计算结果,参数“\”表示在显示在显示屏上输出字符“a+b=”,再跟上sum中的内容。

1.3.2 格式化输出函数printf()

printf()函数的功能是按照给定的格式输出数据,一般形式为:

printf(\输出格式字符串\输出项);

其中:输出格式字符串决定了数据的输出格式,“%”与后面的格式符,规定了对应输

3

出项的输出格式,其他符号按原样输出。

例如:若a=34,b=12,sum是a与b的和,则语句printf(\a+b=%d\ sum);的输出结果为a+b=46。

其中“%d”是输出格式,对应输出项sum,字符串“a+b=”是非格式符,按原样输出。 printf()函数常用格式符如表1-1所示。

表1-1 printf常用格式符

格式符 d c s f

说 明 以带符号的十进制形式输出整数 以字符形式输出,只输出一个字符 输出字符串 范 例 printf(\printf(\printf (\显 示 -46,56(+不输出) AA Hello! 46.000000 以小数形式输出单、双精度数,默认6位小数 printf(“%f”,46); (1)%d按整型数据的实际位数输出。若要控制输出数据的宽度,可以在d前加一个数字,如printf(“], ]”, a, b);,若a=123,b=121345,则输出结果为□□123,121345。数据a不足5位,左边用空格补足5位;数据b多于5位,按实际位数输出。

(2)%c输出一个字符。若以字符形式输出一个整数,则输出的是该整数对应的字符。如printf(\输出结果为A, A, B。'A'+1表示A的下一个字母。

(3)%s输出一个字符串。如printf(“%s”,“HELLO”);输出结果为HELLO。 (4)%f以实数形式输出(带小数点)。如a=12.34,则printf(\输出结果为12.340000, 12.340。其中%.3f表示保留3位小数。

注意:

printf()函数中输出格式符与输出项的个数相同,类型一致,如下所示: printf(“…%d …%f …%c …”, .a, . b, . c);

【例1.4】阅读并运行程序,分析结果理解%d格式符的使用。 #include void main()

{. int a=12,b=18; float x=3.14159;

printf(\ printf(\

printf(\}

第一个printf()函数按整型数据输出,符号“\\n”表示换行;第二个printf()函数按实数形式输出,前一个x采用默认格式输出6位小数,后一个x按5.2f格式输出2位小数;第三个printf()函数输出字符串,运行结果如图1-5所示。

图1-5 例1.4运行结果

4

1.3.3 格式化输入函数scanf()

scanf()函数的功能是从键盘输入数据,一般形式为: scanf(“输入格式”,输入项);

其中输入格式中一般只使用格式符,格式符与printf()函数中格式类似。输入项用于接收数据,如scanf(“%d%d”,&x,&y);表示将输入的两个整型数送到变量x和y,输入的两个数据用空格分隔。

scanf()函数格式说明也以%开头,后跟格式符,常用的输入格式符如表1-2所示。

表1-2 scanf常用格式符

格式符 d c s f 以带符号的十进制形式输入整数 以字符形式输入,只允许输入一个字符 输入字符串,将字符串送到一个字符数组中,在输入时以非空格字符开始。以第一个空格字符结束。字符串以串结束标志?\\0?作为其最后一个字符 以小数形式输入单、双精度数 说 明

【例1.5】阅读并运行程序,分析结果理解scanf函数的使用。 #include void main() { int x,y,z; // 定义变量 float f1,f2;

printf(\输入3个整数,用逗号分隔:\ // 输出提示说明 scanf(\ // 输入到变量x,y,z printf(\ printf(\输入2个实数,用逗号分隔:\ scanf(\

printf(\}

运行结果如图1.6所示。

图1.6 例1.5运行结果

scanf函数中输入项变量前需要加符号“&”。 若scanf函数中多个输入格式符要用逗号分隔,则输入的数据也必须用逗号分隔;若输入格式符是连续的,则输入的数据用空格分隔。

图1.6中f2输入的数据是34.55,而输出为34.549999是由于进制间转换的误差所造成的。

5

1.3.3 字符输出函数putchar()

putchar()函数的功能是输出一个字符数据,如putchar(c);表示输出变量c中的字符。 【例1.6】阅读并运行程序,分析结果理解putchar函数的使用。 #include void main()

{ char a='B',b='5'; // 定义变量a,b int c=65;

putchar(a); // 输出变量a中的字符B putchar(b);

putchar('\\n'); // 输出换行 putchar(c); putchar('\\n'); }

当putchar() 函数中的参数为一个整数时,putchar() 函数输出该整数所对应的ASCII字符。本例中c=65,对应的ASCII字符为大写字母A,运行结果如图1.7所示。

图1.7 例1.6运行结果

1.3.4 字符输入函数getchar()

getchar()函数的功能是输入一个字符数据,在程序中使用这个函数时,一般用一个字符变量接收读取的字符,如c=getchar();。

【例1.7】阅读并运行程序,分析结果理解getchar函数的使用。 #include main() { char ch;

ch=getchar(); // 等待用户输入一个字符 printf(\ // 按不同的格式输出变量ch }

运行结果如图1.8所示。

图1.8 例1.7运行结果

当执行到语句“ch=getchar();”时,程序等待用户输入一个字符,按下A键后回车,得到以上结果。“printf(\”语句中第一个变量ch以字符形式输出,第二个变量ch以以带符号的十进制形式输出整数。

6

1.4 输入输出应用案例

【例1.8】输入圆柱的半径r和高h,计算并输出其体积。 #include void main() { float r, h, v;

scanf(\ // 输入圆柱的半径r和高h v=3.14*r*r*h; // 计算体积 printf(\体积:%f\\n\}

由于scanf函数中2个输入格式符用逗号分隔,则输入半径r和高h也必须用逗号分隔。输入项变量r和h前需要加符号“&”。运行结果如图1.9所示。

图1.9 例1.8运行结果

【例1.9】输入两条直角边a和b的长度,求直角三角形的面积和斜边c上的高h。

分析:由勾股定律a2+b2=c2,可求出斜边c;两条直角边a和b与斜边c及其上的高h满足关系:a × b = c × h,可计算出面积和斜边c上的高h。使用sqrt函数求平方根,需要预处理命令#include

程序如下:

#include #include void main()

{ float a, b, c, h, s;

scanf(\ s=(a*b)/2;

c=sqrt(a*a+b*b); h=2*s/c;

printf(\}

运行结果如图1.10所示。

图1.10 例1.9运行结果

总 结

7

本章主要介绍了C语言的特点、程序的基本结构、上机过程、C-Free环境的使用以及结构化程序设计的设计思想。

此外,本章还着重介绍了程序中数据的输入与输出。在C语言中,所有的输入输出都是通过调用标准库函数中的输入输出函数来实现的。输入输出函数包含在stdio.h文件中。其中:

(1)scanf和getchar函数是输入函数,接收来自键盘的输入数据。

scanf是格式输入函数,可以按照指定的格式输入任意类型的数据;getchar函数是字符输入函数,只能接收单个字符。

(2)printf和putchar函数是输出函数,向显示屏输出数据。

printf是格式输出函数,可以按照指定的格式输出任意类型的数据;putchar函数是字符输出函数,只能输出单个字符。

数据的输入输出是本章的重点,也是较难掌握且容易出错的内容,在学习过程中应多用多练。

习 题

1、阅读程序写出执行结果

(1)下列程序的运行结果为___________。 #include void main()

{ char c1=?a?,c2=?b?,c3=?c?;

printf(“a?%c\\tc%c\\n”,c1,c2,c3); }

(2)下列程序的运行结果为____________。 #include void main()

{ char c1=?D?,c2=?L?,c3=?A?;

printf(“%c%c%c \\n”,c1+1,c2+2,c3+3); }

(3)下列程序的运行结果为__________。 #include void main()

{ int a=3,b=5,c=8; float aver;

aver=(a+b+c)/3.0;

printf(“aver=%f\\n”,aver); }

(4)下列程序的运行结果为___________。 #include void main()

{ int j1=30,j2=75,j3; j3=180-j1-j2;

printf(“%d\\n”,j3); }

8

2、程序填空

(1)补全程序,使它在显示屏幕上输出如下信息,请填空。 ******************************* This is my first C program! ******************************* #include void main()

{ printf(\_________________________________\); printf(\_________________________________\); printf(\_________________________________\); }

(2)补全程序,使用getchar函数接收一个字符,用printf函数显示;使用scanf函数接收一个字符,用putchar()函数显示。

#include void main() { char c;

printf(\please input the first char:\); _______________; printf(\______\,c);

printf(\please input the second char:\); scanf(\%c\,______); _______________; }

3、编程题

(1)编写一个程序,输出以下信息:

$$$$$#####*****

This is a C program! $$$$$#####*****

(2)编写一程序,用scanf函数输入一个字符,用printf函数将该字符显示出来。 (3)假设美元与人民币的汇率是1美元兑换6.829元人民币,编写程序输入人民币的值,输出能兑换的美元金额。

(4)编写一程序,将摄氏温度转换成华氏温度。[转换公式:f=c*1.8+32。其中c为摄氏温度,f为华氏温度。]

习题答案

1.阅读程序写出执行结果 (1)aAbB,cc (2)END

(3)aver=5.333333 (4)75

2.程序填空 (1)解: 略

9

(2)解:⑴ c=getchar() ⑵ %c ⑶ &c ⑷ putchar(c)

常见错误和难点分析

1.在输入语句scanf函数中忘记使用变量的地址符。

例如:scanf(\这是许多初学者刚刚学习C语言时一个习惯性错误。应写成scanf(\

2.输入数据的格式与要求不符。

用scanf函数输入数据要注意输入数据的格式。例如有如下scanf函数:

scanf(\若这样输入数据:5,8↙,是错误的。正确的输入应是5 8↙。 scanf函数输入数据的基本原则:

(1)被输入的数据之间默认使用空格、Tab键或者回车符来分隔。

(2)scanf函数中格式字符串中除了格式转换说明符以外,对其他字符必须按照原样进行输入,包括转义字符。例如有scanf(\若把变量a赋初值5,把变量b赋初值8,应进行如下输入:a=5,b=8\\n↙

3.printf函数输出表项的计算顺序。

已知a=1,m=5,n=8,有输出语句:printf(\则输出结果是13,13,而不是1,13。由此可见printf函数输出表项中的表达式是从右至左依次计算的。

4.改错与调试

找出下列程序中的错误,并改正。 #include void main()

{ double a,b,c,s,v; printf(input a,b,c:\\n); scanf(\ s=a*b; v=a*b*c;

printf(\}

当程序执行时,屏幕的显示和要求输入的形式如下: input a,b,c:2.0 2.0 3.0

a=2.000000,b=2.000000,c=3.000000 s=4.000000,v=12.000000

10

2 数据类型和运算

2.1 数据类型

2.1.1 程序引例

【例2.1】已知一个圆的半径,求这个圆的周长和面积。 (1)分析:

如果用r代表圆的半径,用g代表圆的周长,用s代表圆的面积,用PI代表圆周率π,圆的周长公式是g=2πr,面积公式是s=πr2。在这两个公式里,PI是圆周率,固定不变的,而半径是可变的,则圆的周长与圆的面积也是可变的,这些元素如何在C语言里进行说明并表示出来?

(2)程序源码: #include \#define PI 3.14 void main() { int r=1; float g,s; g=2*PI*r; s=PI*r*r;

printf(\}

图2-1 例2.1运行结果

运行结果如图2-1所示。由图中可以看到,r的值为整数1,而g,s为小数形式,也就是说,r与g,s是不同的数据类型。没有无类型的数据,C语言的数据类型如图2-2所示。

11

短整型(short) 整型 整型(int) 长整型(long) 基本类型

实型(浮点型) 字符类型(char) 数组类型

构造类型

指针类型 结构体类型(struct) 共用体类型(union) 枚举类型(enum)

空类型(void)

图2-2 C语言的数据类型

单精度型(float) 双精度型(double)

C语言的基本类型有三种:字符型、整型和实型(浮点型)。C语言的基本类型修饰符有四种:singed(有符号)、unsigned(无符号)、long(长型符)、short(短型符),这些类型修饰符可以与字符型或整型数据配合使用。基本数据类型和取值范围如表2-1所示:

表2-1 C语言常用基本数据类型描述

类型 char int float double 说明 字符型 整型 单精度实型 双精度实型 内存单元个数 1字节 4字节 4字节 8字节 8取值范围 即0~(2-1) 即-2~(2-1) -3.4E+38~3.4E+38 -1.7E+308~1.7E+308 3131说明:C语言中,整型数据的取值范围随着程序编译系统的不同而不同。本书以C-Free 3.5作为程序调试环境。

2.1.2 标识符和关键字

所谓标识符是指用来标识程序中用到的变量名、函数名、类型名、数组名、文件名以及符号常量名等有效字符序列。

在C语言中,标识符的命名规则是:由字母(大小写皆可)、数字及下划线组成,且第一个字符必须是字母或下划线。

由上述的标识符命名规则可知,下面的标识符名是合法的: year、_123、Int

而下面的标识符是非法的: #123、float、1_2 所谓关键字(保留字),它也是C语言的一种标识符,它用来命名C语言程序中的语句、数据类型和变量属性等。每个关键字都有固有的含义,不能另做其他用途,C语言中所有关键字都使用小写字母来表示。

12

2.1.3 常量

常量(常数),是指在程序运行过程中其值不可改变的量。C语言中的常量可分整型常量、实型常量和字符型常量。

(1)整型常量

整型常量又称为整数,在C语言中,整数可以用三种数制来表示: ① 十进制数常量 十进制整常量数没有前缀,其数码为0~9。

② 八进制整常量 八进制整常量必须以数字0开头,其数码取值范围为0~7。 ③ 十六进制数常数 十六进制数常数的前缀为0X 或0x。其数码取值范围为0~9、A~F或a~f。

(2)实型(浮点型)常量

实型常量也可称为实数或浮点数。在C语言中,实数采用十进制表示。它有两种形式: ① 十进制小数形式

小数形式是由数码0~9和小数点组成(注意:必须有小数点)。 ② 指数形式

指数形式又称科学计数法。其一般形式为:a E n (a表示十进制数,n表示指数),其数值为a×10n。

注意:指数表示形式中E或e前后必须有数字,E或e后面的数字必须是整数。 【例2.2】整型常量和实型常量的输出。 #include void main()

{ printf(“a=%d,b=%d,c=%d\\n”,38,017,0x20); printf(“p=%f,p=%e\\n”,123.456,123.456); }

第一个printf语句,以十进制形式输出用三种数制表示的整数,第二个printf语句,以小数形式和指数形式输出实数,运行结果如图2-3所示。

图2-3 例2.2运行结果

(3)字符型常量

字符常量是用单引号括起来的一个字符。例如:?A?、?a?等。 在C语言中,字符常量有以下特点: ①字符常量只能用单引号括起来,不能使用双引号或其他括号。单引号是字符常量的定界符,不是字符常量的一部分。

②字符常量只能存放一个字符,不能是多个字符。字符值是以ASCII码的形式存放在内存单元中。数字被定义为字符型之后就不能参与数值运算,也就是说?5?与5是不同的。

③转义字符

转义字符是一种特殊的字符常量。转义字符以反斜线“\\”开头,后面跟一个或几个字符。转义字符主要用来表示控制代码,例如“回车”,“换行”等。转义字符具有特定的含义,不同于字符原有的意义,所以称为“转义”字符。常用转义字符如表2-2所示。

13

表2-2 常用的转义字符及其功能

字符 \\0 \\n \\? \\” \\\\ \\ddd \\xhh 表示字符串结束 换行,将当前位置换到下一行的行首 单引号字符 双引号字符 反斜杠字符 1-3位八进制数表示的ASCII码所代表的字符 1-2为十六进制数表示的ASCII码所代表的字符 功能 ASCII码 0 10 39 34 92 0-255 0-255 表中最后两行是用ASCII码(八进制或十六进制)表示一个字符。例如:?\\101?或?\\x41?表示ASCII码为十进制数65的字符?A?。其中?\\101?中101是八进制,转换成十进制是65,而?\\x41?中x41是十六进制,转换成十进制也是65。

【例2.3】字符常量的输出。 #include main()

{ printf(“ch1=%c,ch2=%c\\n”, ?a?, ?b?); printf(“ch1=%d,ch2=%d\\n”, ?a?, ?b?);

printf(“ch3=%d,ch3=%c\\n”, ?\\101?, ?\\101?); }

运行结果如图2-4所示:

图2-4 例2.3运行结果

(4)字符串常量

字符串常量是用一对双引号括起来的字符序列。例如:”hello”、“”、“123”。字符串的长度等于字符串中包含的字符个数。例如:字符串“hello”的长度为5个字符。

字符串常量与字符常量是不同的,它们之间主要的区别有: ①字符常量使用单引号定界,字符串常量使用双引号来定界。

②字符常量只能是单个字符,字符串常量则可以包含一个或多个字符。

③可以把一个字符常量赋给一个字符变量,但不能把一个字符串常量赋予一个字符变量,在C语言中没有相应的字符串变量,可以用一个字符数组来存放一个字符串常量。

字符常量占一个字节的存储空间。字符串常量占的内存字节数等于字符串的长度加1,增加一个字节中存放字符?\\0?,用于标志字符串的结束。

字符常量?a?和字符串常量“a”,虽然都只有一个字符,但在内存中的情况是不同的。

?a? 在内存中占一个字节,可表示为: “a” 在内存中占两个字节,可表示为:

a a \\0 (5)符号常量

在C语言中,也可以用一个标识符来表示一个常量,称为符号常量。符号常量在使用

14

之前必须先定义,其一般形式为:#define 标识符 常量

如例2.1中,圆周率用PI表示,可写为:#define PI 3.14

其中“define”是关键字,前面加“#”,表示一条预处理命令(预处理命令都以“#”开头),称为宏定义命令。

该语句的功能是把标识符“PI”定义为其后的常量值3.14,定义后在程序中所有出现PI的地方均可以3.14来代替PI。符号常量的标识符是用户自己的定义的。

符号常量的特点:

①习惯上符号常量的标识符用大写字母,变量标识符用小写字母,以示区别。 ②符号常量与变量不同,它的值在其作用域内不能改变,也不能再被赋值。 ③使用符号常量的好处是:含义清楚,并且能做到“一改全改”。

2.1.4 变量

其值可以改变的量称为变量。一个变量应该有一个名字,在内存中占据一定的存储单元。变量定义必须放在变量使用之前。一般放在函数体的开头部分。要区分变量名和变量值两个概念。在例2.1中,圆的半径r值为1,则变量r在内存中的存储形式如下:

r 变量名

1 变量值 存储单元

C语言规定,所有变量在使用前必须先定义。

回顾例2.1中的两行程序代码:int r;和float s,l;

这两行代码功能是定义了一个整型变量r和两个浮点型变量s,l。其中int和float都是数据类型标识符,是C语言的关键字,用来说明变量的类型,而r,s,l是变量名。

(1)变量定义的格式:存储类型符 数据类型符 变量名表; 说明:

①存储类型符用来说明变量的存储类型,存储类型有自动类型(auto),寄存器类型(register),静态类型(static),外部类型(extern),默认为自动类型。如果未对存储类型做说明,则为自动类型。在例2.1中,变量定义语句都没有声明存储类型,所以都按自动类型处理。

②数据类型符用来说明变量的数据类型,它可以是C语言中任意一种基本数据类型。 ③变量名表中可以只有一个变量名,也可以有多个变量名,如果有多个变量名,各变量名之间用逗号分开。

(2)变量的赋值 定义变量后,在使用之前需要给变量一个初始值。在C语言中,可以通过赋值运算“=”给变量赋值。变量赋值的一般格式是:变量名=表达式;

变量的赋值一般有如下几种情况: ①先定义后赋值。 如: int r; r=1;

②在定义变量的同时为其赋值,称为变量的初始化。定义的变量可以全部初始化,也可以部分初始化。

例如,int r=1; 该语句即定义了整型变量r,同时为其赋初值为1。

变量在某一时刻只有一个确定的值,变量获得新值后,其原始值被覆盖。例如: int r;

15

r=1; r=2;

该程序执行后,变量r的值不是1,而是2。 定义多个同类型变量并要给所有变量赋值,只能逐个处理,每个赋值表达式之间用逗号分开。例如,有三个整型变量x,y,z,且初始值都是10,则可以写成如下形式:int x=10, y=10, z=10;

如果变量的类型与所赋数据的类型不一致,所赋数据将被转换成与变量相同的类型。例如:int x=10.5; 该程序执行后,变量x的值是整数10。

2.2 运算符和表达式

C语言的运算符不仅具有不同的优先级,而且还有一个特点,就是它的结合性。在表达式中,各运算量参与运算的先后顺序不仅要遵守运算符优先级别的规定,还要受运算符结合性的制约,以便确定是自左向右进行运算还是自右向左进行运算。这种结合性是其他高级语言的运算符所没有的,因此也增加了C语言的复杂性。C语言的运算符如表2-3所示。

表2-3 运算符分类表

运算符分类 算术运算符 关系运算符 逻辑运算符 位操作运算符 功能与运算符 数值运算:加(+)、减(-)、乘(*)、除(/)、取模(%)、自增(++)、自减(--) 比较运算:大于(>)、小于(<)、等于(==)、大于等于(>=)、小于等于(<=)、不等于(!=) 逻辑运算:与(&&)、或(||)、非(!) 按二进制位进行运算:位与(&)、位或(|)、位非(~)、位异或(∧)、左移(<<)、右移(>>) 赋值运算:简单赋值(=)、复合算术赋值(+=,-=,*=,/=,%=)、复合位运算赋值(&=,|=,∧=,>>=,<<=) 条件求值:(?:) 若干表达式组合成一个表达式:(,) 取内容(*)和取地址(&) 计算数据类型所占的字节数(sizeof) 括号(),下标[],成员(→,.) 赋值运算符 条件运算符 逗号运算符 指针运算符 求字节数运算符 特殊运算符 表达式是由常量、变量、函数和运算符组合起来的式子。 结合性:

一个运算量两侧的运算符优先级相同时,则按运算符的结合性所规定的结合方向处理。 例: a = b = c;

b的左右两侧都为=号,而=具有右结合性,故应该由右向左计算,即:a = (b = c); 例: if (5 == 4 == 0) {}

关系运算符具有左结合性,那么先计算 5 == 4, 结果为0, 再计算0 == 0,结果为真。 printf函数的计算是从右到左进行计算

2.2.1 算术运算符和算术表达式

(1)基本的算术运算符

①加法运算符“+”:加法运算符为双目运算符,应有两个量参与加法运算。如a+b,4+8等。具有左结合性。

16

②减法运算符“-”:减法运算符为双目运算符,但“-”也可作负值运算符,此时为单目运算,例如,-x,-5等具有左结合性。

③乘法运算符“*”:双目运算具有左结合性。

④除法运算符“/”:双目运算具有左结合性。参与运算量均为整型时,结果也为整型,舍去小数。例如,10/7 结果为1,2/5 结果为0,1/3+1/3+1/3的结果也是0。如果运算量中有一个是实型,则结果为双精度实型。

⑤取模运算符“%”:双目运算,具有左结合性。要求参与运算的量均为整型。运算的结果为两数相除后的余数。例如,5%3的值为2。

(2)算术表达式和运算符的优先级和结合性

算术表达式:用算术运算符和括号将运算对象(操作数)连接起来的、符合C语法规则的式子;单独的常量、变量、函数也是表达式。

以下是算术表达式的例子: a+b (a*2)/c (x+r)*8-(a+b)/7 ++i sin(x)+sin(y) (++i)-(j++)+(k--) 书写表达式时应注意与数学公式的区别。例如,

数学式:

x?y的C表达式为:(x+y)/(a+b),可用括号调整运算的先后顺序。 a?b?b?b2?4ac数学式:的C表达式为:(-b+sqrt(b*b-4*a*c))/(2*a)

2a运算符的优先级:C语言中,运算符的运算优先级共分为14级。1级最高,14级最低。在表达式中,优先级较高的先于优先级较低的进行运算。而在一个运算量两侧的运算符优先级相同时,则按运算符的结合性所规定的结合方向处理。

运算符的结合性:C语言中各运算符的结合性分为两种,即左结合性(自左至右)和右结合性(自右至左)。例如:算术运算符的结合性是自左至右,即先左后右。例如:表达式x-y+z,y应先与“-”号结合,执行x-y运算,然后再执行+z的运算。这种自左至右的结合方向就称为“左结合性”。而自右至左的结合方向称为“右结合性”。最典型的右结合性运算符是赋值运算符。如x=y=z,由于“=”的右结合性,应先执行y=z再执行x=(y=z)运算。C语言运算符中有不少为右结合性,应注意区别,以避免理解错误。

(3)自增、自减运算符

自增1,自减1运算符:自增1运算符记为“++”,其功能是使变量的值自增1。自减1运算符记为“--”,其功能是使变量值自减1。

自增1,自减1运算符均为单目运算,都具有右结合性。可有以下几种形式:

++i --i i++ i-- i自增1后再参与其他运算 i自减1后再参与其他运算 i参与运算后,i的值再自增1 i参与运算后,i的值再自减1 例如:int j=5,k=5,m,n; m=j++; // 相当于m=j; j=j+1; 运算后j的值为6,m的值为5 n=++k; // 相当于k=k+1; m=k; 运算后k的值为6,n的值为6 【例2.4】阅读程序,分析结果加深对各种算术运算的理解。 #include void main() { int i=8;

17

printf(\ printf(\ printf(\ printf(\ printf(\ printf(\}

运行结果如图2-5所示:

图2-5 例2.4运行结果

说明:

i的初值为8,第4行i加1后输出故为9;第5行减1后输出故为8;第6行输出i为8之后再加1(为9);第7行输出i为9之后再减1(为8);第8行输出-8之后再加1(i为9),第9行输出-9之后再减1(i为8)。

2.2.2 关系运算符和关系表达式

关系运算是逻辑运算中比较简单的一种。所谓“关系运算”实际上就是“比较运算”,将两个值进行比较,判断比较的结果是否符合给定的条件。在程序中经常需要比较两个量的大小关系,以决定程序下一步的工作。

(1)关系运算符及其优先级 在C语言中有以下关系运算符: < 小于 <= 小于或等于 > 大于 >= 大于或等于

== 等于 != 不等于

关系运算符都是双目运算符,其结合性均为左结合。关系运算符的优先级低于算术运算符,高于赋值运算符。在六个关系运算符中,<,<=,>,>=的优先级相同,高于==和!=;==和!=的优先级相同。

(2)关系表达式

关系表达式是指用关系运算符将两个表达式连接起来的有意义的式子。 关系表达式的一般形式为: 表达式 关系运算符 表达式

例如:c>a+b,a==bd),b

在进行关系运算时,需要注意以下几点:

关系表达式的结果是一个逻辑值,在C语言中逻辑值“真”用“1”表示,“假”用“0”表示。若关系表达式成立,则结果为1,否则,结果为0。

关系运算符的优先级低于算术运算符,高于赋值运算符“=”。

在C语言中,符号“=”用作赋值运算符,因而用“==”表示等于关系。另外,表示大于等于、小于等于、不等于所用的表示方法也和数学公式中的不同。

【例2.5】阅读程序,分析结果加深对各种关系运算的理解。 #include void main()

18

{ int a=5,b=10,c=15,d=20; printf(\ printf(\}

运行结果如图2-6所示:

图2-6 例2.5运行结果

2.2.3 逻辑运算符和逻辑表达式

(1)逻辑运算符及其优先级

关系表达式只能描述单一条件,例如x>=0,如果需要描述x>=0同时x<10,就要借助逻辑表达式了。

C语言中提供了三种逻辑运算符:

&& 逻辑与运算 || 逻辑或运算 ! 逻辑非运算 逻辑与运算符“&&”和逻辑或运算符“||”均为双目运算符,具有左结合性。逻辑非运算符“!”为单目运算符,具有右结合性。逻辑运算符和其他运算符优先级的关系可表示如图2-7所示。

逻辑非(!)运算符 算术运算符

关系运算符

逻辑与(&&)运算符和逻辑或(||)运算符 赋值运算符

图2-7 运算符优先级

按照运算符的优先顺序可以得出:

a>b&&c>d 等价于 (a>b)&&(c>d) !b==c||d

a+b>c&&x+yc)&&((x+y)

逻辑运算的值分为“真”和“假”两种,用“1”和“0”来表示。其求值规则如下: 1)逻辑与运算&&:参与运算的两个量都为真时,结果才为真,否则为假。 例如:6>0&&7>3 由于6>0为真,7>3也为真,相与的结果也为真。

2)逻辑或运算||:参与运算的两个量只要有一个为真,结果就为真;两个量都为假时,结果为假。

例如:5>0||5>8 由于5>0为真,相或的结果也就为真。 3)逻辑非运算!:参与运算量为真时,结果为假;参与运算量为假时,结果为真。 例如:!(5>0)的结果为假。

虽然C编译在给出逻辑运算值时,以“1”代表“真”,“0”代表“假”。但反过来在判断一个量是为“真”还是为“假”时,以“0”代表“假”,以非“0”的数值作为“真”。

(3)逻辑表达式

19

逻辑表达式的一般形式为:表达式 逻辑运算符 表达式 其中的表达式可以又是逻辑表达式,从而组成了嵌套的情形。

例如:(a&&b)&&c,根据逻辑运算符的左结合性,上式也可写为:a&&b&&c。 逻辑表达式的值是式中各种逻辑运算的最后值,以“1”和“0”分别代表“真”和“假”。

2.2.4 条件运算符和条件表达式

如果在条件语句中,只执行单个的赋值语句时, 常可使用条件表达式来实现。条件运算符为“ ?和:”,它是一个三目运算符,即有三个参与运算的量。

由条件运算符组成条件表达式的一般形式为:表达式1 ? 表达式2 : 表达式3

其执行的过程是:当表达式1的值为真,则以表达式2的值作为条件表达式的值,否则以表达式3的值作为条件表达式的值。

使用条件表达式时,还应注意以下几点:

(1)条件运算符的运算优先级低于关系运算符和算术运算符,但高于赋值符。 (2)条件运算符?和:是一对运算符,不能分开单独使用。 (3)条件运算符的结合方向是自右至左。

例如:a>b?a:c>d?c:d应理解为a>b?a:(c>d?c:d)。这也就是条件表达式嵌套的情形,即其中的表达式3又是一个条件表达式。

【例2.6】从键盘输入一个字符,如果输入的是英文大写字母,则将它转换成小写字母后输出,否则输出原来输入的字符。

#include void main() { char ch;

printf(“input ch:”); scanf(“%c”,&ch);

ch=(ch>=?A? && ch<=?Z? )? ch+32:ch; printf(“%c\\n”,ch); }

运行结果如图2-8所示:

图2-8 例2.6运行结果

2.2.5 赋值运算符和赋值表达式

(1)一般赋值运算符

简单赋值运算符和表达式:简单赋值运算符记为“=”。由“=”连接的式子称为赋值表达式。其一般形式为:变量=表达式

例如,x=a+b,赋值表达式的功能是计算表达式的值再赋予左边的变量。赋值运算符具有右结合性。

20

在C语言程序中,凡是表达式可以出现的地方均可出现赋值表达式。例如,式子:x=(a=5)+(b=8) 是合法的。它的意义是把5赋予a,8赋予b,再把a,b相加,和赋予x,故x应等于13。

(2)复合的赋值运算符

在赋值符“=”之前加上其他二目运算符可构成复合赋值符。例如,+=,-=,*=,/=,%=,<<=,>>=,&=,∧=,|=

构成复合赋值表达式的一般形式为:变量 双目运算符= 表达式 它等效于:变量 = 变量 运算符 表达式 例如: a+=5 等价于a=a+5 x*=y+7 等价于x=x*(y+7) r%=p 等价于r=r%p

复合赋值运算符这种写法对初学者可能不习惯,但十分有利于编译处理,能提高编译效率并产生质量较高的目标代码。

2.2.6 逗号运算符和逗号表达式

在C语言中逗号“,”也是一种运算符,称为逗号运算符。其功能是把两个表达式连接起来组成一个表达式,称为逗号表达式。

其一般形式为: 表达式1, 表达式2, ? 表达式n 其求值过程是从左至右分别求各个表达式的值,并以表达式n的值作为整个逗号表达式的值。

【例2.7】阅读并运行程序,分析结果加深对各种算术运算的理解。 #include void main() { int a,b;

a=(b=2,++b,b+5);

printf(\The value of a is %d\\n\,a); }

语句a=(b=2,++b,b+5);先执行b=2;再执行++b,此时b的值为3;最后执行b+5,b的值为8;将8赋值给变量a,运行结果如图2-9所示。

图2-9 例2.7运行结果

2.3 应用案例

【例2.8】输入一个学生三门课程的成绩,计算三门课程的总分及平均分。 #include void main()

{ int yw,sx,yy,sum; float aver;

21

scanf(“%d,%d,%d”,&yw,&sx,&yy); sum=yw+sx+yy; aver=sum/3.0;

printf(“sum=%d,aver=%f\\n”,sum,aver); }

运行结果如图2-10所示:

图2-10 例2.8运行结果

【例2.9】输入直角三角形的斜边和一条直角边,求三角形另外一条直角边,周长和面积。

#include \stdio.h\ #include \math.h\ void main() { float a,b,c; double l,s;

printf(\输入斜边、直角边的长:\); scanf(\ b=sqrt(c*c-a*a); l=a+b+c; s=a*b/2;

printf(\另一直角边=%f, 周长=%f, 面积=%f\\n\,b,l,s); }

使用sqrt()函数求平方根,需要预处理命令#include,运行结果如图2-11所示。

图2-11 例2.9运行结果

【例2.10】输入一个三位整数,依次输出该数的正(负)号和百位、十位、个位数字。 #include \stdio.h\ #include \math.h\ void main()

{ char c1,c2,c3,c4; int x;

scanf(\%d\,&x);

c4=x>=0?'+':'-'; /* x的符号存入c4 */ x=abs(x); /* 求整型数x的绝对值 */ c3=x+48; /* x为个位数,加48转换为对应字符 */ x=x/10; /* 去掉x的个位 */

22

c2=x+48; c1=x/10+48;

printf(\数符:%c,百位:%c,十位:%c,个位:%c\\n“,c4,c1,c2,c3); }

运行结果如图2-12所示:

图2-12 例2.10运行结果

总 结

本章主要介绍了C语言中有关数据与数据计算的基本概念和规则。关于数据的主要内容有:数据类型;常量与变量;各种类型数据的表示方法、数据的取值范围和数据的有效位数。关于计算的主要内容有:运算符和运算对象、表达式及其表示、运算优先级和结合性;算术运算;赋值运算;自增、自减运算;关系运算与逻辑运算;位运算;逗号运算等。

本章内容是C语言的基本语法元素,主要是一些概念与规则,没有多少灵活性,所以需要在理解的基础上熟记。

习 题

1. 把下列数学表示式写成C语言表达式

(1)x?y?a?b (4)x?y?(2)e3?(2x?3y) (3)(ln10?xy)3

(6)

x?ysin(??) (5) 0y3xcos45?3x1

111??r1r2r32. 根据条件写一个C语言表达式

(1)a和b中有一个大于d。 (2)将x,y中大的送给z。

(3)将直角坐标系中点(x,y)表示在第3象限内。 (4)3个数据x,y,z能组成三角形。 (5)d是不大于100的偶数。(提示:d应同时满足大于0、小于等于100、被2整除。) (6)x、y中至少有一个是5的倍数。 3. 阅读程序写出执行结果

(1)以下程序的执行结果是什么? #include main()

{ int a=2,b=3,c; c=a++-1;

printf(“%d,%d,”,a,c); c*=a+(++b||++c);

23

printf(“%d,%d\\n”,a,c);

}

(2)以下程序的执行结果是什么? #include main() { int a;

a=1+2*5-3; printf(“%d,”,a); a=3+4%5-6; printf(“%d,”,a); a=-3*4%-6/5; printf(“%d,”,a); a=-(5+3)%4/2; printf(“%d\\n”,a); }

(3)以下程序的执行结果是什么? #include main()

{ int a=1; char c=?a?; float f=2.0;

printf(“%d,”,(a+2,c+2)); printf(“%d,”,(f>=c));

printf(“%d,”,(f!=0&&c==?A?)); printf(“%d,”,(a<0?1:2)); printf(“%d,”,(f+2.5)); }

4. 程序填空

(1)以下程序对任意输入的两个整数输出大的一个。 #include \stdio.h\ main()

{ int j,k,m;

printf(\j=? k=?\\n\); scanf(\%d,%d\,&j,&k); m=_______⑴__________ printf(\m=%d\\n\,m); }

(2)以下程序要求从键盘输入3个整数,分别存入x、y、z三个变量中,并将(x+y)*z的结果显示出来。

#include main()

{ int x,y,z,result;

scanf(“x=%d,y=%d,z=%d”,&x,&y,&z); _______⑴____________

printf(“%d”,___⑵_______); }

5. 编程实验题

(1)编写程序输入长方形的长和宽,求长方形的面积和周长并输出,要求用浮点型数

24

据处理。

(2)编写程序将输入的英里转换成公里。已知每英里等于5280英尺,每英尺等于12英寸,每英寸等于2.54厘米,每公里等于100000厘米。

(3)编写程序输入年利率I和存款总数S,计算一年后的本息合计并输出。 (4)编写程序,求圆柱体的表面积和体积。

习题答案

1.

(1)(x+y)!=(a+b)

(2)exp(3)+sqrt(2*x+3*y)

(3)pow((log10+x*y),3) // pow(2,3)求23,结果为8 (4)fabs(x-y)+(x+y)/(3*x)

(5)sin(n*3.14)/(cos(3.14/4)+3*pow(x,y)) (6)1.0/(1.0/r1+1.0/r2+1.0/r3) 2.

(1)(a>d)||(b>d) (2)z=(x>y)?x:y (3)x<0&&y<0

(4)((x+y)>z)||((x+z)>y)||((y+z)>x) (5)(d>=0)&&(d<=100)&&(d%2==0) (6)(x%5==0)||(y%5==0) 3.

(1)3,1,3,4 (2)8,1,0,0 (3)99,0,0,2,0, 4. 程序填空 (1)j>k?j:k;

(2)解:⑴ result=(x+y)*z; ⑵ result 5. 编程实验题 (1)解:

#include void main()

{ float a,b,length,area;

scanf(\ length=(a+b)*2; area=a*b;

printf(\}

(2)解:略 (3)解:

#include void main()

{ float s,i,total;

25

scanf(\ total=s*(1+i);

printf(\}

(4)解:略

常见错误和难点分析

1. 注意数据的取值范围

计算机上使用的C语言编译系统,对一个字符型数据分配一个字节的内存空间,因此字符型数据的取值范围是0~28-1,即0~255。如有下列程序段:

int a=285; char ch=a;

printf(\

运行程序得到的结果确是29,原因是285已经超过255。一个字节容纳不了285,需要将高位截去。

285:00000001 00011101 29:00011101

2. 自增、自减运算的难点分析

自增,自减表达式的计算方法一般分为两种情况:

(1)自增、自减表达式作为void main()的一般语句出现。例如: #include void main() { int i=2,j;

j=(i++)+(++i)+(++i)+(i++)+(--i); printf(\}

运行结果:i=5,j=17

(2)自增、自减表达式作为printf函数的输出表项出现。例如: #include void main() { int i=2,j;

printf(\}

运行结果:i=5,j=17

上述两种情况在不同的编译环境下会有不同的结果,计算方法也不相同,请重点理解和掌握自增自减表达式的计算方法。 int i=2,j;

j=(i++)+(i++)+(i++);应理解为三个i相加,故j值为6。然后i再自增三次相当于加3故i的最后值为5

j=(++i)+(++i)+(++i); i先自增1,再参与运算,由于i自增1三次后值为5

26

scanf(\ total=s*(1+i);

printf(\}

(4)解:略

常见错误和难点分析

1. 注意数据的取值范围

计算机上使用的C语言编译系统,对一个字符型数据分配一个字节的内存空间,因此字符型数据的取值范围是0~28-1,即0~255。如有下列程序段:

int a=285; char ch=a;

printf(\

运行程序得到的结果确是29,原因是285已经超过255。一个字节容纳不了285,需要将高位截去。

285:00000001 00011101 29:00011101

2. 自增、自减运算的难点分析

自增,自减表达式的计算方法一般分为两种情况:

(1)自增、自减表达式作为void main()的一般语句出现。例如: #include void main() { int i=2,j;

j=(i++)+(++i)+(++i)+(i++)+(--i); printf(\}

运行结果:i=5,j=17

(2)自增、自减表达式作为printf函数的输出表项出现。例如: #include void main() { int i=2,j;

printf(\}

运行结果:i=5,j=17

上述两种情况在不同的编译环境下会有不同的结果,计算方法也不相同,请重点理解和掌握自增自减表达式的计算方法。 int i=2,j;

j=(i++)+(i++)+(i++);应理解为三个i相加,故j值为6。然后i再自增三次相当于加3故i的最后值为5

j=(++i)+(++i)+(++i); i先自增1,再参与运算,由于i自增1三次后值为5

26

本文来源:https://www.bwwdw.com/article/80mx.html

Top