第三章 数据的使用.

Slides:



Advertisements
Similar presentations
第6章 基本的程序语句 6.1 基本数据类型及取值范围 6.2 标识符、变量和常量 6.3 基本运算符、表达式及运算的优先级
Advertisements

课前回顾 数据类型 基本类型 构造类型 指针类型 空类型 常量与变量 常量及常量的类型 变量 标识符及有关规定 变量声明格式 赋值运算符.
C/C++语言程序设计 第二章 数据类型和表达式 龚尚福,贾澎涛主编 《C/C++语言程序设计》 西安电子科技大学出版社.
没有规矩,不成方圆。.
第二章 基本数据类型及运算 数据类型 常量与变量 不同类型数据间的转换 运算符和表达式.
C语言实验 第一课 标题:学号+姓名.
C++中的声音处理 在传统Turbo C环境中,如果想用C语言控制电脑发声,可以用Sound函数。在VC6.6环境中如果想控制电脑发声则采用Beep函数。原型为: Beep(频率,持续时间) , 单位毫秒 暂停程序执行使用Sleep函数 Sleep(持续时间), 单位毫秒 引用这两个函数时,必须包含头文件
第三章 C语言基础 学习目标: 熟练掌握:C语言的基本数据类型、运算符及表达式 掌握:常见的输入、输出函数使用方法;
4.3函数 4.3.1函数的概念及定义 1、函数的概念: 可以被其它程序调用具有 特定功能的一段相对独立的 程序(模块),称函数。
第3章 顺序结构程序设计 本章要点: 格式化输出函数──printf() 格式输入函数——scanf() 字符输出函数——putchar()
第3章 最简单的C程序设计 3.1 顺序程序设计举例 3.2 数据的表现形式及其运算 3.3 C语句 3.4 数据的输入输出.
数据类型 第3章 3.1 C数据类型概述 3.2 常量 3.3 变量 3.4 基本输入与输出.
基础篇 基础知识 —C语言程序设计 学习目标 掌握C语言中三种常见的基本类型及其使用方法 掌握常见的算术运算符和表达式的使用
走进编程 程序的顺序结构(二).
QQ: 李祥 QQ: 欢迎多种方式的学习交流,祝大家学有所成.
C语言程序设计 第四章 顺序程序设计.
C语言是结构化程序设计语言,提供了功能丰富的控制语句,本章开始陆续介绍C语言的控制语句:顺序结构、选择结构和循环结构。本章主要介绍三种结构化设计的基本概念,格式输入输出函数printf()和scanf(),字符输入输出函数putchar()和getchar()等内容,要求重点掌握顺序结构设计的基本思想及程序编写方法,熟练掌握常见输入、输出库函数的调用。
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
第二章 基本数据类型与输入输出.
第三单元 数据的输入、赋值处理与输出 从现在开始,将详细讲述C语言的方方面面。第一章中的所有疑惑,都将一一消灭。
C语言程序设计基础 刘新国.
第二章 Java语言基础.
第2章 数据类型、运算符和表达式.
程序设计基础 谭浩强 著 清华大学出版社.
C卓越工程师班 授课老师:龚涛 信息科学与技术学院 2016年9月 教材:《C程序员成长攻略》 网络课程网址:
C语言大学实用教程 第三章 简单的C程序设计 西南财经大学经济信息工程学院 刘家芬
第三章 顺序结构程序设计 主讲教师 贾月乐 电话:
第3章 顺序结构程序设计 为了让计算机处理各种数据,首先就应该把源数据输入到计算机中;计算机处理结束后,再将目标数据信息以人能够识别的方式输出。C语言中的输入输出操作,是由C语言编译系统提供的库函数来实现。 3.1 格式化输出——printf()函数 3.2 格式化输入——scanf()函数.
目录 3.1结构化程序设计 3.2传统流程图及N-S结构化流程图 3.3C语句概述 3.4赋值语句 3.5数据输入输出函数调用语句
3 数据类型、运算符 和表达式.
第二章 数据类型、运算符与表达式.
2.1 C语言的数据类型 2.2 常量与变量 2.3 变量赋初值 2.4 各类数值型数据间的混合运算 2.5 C语言的运算符和表达式
第三章 数据类型、运算符与表达式.
第4章 顺序程序设计.
第一章 函数与极限.
第三章 顺序结构程序设计 计算机科学学院.
学习目标 1、什么是字符集 2、字符集四个级别 3、如何选择字符集.
C语言程序设计.
C程序设计.
C语言程序设计 教案 崔武子制作
<编程达人入门课程> 本节内容 内存的使用 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群: ,
C语言程序设计 第一章 数据类型, 运算符与表达式 第二章 顺序程序设计 第三章 选择结构程序设计 第四章 循环控制 第五章 数组.
第六章 Excel的应用 一、Excel的单元格与区域 1、单元格:H8, D7, IV26等 2、区域:H2..D8, HS98:IT77
第4章 Excel电子表格制作软件 4.4 函数(一).
第九节 赋值运算符和赋值表达式.
第2章 基本数据及其运算 本章学习的目标: 1、掌握基本数据的各种表示,基本数据常数的书写方法;
第二章 类型、对象、运算符和表达式.
C语言程序设计 李祥 QQ:
第4课时 绝对值.
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
ASP.NET实用教程 清华大学出版社 第4章 C#编程语言 教学目标 教学重点 教学过程 2019年5月5日.
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
2.6 字符型数据 一、 字符常量 1、字符常量的定义 用一对单引号括起来的单个字符,称为字符常量。 例如,‘A’、‘1’、‘+’等。
第4章 顺序结构程序设计 为了让计算机处理各种数据,首先就应该把源数据输入到计算机中;计算机处理结束后,再将目标数据信息以人能够识别的方式输出。C语言中的输入输出操作,是由C语言编译系统提供的库函数来实现。 4.1 格式化输出——printf()函数 4.2 格式化输入——scanf()函数.
C程序设计 实验二 数据类型、运算符和表达式 第6讲
第3章 最简单的C程序设计 3.1 顺序程序设计举例 3.2 数据的表现形式及其运算 3.3 C语句 3.4 数据的输入输出.
第二章 Java基本语法 讲师:复凡.
程序设计基础A(C语言) 第一章 C语言概述 主讲教师: 许 康
Chap 6 数据类型和表达式 6.1 数据的存储和基本数据类型 6.2 常量和变量 6.3 数据的输入和输出 6.4 类型转换
复习 标签(label)、文本框(text)控件 按钮:点击事件
基本知识 数据类型、变量、常量、运算符.
数据表示 第 2 讲.
C/C++基礎程式設計班 C語言入門、變數、基本處理與輸入輸出 講師:林業峻 CSIE, NTU 3/7, 2015.
第三节 数量积 向量积 混合积 一、向量的数量积 二、向量的向量积 三、向量的混合积 四、小结 思考题.
鸡兔同笼(续) ——选择结构.
第二章 数据类型与表达式 丘志杰 电子科技大学 计算机学院 软件学院.
顺序结构程序设计 ——关于“字符串”和数值.
第二章 简单数据类型 §2.1 数据类型概述 §2.2 变量和常量 §2.3 简单数据类型 §2.4 简单数据类型的相互转换
学习目标 1、什么是列类型 2、列类型之数值类型.
C++语言程序设计 C++语言程序设计 第二章 基本数据类型与表达式 第十一组 C++语言程序设计.
Presentation transcript:

