第三章 数据类型、运算符与表达式.

Slides:



Advertisements
Similar presentations
第一章 C语言概述.
Advertisements

C语言程序设计 主讲教师 :张群燕 电话:
江苏省2008年普通高校 招生录取办法 常熟理工学院学生处
2014年初中生物学业水平抽测分析.
第一章 C语言概述 计算机公共教学部.
第一单元 人在社会中生活 综合探究一 从地图上获取信息 第1课时 带着地图定向越野间.
第二部分 人文地理 第一单元 人口与城市 第5课 城市化过程和特点. 第二部分 人文地理 第一单元 人口与城市 第5课 城市化过程和特点.
财经法规与会计职业道德 (3) 四川财经职业学院.
1.某生物个体经减数分裂产生4种类型的配子,即Ab∶aB∶AB∶ab=4∶4∶1∶1,这个生物如自交,其后代中出现显性纯合体的几率是
电在我们日常生活、现代化社会中的应用: 电 是 什 么?.
C语言程序设计 第十二章 位运算.
高级语言程序设计 主讲人:陈玉华.
C++程序设计 第二讲 清华大学软件学院.
C程序设计.
If … else 選擇結構 P27.
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
QQ: 李祥 QQ: 欢迎多种方式的学习交流,祝大家学有所成.
第二章 基本元素、类型和概念 七、输出函数printf 八、输入格式转换函数scanf.
第二章 顺序结构 1 数据类型和标识符、常量与变量 2 运算符和表达式 3 简单的输入输出 4 程序举例.
C++语言程序设计 第二章 C++简单程序设计.
第13章 结构体的应用 13.1 了解由用户构造的数据类型 13.2 结构体类型说明及结构体变量 13.3 结构体数组
第三节 整数类型.
第3章 顺序结构程序设计 为了让计算机处理各种数据,首先就应该把源数据输入到计算机中;计算机处理结束后,再将目标数据信息以人能够识别的方式输出。C语言中的输入输出操作,是由C语言编译系统提供的库函数来实现。 3.1 格式化输出——printf()函数 3.2 格式化输入——scanf()函数.
2.1 C语言的数据类型 2.2 常量与变量 2.3 变量赋初值 2.4 各类数值型数据间的混合运算 2.5 C语言的运算符和表达式
第4章 顺序程序设计.
第1章 概述 本章要点: C语言程序结构和特点 C语言程序的基本符号与关键字 C语言程序的编辑及运行 学习方法建议:
第十章 用户自定义数据类型 目录 学生信息管理系统的开发 结构体数据类型的概述 结构体变量的使用 结构体数组
目录 9.1 结构体类型 9.2 共用体类型 9.3 枚举类型 9.4 类型声明符typedef 1.
C语言概述 第一章.
第1讲 C语言基础 要求: (1) C程序的组成 (2) C语言的标识符是如何定义的。 (3) C语言有哪些基本数据类型?各种基本数
Java變數 2014/6/24.
第2章 数据类型及表达式 本章导读 本章主要知识点 《 C语言程序设计》 (Visual C++ 6.0环境)
第 二 章 数据类型、运算符与表达式.
第一章 程序设计和C语言 主讲人:高晓娟 计算机学院.
C语言程序设计 教案 崔武子制作
指標
7.1 C程序的结构 7.2 作用域和作用域规则 7.3 存储属性和生存期 7.4 变量的初始化
C程序设计.
本节内容 字符与字符串 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
C语言程序设计 李祥 QQ:
C++语言程序设计教程 第2章 数据类型与表达式 第2章 数据类型与表达式 制作人:杨进才 沈显君.
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
C++程式設計入門 變數與運算子 作者:黃建庭.
第2章 数据类型、运算符与表达式 2.1 程序设计概述
第3章 数据类型、运算符与表达式.
项目1 C程序设计起步 学习目标: 通过该项目你可以知道: C语言的用途。 C语言的基本符号和关键字。 C语言程序的结构及特点。
第2章 数据类型、运算符与表达式 本章要点: 基本数据类型 常量和变量 算术运算符和算术表达式 关系运算符和关系表达式
第2章 基本数据及其运算 本章学习的目标: 1、掌握基本数据的各种表示,基本数据常数的书写方法;
第一章 C语言概述 目录 什么是语言、程序 C语言的历史与发展 C语言的书写形式与程序结构 运行C语言的步骤与方法
THE C PROGRAMMING LANGUAGE
第二章 类型、对象、运算符和表达式.
第2章 数据类型与表达式 学习目的与要求: 掌握C 语言的基本数据类型及使用方法 掌握C程序中常用的运算符和表达式 了解数据类型的转换.
第二章 基本数据类型 ——数据的表示.
第八节 算术运算符和算术表达式.
第4章 顺序结构程序设计 为了让计算机处理各种数据,首先就应该把源数据输入到计算机中;计算机处理结束后,再将目标数据信息以人能够识别的方式输出。C语言中的输入输出操作,是由C语言编译系统提供的库函数来实现。 4.1 格式化输出——printf()函数 4.2 格式化输入——scanf()函数.
#include <iostream.h>
第3章 最简单的C程序设计 3.1 顺序程序设计举例 3.2 数据的表现形式及其运算 3.3 C语句 3.4 数据的输入输出.
本节内容 指针类型.
第五章 逻辑运算和判断选取控制 §5.1 关系运算符和关系表达式
職業學校群科課程綱要規劃原理及修訂重點 報告人:鄭慶民
Introduction to the C Programming Language
第七章  数 组.
第十二章 位运算.
目录 12.1 位运算符 12.2 位域(位段) 1.
第二章 数据类型、运算符和表达式 §2.1 数据与数据类型 §2.2 常量、变量和标准函数 §2.3 基本运算符及其表达式 目 录 上一章
C/C++基礎程式設計班 C語言入門、變數、基本處理與輸入輸出 講師:林業峻 CSIE, NTU 3/7, 2015.
基本資料型態 變數與常數 運算子 基本的資料處理 授課:ANT 日期:2014/03/03.
本节内容 指针类型 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
C语言基础学习 从外行到入门.
C++语言程序设计 C++语言程序设计 第二章 基本数据类型与表达式 第十一组 C++语言程序设计.
Presentation transcript:

第三章 数据类型、运算符与表达式

本章要点 数据的描述规则 数据的操作规则

3.1 C的数据类型 3.2 常量与变量 3.3 整型数据 3.4 浮点型数据运行 3.5 字符型数据 主要内容 3.1 C的数据类型 3.2 常量与变量 3.3 整型数据 3.4 浮点型数据运行 3.5 字符型数据

主要内容 3.6变量赋初值 3.7 各类数值型数据间的混合运算 3.8 算术运算符和算术表达式 3.9 赋值运算符和赋值表达式 3.10 逗号运算符和逗号表达式

§ 3.1 C的数据类型 C语言提供了以下一些数据类型。 基本类型 数据类型 构造类型 指针类型 空类型(无值类型) void 整型 int 字符型 char 实型(浮点型) 单精度实型 float 双精度实型 double 枚举类型 enum 数组类型 结构类型 struct 联合类型 union 数据类型 构造类型 指针类型 空类型(无值类型) void

§3.2 常量与变量 3.2.1 常量和符号常量 整型 100,125,-100,0 实型 3.14 , 0.125,-3.789 3.2.1 常量和符号常量 在程序运行过程中,其值不能被改变的量称为常量 常量区分为不同的类型: 整型 100,125,-100,0 实型 3.14 , 0.125,-3.789 字符型 ‘a’, ‘b’,‘2’ 字符串 ‘a’, ‘ab’,‘1232’

例3. 1 符号常量的使用 #define PRICE 30 #include <stdio 例3.1 符号常量的使用 #define PRICE 30 #include <stdio.h> void main ( ) { int num, total; num=10; total=num * PRICE; printf(″total=%d\n″,total); } 运行结果: total=300 说明:如再用赋值语句给PRICE赋值是错误的。 PRICE=40; /* 错误,不能给符号常量赋值。 说明:用一个标识符代表一个常量的,称为符号常量,即以标识符形式出现的常量。符号常量的值在其作用域(在本例中为主函数)内不能改变,也不能再被赋值。 说明: 程序中用#define命令行定义PRICE代表常量30,此后凡在本文件中出现的PRICE都代表30,可以和常量一样进行运算

§3.2 常量与变量 图 3.2.2 变量 变量代表内存中具有特定属性的一个存储单元,它用来存放数据,这就是变量的值,在程序运行期间,这些值是可以改变的。 变量名实际上是一个以一个名字对应代表一个地址,在对程序编译连接时由编译系统给每一个变量名分配对应的内存地址。从变量中取值,实际上是通过变量名找到相应的内存地址,从该存储单元中读取数据。

 §3.2 常量与变量  变量命名的规定:C语言规定标识符只能由字母、数字和下划线三种字符组成,且第一个字符必须为字母或下划线。 例:sum,_total, month, Student_name, lotus_1_2_3,BASIC, li_ling M.D.John, ¥123,3D64,a>b  

§3.2 常量与变量 注意: 编译系统将大写字母和小写字母认为是两个不同的字符。 建议变量名的长度最好不要超过8个字符。 在选择变量名和其它标识符时,应注意做到“见名知意”,即选有含意的英文单词 (或其缩写)作标识符。 要求对所有用到的变量作强制定义,也就是“先定义,后使用” 。

§3.3 整型数据 3.3.1整型常量的表示方法 可用以下三种形式表示: 整型常量即整常数。在C语言中,整常数 (1)十进制整数。 §3.3 整型数据 3.3.1整型常量的表示方法 整型常量即整常数。在C语言中,整常数 可用以下三种形式表示: (1)十进制整数。 如:123, -456.4。 (2)八进制整数。以0头的数是八进制数。 如:0123表示八进制数123,等于十进制数83,-011表示八进制数-11,即十进制数-9。