第三章 数据的使用

本章要点 基本输入输出操作的实现 常用运算符(算术运算符、赋值运算符、自增自减运算符、逗号运算符) 运算符的优先级和结合性 表达式及表达式语句 数据类型转换

本章学习目标 熟练掌握字符的输入/输出函数及格式化输入/输出函数的使用方法。 重点掌握scanf函数和printf函数的格式控制 掌握常用的运算符和表达式的使用,重点掌握自增和自减运算符及其运算规则 掌握表达式语句的格式,理解表达式与表达式语句的区别 掌握数据类型转换方法及规则

3.1 应用实例 【例3-1】计算商品总价格 某顾客到超市购买苹果和桔子,超市收银台计算客户购买商品的总价格。

3.1.1程序代码 /*程序3-1*/ #include <stdio.h> void main() { float apple_price,orange_price,apple_qty,orange_qty,total_price; printf("请输入顾客购买的苹果的价格和数量:"); scanf("%f%f",&apple_price,&apple_qty); printf("请输入顾客购买的桔子的价格和数量:"); scanf("%f%f",&orange_price,&orange_qty); total_price=apple_price*apple_qty+orange_price*orange_qty; printf("顾客购买的商品总价格为:%.2f”,total_price); }

3.2 输入与输出 C语言标准函数库提供了用于实现输入/输出的库函数。 字符输入/输出的函数——getchar函数和putchar函数 格式化输入/输出函数——scanf函数和printf函数

C语言要求在调用函数前对被调用的函数进行声明,调用库函数也应如此,这可以通过包含相应的头文件(head file)来完成。 本章介绍的4个函数都在stdio.h头文件中进行描述。因此我们在程序开头包含stdio.h文件即可。 #include <stdio.h> 或 #include “stdio.h”

3.2.1字符输出——putchar函数 功能 使用putchar函数可以向标准输出设备(通常指显示器)中输出一个字符。 调用方法 putchar(ch); 参数 参数ch可以是字符常量,也可以是字符变量;可以是普通字符,也可以是转义字符。

示例 putchar(‘A’); putchar(65); putchar(‘\n’); char ch=’a’; putchar(ch);

3.2.2 字符输入——getchar函数 功能 使用getchar函数可以从标准输入设备(通常指键盘)中读取一个字符。 调用方法 char ch; ch=getchar( ) 返回值 调用该函数不需要实际参数,该函数的返回值为读取的字符,如果读取出错,返回值为EOF(-1)。

示例 【例3-2】读取一个字符并输出该字符对应的十进制ASCII码值 /*程序3-2*/ #include <stdio.h> void main( ) { char ch; ch=getchar( ); printf(“%d”,ch); }

注意 在通过键盘向程序提供数据时,按下回车键表示确认并提交输入数据。输入的字符(包括回车键,在程序中回车键表示换行符)将依次进入输入缓冲区。getchar函数将从输入缓冲区中提取一个字符,将其作为函数返回值。 getchar函数可以读取空格、Tab键、换行符等字符。

3.2.3格式化输出——printf函数 【例3-3】计算并输出两个整数的和。 /*程序3-3*/ #include <stdio.h> void main( ) { int a=1,b=2,sum; sum=a+b; printf(“sum=%d\n”,sum); }

1. 基本语法要求 功能 printf函数可以输出多个多种类型的数据,而且可以定义每个数据的输出格式。 调用格式 参数 第一个参数是一个字符串,它说明了数据的输出格式和最后的输出效果,这是必须有的一个参数。 从第二个参数开始的其他参数给出了要输出的数据。每个输出数据可由一个表达式给出。 printf(格式字符串,表达式1,表达式2 ……)

2. 格式字符串的构成 格式字符串中包含两种内容: 第一种是普通字符(包括转义字符),如程序3-3中的“sum=”,这些内容直接输出。 第二种内容是格式说明符,如示程序3-3中的“%d”,每个格式说明符指定一个输出数据的格式。它起到占位符的作用,格式说明符不被输出,而是由相应的输出数据来替换它。

格式说明符的格式 常用转换说明符包括:d、i、o、x、u、c、s、f、e、g。 % [标志字符] [最小宽度] [精度] [长度修饰符] 转换说明符 常用转换说明符包括:d、i、o、x、u、c、s、f、e、g。 标志字符可以是一个或多个以下字符的组合:“-”、“+”、“#”、“0”。 最小宽度的形式为m,m代表一个十进制整数。 精度的形式为.n,其中n代表一个十进制整数。 长度修饰符是以下字符中的一个:“l”、“L”。

3.转换说明符的含义 转换说明符 含义 d、i 采用带符号十进制形式输出int类型数据 u、o、 x、X 采用无符号十进制(u),无符号八进制(o),无符号十六进制(x或X)形式输出unsigned int类型数据。 f、e、E、g、G 输出double类型的数据 c 输出char类型的数据 s 输出字符串

转换说明符d、i 用于输出int类型的数据,采用带符号十进制形式表示数据。 /*程序3-4*/ #include <stdio.h> void main() { int a=123,b=-123; printf(“%d,%d,%d\n”,a,b,a+b); } 程序执行后输出结果为: 123,-123,0

转换说明符u、o、x、X 用于输出unsigned int类型的数据。采用无符号十进制(u),无符号八进制(o),无符号十六进制(x或X)形式表示数据。字母abcdef用于转换说明符x,字母ABCDEF用于转换说明符X。 注意转换说明符o、x、X不输出八进制或十六进制数的前导标识符0或0x。

转换说明符u、o、x、X /*程序3-5*/ #include <stdio.h> void main() { unsigned int a=65535; printf(“%u,%o,%x,%X\n”,a,a,a,a); } 程序执行后输出结果为: 65535,177777,ffff,FFFF

转换说明符f、e、E、g、G 用于输出double类型的数据。 转换说明符f采用[-]ddd.dddddd的十进制小数形式表示数据,且默认输出6位小数,超出部分按四舍五入处理。 转换说明符e采用[-]d.dddddde±dd的十进制指数形式表示数据,且小数点前面有一位非零数字,小数点后面默认包含6位小数,超出部分按四舍五入处理。 转换说明符g将根据数值大小和指定精度(默认精度为6,超出部分按四舍五入处理)自动选择使用f或e的输出格式,选择格式e仅在转换结果的指数部分小于-4或大于等于精度时。转换说明符g不输出小数尾部的0。 字母e用于转换说明符e或g,字母E用于转换说明符E或G。