§3.3 整型数据 3.3.2 整型变量 (1)整型数据在内存中的存放形式 (3)十六进制整数。以0x开头的数是16进制数。 §3.3 整型数据 图 (3)十六进制整数。以0x开头的数是16进制数。 如:0x123,代表16进制数123,等于十进制数 291。 -0x12等于十进制数-10。 3.3.2 整型变量 (1)整型数据在内存中的存放形式 数据在内存中是以二进制形式存放的。 如: int i; /* 定义为整型变量 */ i=10; /* 给i赋以整数10 */

§3.3 整型数据 注意: 十进制数10的二进制形式为1010,Turbo C 2.0和Turbo C++ 3.0为一个整型变量在内存中分配2个字节的存储单元(不同的编译系统为整型数据分配的字节数是不相同的,VC++ 6.0则分配4个字节)。 数值是以补码(complement) 表示的。

§3.3 整型数据 (2)整型变量的分类: 有符号基本整型 有符号短整型 有符号长整型 无符号基本整型 无符号短整型 无符号长整型 §3.3 整型数据 (2)整型变量的分类: 有符号基本整型 有符号短整型 有符号长整型 无符号基本整型 无符号短整型 无符号长整型 (signed)int (signed)short (int ) (signed) long (int) unsigned int unsigned short (int) unsigned long (int) 共六种 注意:括号表示其中的内容是可选的.

§3.3 整型数据 整数类型的有关数据: 类型 类型说明符 长度 数的范围 基本型 int 2字节 -32768~32767 §3.3 整型数据 整数类型的有关数据: 类型 类型说明符 长度 数的范围 基本型 int 2字节 -32768~32767 短整型 short 2字节 -215~215-1 长整型 long 4字节 -231~231-1 无符号整型 unsigned 2字节 0~65535 无符号短整型 unsigned short 2字节 0~65535 无符号长整型 unsigned long 4字节 0~(232-1)

§3.3 整型数据 (3)整型变量的定义: C规定在程序中所有用到的变量都必须在程序中定义,即“强制类型定义”。 例如: §3.3 整型数据 (3)整型变量的定义: C规定在程序中所有用到的变量都必须在程序中定义,即“强制类型定义”。 例如: int a,b(指定变量a、b为整型) unsigned short c,d;(指定变量c、d为无符号短整型) long e,f;(指定变量e、f为长整型)

例3. 2 整型变量的定义与使用 #include <stdio. h> void main() {int a,b,c,d; / 例3.2 整型变量的定义与使用 #include <stdio.h> void main() {int a,b,c,d; /*指定a、b、c、d为整型变量*/ unsigned u; /*指定u为无符号整型变量*/ a=12;b=-24;u=10; c=a+u;d=b+u; printf(″a+u=%d,b+u=%d\n″,c,d); } 运行结果: a+u=22,b+u=-14 说明: 可以看到不同种类的整型数据可以进行算术运算

例3. 3 整型数据的溢出 #include <stdio 例3.3 整型数据的溢出 #include <stdio.h> void main() {int a,b; a=32767; b=a+1; printf(“%d,%d\n”,a,b); } 运行结果: 32767,-32768 说明:数值是以补码表示的。一个整型变量只能容纳-32768~32767范围内的数,无法表示大于32767或小于-32768的数。遇此情况就发生“溢出”。

§3.3 整型数据 3.3.3 整型常量的类型 (1)一个整数,如果其值在-32768~+32767范围内,认为它是int型,它可以赋值给int型和long int型变量。 (2) 一个整数,如果其值超过了上述范围,而在-2147483637~+2147483647范围内,则认为它是为长整型。可以将它赋值给一个long int型变量。

§3.3 整型数据 (3) 如果所用的C版本(如Turbo C)分配给 short int与int型数据在内存中占据的长度 §3.3 整型数据 (3) 如果所用的C版本(如Turbo C)分配给 short int与int型数据在内存中占据的长度 相同,则它的表数范围与int型相同。因此 一个int型的常量同时也是一个short int型 常量,可以赋给int型或short int型变量。  

§3.3 整型数据 (4) 一个整常量后面加一个字母u或U,认 为是unsigned int型,如12345u,在内存 §3.3 整型数据 (4) 一个整常量后面加一个字母u或U,认 为是unsigned int型,如12345u,在内存 中按unsigned int规定的方式存放(存储 单元中最高位不作为符号位,而用来存储 数据)。如果写成-12345u,则先将-12345 转换成其补码53191,然后按无符号数存 储。

§3.3 整型数据 (5) 在一个整常量后面加一个字母l或L,则 认为是long int型常量。例如123l.432L.0L §3.3 整型数据 (5) 在一个整常量后面加一个字母l或L,则 认为是long int型常量。例如123l.432L.0L 等。这往往用于函数调用中。如果函数的形 参为long int型,则要求实参也为long int 型。

 §3.4 浮点型数据 小数 0.123 指数 3e-3  3.4.1浮点型常量的表示方法 两种表 示形式 注意:字母e(或E)之前必须有数字,且e后面的指数必须为整数  1e3、1.8e-3、-123e-6、-.1e-3 e3、2.1e3.5、.e3、e 