转换说明符f、e、E、g、G /*程序3-6*/ #include <stdio.h> void main() { double a=1234.567; printf(“%f,%e,%g\n”,a,a,a); } 程序执行后输出结果为: 1234.567000,1.234567e+03,1234.57

转换说明符c 用于输出char类型的数据。 /*程序3-7*/ #include <stdio.h> void main() { char ch1=’A’,ch2=’\x42’; printf(“%c,%c\n”,ch1,ch2); } 程序执行后输出结果为: A,B

转换说明符s 用于输出字符串,从字符串的第一个字符开始输出,直到字符串的结束标志字符,但不输出结束标志字符。 /*程序3-8*/ #include <stdio.h> void main() { char string[ ]=”I like C.”; printf(“%s”,string); } 程序执行后输出结果为: I like C.

使用printf函数应注意: 格式字符串中的格式说明符的数量应和输出数据的数量相等。 使用正确有效的转换说明符,否则程序将产生无意义的输出结果。

/*程序3-9*/ #include <stdio.h> void main() { int a=1; double b=1.2; printf(“%f,%d”,a,b); } 该程序将输出无意义的结果。

4.指定最小宽度和精度 最小宽度m是一个整数,它指定了显示一个数据所需要的最少字符个数。如果转换后数据的字符个数比m小,输出数据时,在数据的左侧补充适当数量的空格字符,如果转换后数据的字符个数比m大,则m不起作用,将按数据的实际字符个数输出。

指定精度用.n的格式,其中n是一个整数。精度对于不同的转换说明符具有不同的含义。 对于d、i、o、u、x和X,给出了转换后数据应包含的最少数字字符数。如果数字字符数小于n,则在数据前面添加0。如果省略.n,则默认精度为1。 对于f、e和E,给出了转换后数据的十进制小数部分小数点后的数字字符数。如果小数点后的数字字符数大于n,则进行四舍五入处理。如果省略.n,则默认精度为6。 对于g和G,给出了转换后数据的最大有效数字字符数。如果省略.n,则默认最大有效数字字符数为6。 对于s,给出了从字符串截取的子串的最大字符数。截取是从字符串的第一个字符开始的。

/*程序3-10*/ #include <stdio.h> void main() { int a=1234; double b=123.4567; char s[ ]=”welcome”; printf(“%d,%6d,%2d,%6.5d\n”,a,a,a,a); printf(“%f,%11f,%6f,%10.2f\n”,b,b,b,b); printf(“%g,%10g,%5g,%10.2g\n”,b,b,b,b); printf(“%s,%8s,%.3s,%8.3s\n”,s,s,s,s); } 程序执行后输出结果为: 1234,□□1234,1234,□01234 123.456700,□123.456700,123.456700,□□□□123.46 123.457,□□□123.457,123.457,□□1.2e+002 welcome,□welcome,wel,□□□□□wel

5.标志字符的含义 常用标志字符包括:“-”、“+”、“#”、“0”,使用顺序任意。 标志- 指示转换后的结果在输出域中左对齐(默认为右对齐)。 标志+ 指示有符号数转换后的结果带有正号或负号。 标志# 指示对于转换说明符o,转换结果将增加前缀0;对于转换说明符x或X,转换结果将增加前缀0x或0X。 标志0 指示对于转换说明符d、i、o、u、x、X、e、E、f、g和G,前导零将用于充填域宽而不充填空格字符。若标志0和标志-同时出现,则标志0不起作用。

/*程序3-11*/ #include <stdio.h> void main() { int a=255; printf(“%6d,%-6d,%+d\n”,a,a,a); printf(“%o,%#o,%x,%#x\n”,a,a,a,a); printf(“%06d,%-06d\n”,a,a); } 程序执行后输出结果为: □□□255,255□□□,+255 377,0377,ff,0xff 000255,255□□□

6.长度修饰符的含义 常用的长度修饰符包括:“l”、“L”。 修饰符l用于输出long int或unsigned long int类型的数据,它可用在转换说明符的d、i、o、u、x或X前面。 修饰符L用于输出long double类型的数据,它可用在转换说明符的f、e、E、g或G前面。

/*程序3-12*/ #include <stdio.h> void main() { long int a=12345678; long double f=123.456789; printf(“%ld,%lf”,a,f); } 程序执行后输出结果为: 12345678,123.456789

3.2.4格式化输入——scanf函数 【例3-4】读取两个整数并计算它们的和 /*程序3-13*/ #include <stdio.h> void main( ) { int a,b,sum; scanf(“%d%d”,&a,&b); sum=a+b; printf(“sum=%d\n”,sum); }

1. 基本语法要求 功能 scanf函数可以读取多个多种类型的数据,而且可以定义每个数据的输入格式。 调用格式 参数 其中第一个参数是一个字符串,它指定了scanf函数可以接收的输入数据的格式。 从第二个参数开始的后续参数给出了用于存放输入数据的存储空间的地址。 为了得到变量的地址,需要使用地址运算符“&” 。

2. 格式字符串的构成 格式字符串中的内容可以分为三类: ①格式说明符 格式为说明符的格式为: % [赋值屏蔽符] [最大宽度] [长度修饰符] 转换说明符 ②空白符,包括空格、水平制表符(Tab键)、换行符等。 ③非空白符,既不是格式说明符也不是空白符的其他字符。如字符’,’。

3. scanf函数的执行过程 scanf函数从输入内容中获取数据的过程实际上是一个模式匹配的过程,通过格式字符串对输入内容进行匹配分组,从而得到每个数据。 输入内容就是一个字符串,它将存入输入缓冲区。scanf函数将依次提取输入缓冲区中的每个字符,并尝试与格式字符串匹配。匹配将从格式字符串的第一个元素(可以是一个格式说明符或一个空白符或一个非空白符)开始,到格式字符串的最后一个元素结束。在这个过程中,如果出现匹配不成功的情形,则scanf函数将立即返回。

scanf函数的匹配规则 格式字符串中 输入缓冲区中 格式说明符 匹配 构成实际数据的字符如%d匹配123,注意格式说明符可以跳过实际数据开始前的空白符 一个或多个连续的空白符 任意多个连续的空白符 其它字符 相同字符

4. 转换说明符的含义 转换说明符 含义 d 匹配一个带符号十进制整数,用于读取int类型的值 o、u、x 匹配一个无符号八进制(o)、无符号十进制(u)、无符号十六进制(x)整数,用于读取unsigned int类型的值 f、e、g 匹配一个带符号十进制浮点数(小数或指数形式),用于读取float类型的值 c 匹配一个字符,不会跳过空白符,用于读取字符数据 s 匹配一个不含空白符的字符串,用于读取字符串数据

/*程序3-15*/ #include <stdio.h> void main( ) { int a; unsigned int b,c,d; float e,f; scanf(“%d%o%u%x”,&a,&b,&c,&d); scanf(“%f%f”,&e,&f); printf(“a=%d,b=%d,c=%d,d=%d\n”,a,b,c,d); printf(“e=%f,f=%f”,e,f); } 程序运行后输入: 123□123□123□123↙ 123.5□1.235e2↙ 然后程序输出: a=123,b=83,c=123,d=291 e=123.500000,f=123.500000

/*程序3-16*/ #include <stdio.h> void main( ) { char a,b; scanf(“%c%c”,&a,&b); printf(“%c%c”,a,b); } 程序运行后输入: a□b↙ 然后程序输出: a□

/*程序3-16修改版*/ #include <stdio.h> void main( ) { char a,b; scanf(“%c□%c”,&a,&b); printf(“%c%c”,a,b); } 程序运行后输入: a□□b↙ 然后程序输出: ab

5. 赋值屏蔽符的含义 赋值屏蔽符是字符*,它表示读取数据项,但不会将它赋值给变量。通过它可以跳过输入内容中的一个数据。

/*程序3-17*/ #include <stdio.h> void main( ) { int a,b; scanf(“%d%*d%d”,&a,&b); printf(“a=%d,b=%d”,a,b); } 程序运行时输入: 11□12□13↙ 然后程序输出: a=11,b=13

6. 最大宽度的含义 可以使用一个十进制整数m指定输入数据的最大宽度,它指定了构成一个数据项的最大字符个数,实际数据开始前的空白符不会被统计。

/*程序3-18*/ #include <stdio.h> void main( ) { int a,b; scanf(“%3d%4d”,&a,&b); printf(“a=%d,b=%d”,a,b); } 程序运行时输入: □□□12345□6↙ 然后程序输出: a=123,b=45

7. 长度修饰符的含义 常用的长度修饰符包括h、l和L。h用于读取短整型数据,可用在转换说明符d、o、u、x之前。l用于读取长整型数据或double类型数据,可用在d、o、u、x或e、f、g之前。L用于读取long double类型数据,可用在e、f、g之前。 特别注意,读取double类型数据应使用%lf,而不能使用%f。

/*程序3-19*/ #include <stdio.h> void main( ) { double d; scanf(“%lf”,&d); printf(“d=%f”,d); } 程序运行时输入: 123.456↙ 然后程序输出: d=123.456000