例如: 123.456可以表示为: §3.4 浮点型数据 规范化的指数形式: 在字母e(或E)之前的小数部分中,小数点左边 应有一位(且只能有一位)非零的数字. 例如: 123.456可以表示为: 123.456e0, 12.3456e1, 1.23456e2, 0.123456e3, 0.0123456e4, 0.00123456e 其中的1.23456e3称为“规范化的指数形式”。

§3.4 浮点型数据 3.4.2 浮点型变量 (1)浮点型数据在内存中的存放形式 图 3.4.2 浮点型变量 (1)浮点型数据在内存中的存放形式 一个浮点型数据一般在内存中占4个字节(32位)。与整型数据的存储方式不同,浮点型数据是按照指数形式存储的。系统把一个浮点型数据分成小数部分和指数部分,分别存放。指数部分采用规范化的指数形式。

§3.4 浮点型数据 (2) 浮点型变量的分类 浮点型变量分为单精度(float型)、双精度(double型)和长双精度型(long double)三类形式。 类型 位数 数的范围 有效数字 float 32 10-37 ~ 1038 6~7 位 double型 64 10-307~10308 15~16位 long double 128 10-4931~104932 18~19位

例3. 4 浮点型数据的舍入误差 #include <stdio 例3.4 浮点型数据的舍入误差 #include <stdio.h> void main() {float a,b; a = 123456.789e5; b = a + 20 ; printf(“%f\n”,b); } 运行结果: 123456.789e5 说明:一个浮点型变量只能保证的有效数字是7位有效数字,后面的数字是无意义的,并不准确地表示该数。应当避免将一个很大的数和一个很小的数直接相加或相减,否则就会“丢失”小的数

§3.4 浮点型数据 3.4.3 浮点型常量的类型 C编译系统将浮点型常量作为双精度来处理。 例如:f = 2.45678 * 4523.65 系统先把2.45678和4523.65作为双精度数,然后进行相乘的运算,得到的乘也是一个双精度数。最后取其前7位赋给浮点型变量f。如是在数的后面加字母f或F(如1.65f, 654.87F),这样编译系统就会把它们按单精度(32位)处理。

 §3.5字符型数据 3.5.1 字符常量 ‘a’,’A’, ‘1’ 例 ‘abc’、“a” (1)用单引号包含的一个字符是字符型常量 (2)只能包含一个字符 ‘a’,’A’, ‘1’ ‘abc’、“a” 例 

§3.5字符型数据 有些以“\”开头的特殊字符称为转义字符 \n 换行 \t 横向跳格 \r 回车 \\ 反斜杠 \\ 反斜杠 \ddd ddd表示1到3位八进制数字 \xhh hh表示1到2位十六进制数字

例3. 5 转义字符的使用 #include <stdio 例3.5 转义字符的使用 #include <stdio.h> void main() {printf(″ ab c\t de\rf\tg\n″); printf(″h\ti\b\bj k\n″); } 显示屏上的运行结果: f gde h j k 打印机上的显示结果: fab c gde h jik

§3.5字符型数据 3.5.2字符变量 字符型变量用来存放字符常量,注意只能放一个字符。 字符变量的定义形式如下:char c1,c2; c1=‘a’;c2= ‘b’ ; 一个字符变量在内存中占一个字节。

§3.5字符型数据 3.5.3字符数据在内存中的存储形式及其使用方法 图 3.5.3字符数据在内存中的存储形式及其使用方法 将一个字符常量放到一个字符变量中,实际上并不是把该字符本身放到内存单元中去,而是将该字符的相应的ASCII代码放到存储单元中。 这样使字符型数据和整型数据 之间可以通用。一个字符数据 既可以以字符形式输出,也可 以以整数形式输出。

例3. 6 向字符变量赋以整数。 #include <stdio 例3.6 向字符变量赋以整数。 #include <stdio.h> void main() {char c1,c2; c1=97; c2=98; printf(“%c %c\n”,c1,c2); printf(“%d %d\n”,c1,c2); } 运行结果: a b 97 98 说明:在第3和第4行中,将整数97和98分别赋给c1和c2,它的作用相当于以下两个赋值语句:      c1=′a′;c2=′b′; 因为’a’和’b’的ASCII码为97和98

例3. 7 大小写字母的转换 #include <stdio 例3.7 大小写字母的转换 #include <stdio.h> void main() {char c1,c2; c1=’a’; c2=’b’; c1=c1-32; c2=c2-32; printf(“%c %c″,c1,c2); } 运行结果:A B 说明:程序的作用是将两个小写字母a和b转换成大写字母A和B。从ASCII代码表中可以看到每一个小写字母比它相应的大写字母的ASCII码大32。C语言允许字符数据与整数直接进行算术运算。     