3.3 运算符和表达式 3.3.1算术运算符 运算符%表示模运算(mod)或取余运算(rem)。表达式a%b的值是a除以b后的余数。例如10%2的值为0,10%3的值为1。 一元运算符 二元运算符 正号运算符 + 负号运算符 - 乘除类 加减类 乘法运算符 * 除法运算符 / 模运算符 % 加法运算符 + 减法运算符 -

使用算术运算符时应注意: %运算符要求两个操作数必须是整数,其它运算符允许操作数可以是整数或实数。 当操作数均是整型时,运算符/的计算结果也是整型,结果是通过舍去小数部分来得到。所以1/2的结果是0而不是0.5。 避免使运算符/和运算符%的第二个操作数为0。 对于运算符/和运算符%,若操作数中含有负数,计算结果由程序的运行环境决定。

使用算术运算符将操作数连接起来得到的式子称为算术表达式。 算术表达式的值就是算术运算符的计算结果。

程序运行后输入: 357↙ 然后程序输出: units digit:7 tens digit:5 hundreds digit:3 【例3-5】正整数m是一个3位数,按逆序输出m的3位数。 /*程序3-20*/ #include <stdio.h> void main( ) { int m,a,b,c; printf(“Input m:”); scanf(“%d”,&m); a=m%10; b=m/10%10; c=m/100; printf(“units digit:%d\n”,a); printf(“tens digit:%d\n”,b); printf(“hundreds digit:%d\n”,c); } 程序运行后输入: 357↙ 然后程序输出: units digit:7 tens digit:5 hundreds digit:3

3.3.2运算符的优先级和结合性 1.关于优先级 C语言中的运算符优先级共分15级,1级最高,15级最低。 算术运算符的优先级为: +(正号运算)和-(符号运算) 2级 *(乘)、 /(除)和 %(模运算) 3级 +(加)和-(减) 4级

2 .关于结合性 当表达式中含有多个优先级相同的运算符时,运算符的结合性开始起作用。 如果运算符是从左向右结合的,称这种运算符是左结合的。 如果运算符是从右向左结合的,称这种运算符是右结合的。 二元算术运算符都是左结合的,一元算术运算符都是右结合的。

3.3.3 赋值运算符 1.简单赋值运算符 简单赋值运算符用“=”表示,它是一个二元运算符。由“=”连接左右操作数形成的表达式称为赋值表达式。例如:a=1+2 赋值运算符的左操作数被称为“左值”,右操作数是一个表达式。 变量是左值,而常量和1+2、j*k、a=1等这样的表达式不是左值。 赋值表达式的值和类型等于赋值后的左操作数的值和类型。

赋值运算符的优先级是14,结合方向是自右向左。 a=b=c=1 a=(b=(c=1))

2.复合赋值运算符 复合赋值运算符包括: +=、-+、*=、/=、%=、<<=、>>=、^=、|= 复合赋值运算符的优先级同样是14,结合方向也是自右向左。 a+=1 a=a+1 b-=c+1 b=b-(c+1) i*=j/k i=i*(j/k) a*=a+=2 a=a*(a=a+2)

【例3-6】读取两个整数存入变量a、b,然后交换变量的值 /*程序3-21*/ #include <stdio.h> void main( ) { int a,b,t; printf(“Input a and b:”); scanf(“%d%d”,&a,&b); printf(“Before exchange:a=%d,b=%d\n”,a,b); t=a; a=b; b=t; printf(“Aefore exchange:a=%d,b=%d\n”,a,b); }

例如:a=1;b=++a;a的值为2,b的值为2 3.3.4 自增、自减运算符 自增、自减运算符分别用“++”和“--”来表示。 自增、自减运算符是一元运算符,既可以作为前缀运算符,也可以作为后缀运算符。 前缀运算符 ++a、--a 后缀运算符 a++、a-- 先使变量的值加1或减1,然后在表达式中引用变量的值 先在表达式中引用变量的值,然后使变量的值加1或减1 例如:a=1;b=++a;a的值为2,b的值为2 a=1;b=a++;a的值为2,b的值为1

后缀自增、自减运算符的优先级是1级,结合方向是自左向右 前缀自增、自减运算符的优先级是2级,结合方向是自右向左。 j=-i++ j=-(i++)

注意: 尽量避免在一个表达式中过多的使用自增、自减运算符,尤其是类似于(i++)+(i++)的表达式。因为这会降低程序的可读性和可移植性,而且有可能产生歧义,在不同的运行环境中产生不同的结果。 自增、自减运算符的操作数应是左值。变量是左值,而常量和i+j、i++、++i等表达式不是左值。所以表达式1++、(i+j)++、(i++)++、++ (++i)等都是错误的。

3.3.5 逗号运算符 用符号“,”表示, 用于连接两个表达式。 形如 左表达式,右表达式 的式子称为逗号表达式。 由逗号运算符连接的两个表达式从左向右依次计算。先计算左表达式的值,并且丢弃该值,再计算右表达式的值。 逗号表达式的值和类型取右表达式的值和类型。例如,表达式1+2,3+4的值为7。 逗号运算符的优先级最低。 i=1*2,3*4 (i=1*2),(3*4)

注意: 逗号运算符明确规定了子表达式从左向右计算。例如,假设i=1,表达式a=i,i++的运算顺序是变量a先被赋值为1,然后变量i自增1。 逗号运算符会丢弃左表达式的值,但不会忽略左表达式的计算。例如表达式a=1,b=2将使变量a被赋值为1,变量b被赋值为2,表达式i++,j++将使变量i,j的值加1。

【例3-7】使用逗号运算符 /*程序3-22*/ #include <stdio.h> void main( ) { int a,b,c; a=1,b=2,c=3; printf(“a=%d,b=%d,c=%d\n”,a,b,c); a++,b++,c--; printf(“a=%d,b=%d,c=%d”,a,b,c); } 程序运行后输出结果为: a=2,b=3,c=2

3.3.6 表达式语句 在C语言中,任何表达式都可以通过增加分号变成一条语句。 i++; j=++i; a=1+2; a+b;

【例3-8】输入三角形的三个边长a、b、c,求三角形的面积。 /*程序3-23*/ #include <stdio.h> #include <math.h> void main( ) { float a,b,c,s,area; printf(“Input a,b,c:”); scanf(“%f%f%f”,&a,&b,&c); s=1.0/2*(a+b+c); area=sqrt(s*(s-a)*(s-b)*(s-c)); printf(“area=%.2f”,area); }

3.4 数据类型转换 隐式转换 显式转换

3.3.1数据类型的隐式转换 隐式转换会在以下几种情况下发生: 需要算术操作数的运算符的操作数类型不一致时,比如算术运算符、关系运算符要求操作数类型相同。此时进行一般算术转换。 赋值运算符的左操作数和右操作数类型不一致时。 函数调用中实际参数与对应的形式参数类型不一致时。 函数中return语句返回的值与函数返回值类型不一致时。

1. 一般算术转换 转换的基本策略是将尺寸较小的数据类型转换成尺寸相同或尺寸较大的数据类型。尺寸大小是以该类型数据所占存储空间大小来衡量的。 (1)整型提升 表达式中的char、short int、unsigned int类型的数据如果在int型的取值范围内,则转换成int型,否则转换成unsigned int型。整型提升后的结果和原值相等。

(2)转换规则 首先,若一个操作数是long double类型,则另一个操作数将转换为long double类型, 否则,若一个操作数是double类型,则另一个操作数将转换为double类型, 否则,若一个操作数是float类型,则另一个操作数将转换为float类型, 否则,对操作数进行整型提升,然后应用下列规则: 若一个操作数是unsigned long int类型,则另一个操作数将转换为unsigned long int类型, 否则,若一个操作数是long int类型,则另一个操作数将转换为long int类型, 否则,若一个操作数是unsinged int类型,则另一个操作数将转换为unsigned int类型, 否则,两个操作数是int类型。

【例3-9】一般算术转换实例:分析表达式的计算结果 假设变量如下定义: int a=1; char ch=’a’; float f=10.0; double d=20.0; 分析表达式 a/ch+a*d-f/d的值。

2. 赋值运算的类型转换 进行赋值运算时类型转换的基本原则是:将赋值运算符右边表达式的值转换成赋值运算符左边变量的类型。 (1)将尺寸小的类型转换成尺寸大的类型通常是没有问题的。 将尺寸小的浮点型值转换成尺寸大的浮点型值时,其值不变。 将尺寸小的整型值转换成尺寸大的整型值时,其值不变。 将整型值转换成浮点型值时,如果原值能被浮点型精确表示,其值不变,否则,结果是原值的近似值。

(2)将尺寸大的类型转换成尺寸小的类型可能得到无意义的结果。 将尺寸大的浮点型值转换成尺寸小的浮点型值时,若要转换的值超出了可表示的范围,则出现溢出错误;若要转换的值在可表示的范围内且能确切表示时,转换结果和原值相等;若要转换的值在可表示的范围内但不能确切表示时,转换结果是原值的近似值。 将尺寸大的整型值转换成尺寸小的整型值时,若要转换的值在可表示的范围,其值不变;若要转换的值超出了可表示的范围,将得到一个无意义的值。 将浮点型值转换成整型值时,小数部分将被直接舍去,若整数部分能被该整型表示,转换结果是整数部分;否则,将得到一个无意义的值。