§3.5字符型数据 说明: 有些系统(如Turbo C)将字符变量定义为signed char型。其存储单元中的最高位作为符号位,它的取值范围是-128~127。如果在字符变量中存放一个ASCII码为0~127间的字符,由于字节中最高位为0,因此用%d输出字符变量时,输出的是一个正整数。如果在字符变量中存放一个ASCII码为128~255间的字符,由于在字节中最高位为1,用%d格式符输出时,就会得到一个负整数。

§3.5字符型数据 3.5.4字符串常量 字符串常量是一对双撇号括起来的字符序列. 合法的字符串常量:   “How do you do.”, “CHINA”, “a” , “$123.45” 可以输出一个字符串,如   printf(“How do you do.”);

 §3.5字符型数据  ‘a’是字符常量,”a”是字符串常量,二者不 同。 如:假设C被指定为字符变量 :char c c=’a’; c=”a”;c=”CHINA”;  结论:不能把一个字符串常量赋给一个字符变量。

§3.5字符型数据 如:如果有一个字符串常量”CHINA” ,实际上在内存中是: C规定:在每一个字符串常量的结尾加一个 “字符 串结束标志”,以便系统据此判断字符串是否结束。 C规定以字符’\0’作为字符串结束标志。 如:如果有一个字符串常量”CHINA” ,实际上在内存中是: C H I N A \0 它占内存单元不是5个字符,而是6个字符,最后一个字符为’\0’。但在输出时不输出’\0’。

§3.6变量赋初值 字符串常量 (1)C语言允许在定义变量的同时使变量初始化 如: int a=3; // 指定a为整型变量,初值为3 float f=3.56; // 指定f为浮点型变量,初值为3.56 char c= ‘a’; // 指定c为字符变量,初值为‘a’

§3.6变量赋初值 (2)可以使被定义的变量的一部分赋初值。 如: int a,b,c=5; 表示指定a、b、c为整型变量,但只对c初始化,c的初值为5 (3)如果对几个变量赋以同一个初值, 应写成:int a=3,b=3,c=3; 表示a、b、c的初值都是3。 不能写成∶ int a=b=c3; 注意:初始化不是在编译阶段完成的而是在程序运行时执行本函数时赋初值的,相当于有一个赋值语句。

§3.7各类数值型数据间的混合运算 整型(包括int,short,long)、浮点型(包括 图 整型(包括int,short,long)、浮点型(包括 float,double)可以混合运算。在进行运算时 ,不同类型的数据要先转换成同一类型,然后 进行运算. 上述的类型转换是由 系统自动进行的

§3.8 算术运算符和算术表达式 3.8.1 C运算符简介 C的运算符有以下几类: (1)算术运算符 (+ - * / %) §3.8 算术运算符和算术表达式 3.8.1 C运算符简介 C的运算符有以下几类: (1)算术运算符 (+ - * / %) (2)关系运算符 (><==>=<=!=) (3)逻辑运算符 (!&&||) (4)位运算符 (<< >> ~ |∧&) (5)赋值运算符 (=及其扩展赋值运算符) (6)条件运算符 (?:) (7)逗号运算符 (,)

§3.8 算术运算符和算术表达式 (8)指针运算符 (*和&) (9)求字节数运算符(sizeof) §3.8 算术运算符和算术表达式 (8)指针运算符 (*和&) (9)求字节数运算符(sizeof) (10)强制类型转换运算符( (类型) ) (11)分量运算符(.->) (12)下标运算符([ ]) (13)其他 (如函数调用运算符())

§3.8 算术运算符和算术表达式 3.8.2 算术运算符和算术表达式 (1)基本的算术运算符: §3.8 算术运算符和算术表达式 3.8.2 算术运算符和算术表达式 (1)基本的算术运算符: + (加法运算符,或正值运算符。如:3+5、+3) - (减法运算符,或负值运算符。如:5-2、-3) * (乘法运算符。如:3*5) / (除法运算符。如:5/3) % (模运算符,或称求余运算符,%两侧均应为整型数据,如:7%4的值为3)。

§3.8 算术运算符和算术表达式 (2) 算术表达式和运算符的优先级与结合性基本的算术运算符: 例如: a*b/c-1.5+′a′ §3.8 算术运算符和算术表达式 (2) 算术表达式和运算符的优先级与结合性基本的算术运算符: 用算术运算符和括号将运算对象(也称操作数)连接起来的、符合C语法规则的式子,称为C算术表达式。运算对象包括常量、变量、函数等。 例如: a*b/c-1.5+′a′ 是一个合法的表达式

§3.2 常量与变量 C语言规定了运算符的优先级和结合性。 C规定了各种运算符的结合方向(结合性) 在表达式求值时,先按运算符的优先级别高低次序执行,例如先乘除后加减。 C规定了各种运算符的结合方向(结合性) 算术运算符的结合方向为“自左至右”,即先左后右 。

§3.8 算术运算符和算术表达式 (3)强制类型转换运算符 可以利用强制类型转换运算符将一个表达式转换成 所需类型。 §3.8 算术运算符和算术表达式 (3)强制类型转换运算符 可以利用强制类型转换运算符将一个表达式转换成 所需类型。 一般形式:(类型名)(表达式) 例如: (double)a 将a转换成double类型 (int)(x+y) 将x+y的值转换成整型 (float)(5%3) 将5%3的值转换成float型

例3. 8 强制类型转换。 #include <stdio 例3.8 强制类型转换。 #include <stdio.h> voidmain() {float x; int i; x=3.6; i=(int)x; printf("x=%f, i=%d\n",x,i); } 运行结果: x=3.600000, i=3 说明:有两种类型转换,一种是在运算时不必用户指定,系统自动进行的类型转换,如3+6.5。第二种是强制类型转换。当自动类型转换不能实现目的时,可以用强制类型转换。

§3.8 算术运算符和算术表达式 (4) 自增、自减运算符 如: 作用是使变量的值增1或减1 ++i,--i(在使用i之前,先使i的值加 §3.8 算术运算符和算术表达式 (4) 自增、自减运算符 作用是使变量的值增1或减1 如: ++i,--i(在使用i之前,先使i的值加 (减)1) i++,i--(在使用i之后,使i的值加( 减)1)

§3.8 算术运算符和算术表达式 i++与++i的区别: 例如: ++i是先执行i=i+1后,再使用i的值; §3.8 算术运算符和算术表达式 i++与++i的区别: ++i是先执行i=i+1后,再使用i的值; i++是先使用i的值后,再执行i=i+1。 例如: ①j=++i;    i的值先变成4, 再赋给j,j的值均为4 ②j=i++; 先将 i的值3赋给j,j的值为3,然后i变为4

§3.8 算术运算符和算术表达式 注意: (1)自增运算符(++),自减运算符(--),只能用于变量,而不能用于常量或表达式, §3.8 算术运算符和算术表达式 注意: (1)自增运算符(++),自减运算符(--),只能用于变量,而不能用于常量或表达式, (2)++和--的结合方向是“自右至左”。 自增(减)运算符常用于循环语句中使循环变量 自动加1。也用于指针变量,使指针指向下一个地址

§3.8 算术运算符和算术表达式 例如:对表达式 a = f1( )+f2( ) (5) 有关表达式使用中的问题说明 §3.8 算术运算符和算术表达式 (5) 有关表达式使用中的问题说明 ①ANSI C并没有具体规定表达式中的子表达式的求值顺序,允许各编译系统自己安排。 例如:对表达式 a = f1( )+f2( ) 并不是所有的编译系统都先调用f1( ), 然后 调用f2( )。在有的情况下结果可能不同。有时会出 现一些令人容易搞混的问题,因此务必要小心谨慎。

§3.8 算术运算符和算术表达式 例如:不要写成i+++j的形式,而应写成 ②C语言中有的运算符为一个字符,有的运算符由 §3.8 算术运算符和算术表达式 ②C语言中有的运算符为一个字符,有的运算符由 两个字符组成 ,为避免误解,最好采取大家都能理 解的写法。 例如:不要写成i+++j的形式,而应写成 (i++)+j的形式

§3.8 算术运算符和算术表达式 不要写出别人看不懂的也 不知道系统会怎样执行程 序 ③在调用函数时,实参数的求值顺序,C标准并无统 §3.8 算术运算符和算术表达式 ③在调用函数时,实参数的求值顺序,C标准并无统 一规定。 例如:i的初值为3,如果有下面的函数调用: printf(″%d,%d″,i,i++) 在有的系统中,从左至右求值,输出“3,3”。在多数系统中对函数参数的求值顺序是自右而左,printf函数输出的是“4,3”。以上这种写法不宜提倡, 最好改写成 j = i++; printf("%d, %d", j,i) 不要写出别人看不懂的也 不知道系统会怎样执行程 序

§3.9 赋值运算符和赋值表达式 (1)赋值运算符 赋值符号“=”就是赋值运算符,它的作用是 将一个数据赋给一个变量。如“a=3”的作用 是执行一次赋值操作(或称赋值运算)。把常 量3赋给变量a。也可以将一个表达式的值赋 给一个变量.

§3.9 赋值运算符和赋值表达式 (2)类型转换 是数值型或字符型时,在赋值时要进行类型 转换。 如果赋值运算符两侧的类型不一致,但都 是数值型或字符型时,在赋值时要进行类型 转换。 ①将浮点型数据(包括单、双精度)赋给整 型变量时,舍弃浮点数的小数部分。 如:i为整型变量,执行“i=3.56”的结果是使 i的值为3,以整数形式存储在整型变量中.

§3.9 赋值运算符和赋值表达式 ②将整型数据赋给单、双精度变量时,数值不变, 但以浮点数形式存储到变量中 如: 将23赋给float变量f,即执行f=23,先 将23转换成23.00000,再存储在f中。 将23赋给double型变量d,即执行d= 23,则将23补足有效位数字为23.00000 000000000,然后以双精度浮点数形式存储 到变量d中。

§3.9 赋值运算符和赋值表达式 如:float f;double d=123.456789e100; f=d; ③将一个double型数据赋给float变量时,截取其前 面7位有效数字,存放到float变量的存储单元(4个 字节)中。但应注意数值范围不能溢出。 如:float f;double d=123.456789e100; f=d; 就出现溢出的错误。 如果将一个float型数据赋给double变量时,数值不 变,有效位数扩展到16位,在内存中以8个字节存储

§3.9 赋值运算符和赋值表达式 ④字符型数据赋给整型变量时,由于字符只占1个字 节,而整型变量为2个字节,因此将字符数据(8个 图 ④字符型数据赋给整型变量时,由于字符只占1个字 节,而整型变量为2个字节,因此将字符数据(8个 二进位)放到整型变量存储单元的低8位中。 第一种情况: 如果所用系统将字符处理为无符号的字符类型,或程 序已将字符变量定义为unsigned char 型,则将字符的8位放到整型变量低8位,高8位补 零 例如:将字符‘\376’赋给int型变量i

如果所用系统(如Turbo C++)将字符处理为带符号 §3.9 赋值运算符和赋值表达式 图 第二种情况: 如果所用系统(如Turbo C++)将字符处理为带符号 的(即signed char),若字符最高位为0,则整型 变量高8位补0;若字符最高位为1,则高8位全补 1。这称为“符号扩展”,这样做的目的是使数值保持 不变,如变量c(字符‘\376’)以整数形式输出 为-2,i的值也是-2。

§3.9 赋值运算符和赋值表达式 例如:int i=289;char c=′a′;c=i; 图 ⑤将一个int、short、long型数据赋给一个char型变 量时,只将其低8位原封不动地送到char型变量(即 截断)。 例如:int i=289;char c=′a′;c=i; 赋值情况 : c的值为33, 如果用“%c”输 出c,将得到字符“!” (其 ASCII码为33)。

§3.9 赋值运算符和赋值表达式 将带符号的整型数据(int型)赋给long型变量时,要进行符号扩展,将整型数的16位送到long型低16位中: 如果int型数据为正值(符号位为0),则long型变量的高16位补0; 如果int型变量为负值(符号位为1),则long型变量的高16位补1,以保持数值不改变。 反之,若将一个long型数据赋给一个int型变量,只将long型数据中低16位原封不动地送到整型变量(即截断)。

§3.9 赋值运算符和赋值表达式 例如:int a; long b=8;a=b 赋值情况如图 : 图 图3.14 如果b=65536(八进制数0200000),则赋值后a值为0。见图3.14

§3.9 赋值运算符和赋值表达式 ⑦将unsigned int型数据赋给long int型变量时,不 存在符号扩展问题,只需将高位补0即可。将一个 unsigned类型数据赋给一个占字节数相同的非 unsigned型整型变量(例如:unsigned int ->int,unsigned long->long,unsigned short ->short),将unsigned型变量的内容原样送到非 unsigned型变量中,但如果数据范围超过相应整型的 范围,则会出现数据错误。

§3.9 赋值运算符和赋值表达式 例如:unsigned int a=65535; int b;b=a; 将a整个送到b中,由于b是int, 图 例如:unsigned int a=65535; int b;b=a; 将a整个送到b中,由于b是int, 第1位是符号位,因此b成了 负数。根据补码知识可知,b的 值为-1,可以用printf(″%d″,b);来验证。 ⑧将非unsigned型数据赋给长度相同的unsigned型变量,也是原样照赋(连原有的符号位也作为数值一起传送)。

例3. 9 有符号数据传送给无符号变量。 #include <stdio 例3.9 有符号数据传送给无符号变量。 #include <stdio.h> void main() {unsigned a; int b=-1; a=b; printf(″%u\n″,a); } 运行结果: 65535 图 说明:“%u”是输出无符号数时所用的格式符。如果b为正值,且在0~32767之间,则赋值后数值不变。赋值情况见图

以“a+=3”为例来说明,它相当于使a进行一次自加(3)的操作。即先使a加3,再赋给a。 §3.9 赋值运算符和赋值表达式 (3) 复合的赋值运算符 在赋值符“=”之前加上其他运算符,可以构成复 合的运算符。 例如: a+=3 等价于 a=a+3 x*=y+8 等价于 x=x*(y+8) x%=3 等价于 x=x%3 以“a+=3”为例来说明,它相当于使a进行一次自加(3)的操作。即先使a加3,再赋给a。

§3.9 赋值运算符和赋值表达式 为便于记忆,可以这样理解: ① a += b (其中a为变量,b为表达式) |___↑ ③ a = a + b (在“=”左侧补上变量名a)

凡是二元(二目)运算符,都可以与赋值符一起组合成复合赋值符。 §3.9 赋值运算符和赋值表达式 注意:如果b是包含若干项的表达式,则相当于它有 括号。 如: ① x %= y+3 ② x %= (y+3) |__↑ ③ x = x %(y+3)(不要错写成x=x%y+3) 凡是二元(二目)运算符,都可以与赋值符一起组合成复合赋值符。 C语言规定可以使用10种复合赋值运算符: +=,-=,*=,/=,%=,<<=,>>=,&=,∧=,|=

例如: “a=5”是一个赋值表达式 §3.9 赋值运算符和赋值表达式 (4) 赋值表达式 由赋值运算符将一个变量和一个表达式连接 起来的式子称为“赋值表达式”。 一般形式为: <变量><赋值运算符><表达式> 例如: “a=5”是一个赋值表达式

§3.9 赋值运算符和赋值表达式 对赋值表达式求解的过程是: ②赋给赋值运算符左侧的变量。 ①求赋值运算符右侧的“表达式”的值; ②赋给赋值运算符左侧的变量。 例如: 赋值表达式“a=3*5”的值为15,执行表达式后,变量a的值也是15。 注意: 一个表达式应该有一个值

§3.9 赋值运算符和赋值表达式 左值 (lvalue) : 赋值运算符左侧的标识符 变量可以作为左值; 而表达式就不能作为左值(如a+b); 常变量也不能作为左值, 右值 (lvalue) :出现在赋值运算符右侧的表达式 左值也可以出现在赋值运算符右侧,因而左值 都可以作为右值。

§3.9 赋值运算符和赋值表达式 分析:括弧内的“b=5”是一个赋值表达式,它 赋值表达式中的“表达式”,又可以是一个赋值表 达式.例如: a=(b=5) 分析:括弧内的“b=5”是一个赋值表达式,它 的值等于5。执行表达式“a=(b=5)”相当于执行 “b=5”和“a=b”两个赋值表达式。 赋值运算符 按照“自右而左”的结合顺序,因此,“(b=5)” 外面的括弧可以不要,即“a=(b=5)”和“a=b=5” 等价.

§3.9 赋值运算符和赋值表达式 分析:先执行括弧内的运算,将15赋给a,然后执行 注意:在对赋值表达式(a=3*5)求解后,变量a得到值 不能写成: a=3*5=4*3 注意:在对赋值表达式(a=3*5)求解后,变量a得到值 15执行(a=3*5)=4*3时,实际上是将4*3的积12赋给变 量a,而不是赋给3*5。

§3.9 赋值运算符和赋值表达式 赋值表达式也可以包含复合的赋值运算符。 如:a+=a-=a*a 分析:此赋值表达式的求解步骤如下∶

§3.9 赋值运算符和赋值表达式 如:printf("%d",a=b); 将赋值表达式作为表达式的一种,使赋值操作不仅可以出现在赋值语句中,而且可以以表达式形式出现在其他语句(如输出语句、循环语句等)中. 如:printf("%d",a=b); 分析:如果b的值为3, 则输出a的值(也是表达式a=b的值)为3。在一个语句中完成了赋值和输出双重功能。

§3.10 逗号运算符和逗号表达式 如:3+5,6+8 一般形式: 表达式1,表达式2 逗号运算符:将两个表达式连接起来,又称为“顺序求 逗号表达式 的值为14 逗号运算符:将两个表达式连接起来,又称为“顺序求 值运算符” 如:3+5,6+8 一般形式: 表达式1,表达式2 求解过程: 先求解表达式1,再求解表达式2。整个逗号表达式的值是表达式2的值。

§3.10 逗号运算符和逗号表达式 例:逗号表达式a=3*5,a*4 分析:赋值运算符的优先级别高于逗号运算符, 因 此应先求解a=3*5. a的值为15,然后求解a*4,得60。整个逗号表达式的值为60。 例:逗号表达式a=3*5,a*4 分析:赋值运算符的优先级别高于逗号运算符, 因 此应先求解a=3*5. 一个逗号表达式又可以与另一个表达式组成一 个新的逗号表达式 如:(a=3*5,a*4) a+5先计算出a的值等于15,再进行a*4的运算得60(但a值未变,仍为15),再进行a+5得20,即整个表达式的值为20。

§3.10 逗号运算符和逗号表达式 逗号表达式的一般形式可以扩展为 它的值为表达式n的值。 表达式1,表达式2,表达式3,……,表达式n 赋值表达式,将一个逗号表达式的值赋给x,x的值等于18 逗号运算符是所有运算符中级别最低的 例: ① x=(a=3,6*3) ② x=a=3,6*3 逗号表达式,包括一个赋值表达式和一个算术表达式,x的值为3,整个逗号表达式的值为18。

§3.10 逗号运算符和逗号表达式 注意:并不是任何地方出现的逗号都是作为逗号运算符。例如函数参数也是用逗号来间隔的。 “a,b,c”并不是一个逗号表达式,它是printf函数的3个参数 注意:并不是任何地方出现的逗号都是作为逗号运算符。例如函数参数也是用逗号来间隔的。 如: printf(“%d,%d,%d”,a,b,c); printf(“%d,%d,%d”,(a,b,c),b,c) “(a,b,c)”是一个逗号表达式,它的值等于c的值。