(3)字符型与整型的转换 字符型值向整型值转换时,unsigned char类型值将被作为无符号整数进行处理。char类型值既可以作为有符号整数也可以作为无符号整数进行处理,多数计算机系统是作为有符号整数进行处理的。 整型值向字符型值转换时,若要转换的值在字符型的可表示范围内,其值不变;否则,将得到一个无意义的值。

【例3-10】将一个大写字母转换成对应的小写字母。 /*程序3-24*/ #include <stdio.h> void main( ) { char ch1,ch2; printf(“Input a capital letter:”); ch1=getchar(); ch2=ch1+32; printf(“%c,ASCII is %d\n”,ch1,ch1); printf(“%c,ASCII is %d”,ch2,ch2); }

(4)有符号整型与无符号整型的转换 有符号整数转换为相同或更大尺寸的无符号整数时,若有符号整数为非负数,则其值不变,否则,通过将其值加上比该无符号整型所能表示的最大值大1的数而转换成无符号数。 有符号整数转换为尺寸小的无符号整数时,其结果是该值除以比该无符号整型所能表示的最大值大1的数后得到的非负余数。

【例3-11】有符号数和无符号数的转换 /*程序3-25*/ #include <stdio.h> void main( ) { unsigned int u; unsigned short int su; int i; i=-100000; u=i; su=i; printf(“u=%u,su=%u”,u,su); }

3.3.2 强制类型转换运算符 强制类型转换运算符的表示形式为: (类型名) 强制类型转换表达式的格式为: (类型名)表达式 强制类型转换运算符的作用是将右侧表达式的值转换成指定类型的值。 (int)12.3的结果是整数12,此结果通过将12.3转换成整型值而得到。

强制类型转换运算符是一元运算符,其优先级为2级。 强制类型转换运算不会改变右侧表达式的值和类型,而是得到一个指定类型的结果值。 (float)1/2 ( ( float )1 ) / 2

习 题 一、选择题 (1)有以下程序 #include <stdio.h> void main() { char a,b,c,d; scanf(“%c%c“,&a,&b); c=getchar( ); d=getchar( ); printf(“%c%c%c%c\n”,a,b,c,d); } 当执行程序时,按下列方式输入数据 12↙ 34↙ 则输出结果是 ( ) A)1234 B)12 C)12 D)12    3    34

(2)有以下程序 #include <stdio.h> void main( ) { int k=011; printf(“%d\n“,k++); } 程序运行后的输出结果是( ) A)12 B)11 C)10 D)9

(3)以下叙述中正确的是( ) A)调用printf函数时,必须要有输出项 B)使用putchar函数时,必须在之前包含头文件stdio.h C)在C语言中,整数可以以二进制、八进制或十六进制的形式输出 D)调用getchar函数读入字符时,可以从键盘上输入字符所对应的ASCII码

(4)设变量已正确定义,若要通过scanf(“%d%c%d%c”,&a1,&c1,&a2,&c2);语句为变量a1和a2赋数值10和20,为变量c1和c2赋字符X和Y,以下输入形式中正确的是( ) A)10□X□20□Y↙ B)10□X20□Y↙ C)10□X↙ D)10X↙ 20□Y↙ 20Y↙

(5)若变量已正确定义为int型,要通过语句scanf(“%d,%d,%d”, &a,&b,&c); 给a赋值1,给b赋值2,给c赋值3,以下输入形式中错误的是( ) C)1,□□□2,□□□3↙ D)1,2,3↙

(6)表达式3.6-5/2+1.2+5%2的值是( ) A)4.3   B)4.8    C)3.3    D)3.8 (7)若变量x,y已正确定义并赋值,以下符合C语言语法的表达式是( ) A)++x,y=x-- B)x+1=y C)x=x+10=x+y D)double(x)/10

(8)已知大写字母A的ASCII码是65,小写字母a的ASCII码是97,以下不能将变量c中的大写字母转换为小写字母的语句是 A)c=(c-‘A’)%26+’a’; B)c=c+32; C)c=c-‘A’+’a’; D)c=(‘A’+c)%26-‘a’;

(9)有以下程序 #include <stdio.h> void main( ) { int x,y,z; x=y=1; z=x++,y++,++y; printf("%d,%d,%d\n",x,y,z); } 程序运行后的输出结果是( ) A) 2,3,3 B) 2,3,2 C) 2,3,1 D) 2,2,1

(10)有以下程序 #include <stdio.h> void main( ) { int a=1,b=0; printf("%d,",b=a+b); printf("%d",a=2*b); } 程序运行后的输出结果是( ) A)0,0 B)1,0 C)3,2 D)1,2