Presentation is loading. Please wait.

Presentation is loading. Please wait.

主讲教师:吴琼 微信群:C语言2016 QQ群: 密码scu2016 昵称:“学号+真名”

Similar presentations


Presentation on theme: "主讲教师:吴琼 微信群:C语言2016 QQ群: 密码scu2016 昵称:“学号+真名”"— Presentation transcript:

1 主讲教师:吴琼 微信群:C语言2016 QQ群:437583061密码scu2016 昵称:“学号+真名”
四川大学计算机学院 四川大学计算机学院 主讲教师:吴琼 微信群:C语言2016 QQ群: 密码scu2016 昵称:“学号+真名” 2018/12/29

2 本书内容 第1章 基础知识 第2章 表达式 第3章 控制语句 第4章 函数 第5章 数组和指针 第6章 结构类型 第7章 预处理命令
第1章 基础知识 第2章 表达式 第3章 控制语句 第4章 函数 第5章 数组和指针 第6章 结构类型 第7章 预处理命令 第8章 文件 主讲教师:四川大学计算机学院 *** 2018/12/29

3 Undefined Instruction
本章主要内容 1 程序示例 2 相关语法 0x1C 0x18 0x14 0x10 0x0C 0x08 0x04 0x00 FIQ 3 研究部分 IRQ (Reserved) Data Abort 8 习题 Prefetch Abort Software Interrupt Undefined Instruction Reset ARM Vector Table 主讲教师:四川大学计算机学院 *** 2018/12/29

4 第一部分为程序示例:精读和精讲部分,力求人人吃透 。 第二部分为相关语法:自学为宜,不必细讲。 第三部分为研究部分:供学有余力的同学参考
主讲教师:四川大学计算机学院 *** 2018/12/29

5 2.1 程序示例 本部分要吃透 反复琢磨示例程序 主讲教师:四川大学计算机学院 *** 2018/12/29

6 两部分 两部分 /* 1. 编译预处理命令 */ #include <stdio.h> /* 2. 主函数 */
2.1.1 输出Hello World 例题s2_1 /* 1. 编译预处理命令 */ #include <stdio.h> /* 2. 主函数 */ int main (void) { printf ("Hello World.\n"); return 0; } 两部分 两部分 /* 1. 编译预处理命令--包含预处理命令*/ #include <stdio.h> /* 文件包含预处理命令,后面不能有分号 */ /* 2. 主函数-- main( )函数定义 */ int main (void) /* 主函数的函数头部分 */ { /* 主函数的函数体部分:即两个大括弧之间的内容 */ printf ("Hello World.\n"); /* 调用库函数printf( ),输出Hello World. */ return 0; /* 返回值0,返回操作系统 */ } 主讲教师:四川大学计算机学院 *** 2018/12/29

7 该程序包含两个部分: 1.编译预处理命令; 2.主函数main()的定义。 printf() 在其中声明。 包括两部分:
函数头“int main (void)”; 函数头后面的函数体。 主讲教师:四川大学计算机学院 *** 2018/12/29

8 唯一main 每个C程序都由一个或多个函数组成 main( )函数是特殊函数——任何C程序必须有且只能有一个main( )函数:
int main (void) 每个C程序都由一个或多个函数组成 main( )函数是特殊函数——任何C程序必须有且只能有一个main( )函数: C程序的运行必须从main( )函数开始,而且也在main( )函数中结束。 main( )函数可以放在C程序的任意位置。 通过main这个名字才能找到将要执行的程序入口。 例题2.1中的printf( )函数就是在库stdio.h中声明的输出函数;system( ) 就是在库stdlib.h中声明的系统dos功能调用函数,它们都是标准库函数。另外,虽然main( )函数可以调用其他函数,但是其他函数不能调用main( )函数。 唯一main 主讲教师:四川大学计算机学院 吴琼 2018/12/29

9 回车换行的意思 1. 要输出: Hello Sichuan University! Hello,易书桥! 如何办?
练习: 1. 要输出: Hello Sichuan University! Hello,易书桥! 如何办? 2. 在Hello World末尾添加\n和删除\n的差异。 回车换行的意思 主讲教师:四川大学计算机学院 *** 2018/12/29

10 2.1.2 简单表达式求值 例题s2_2 /* 1. 编译预处理命令 */ #include <stdio.h>
/* 2. 主函数定义 */ int main (void) /* 函数头 */ { int a, b, c; /* 定义三个整型变量 */ a = 1; /* 将1赋值给变量a */ b = 2; /* 将2赋值给变量b */ c = a+b; /* 计算表达式a+b的值 */ printf (“c = %d.\n”, c); /* 输出 */ return 0; } 通过%%可输出% 如何输出% 主讲教师:四川大学计算机学院 *** 2018/12/29

11 程序包含两个部分: 1.编译预处理命令部分; 2.主函数部分。 int a, b, c; 定义了a、b、c三个变量. a = 1;
两个赋值语句. c = a+b; 计算表达式a+b的值,并将计算结果赋值给变量c. 主讲教师:四川大学计算机学院 *** 2018/12/29

12 输出项 输出格式控制符 printf ("c = %d.\n", c); %d表示它是整型数据的输出占位符。
主讲教师:四川大学计算机学院 *** 2018/12/29

13 字母表示输出数据类型 数字表示输出的域宽 printf()常用的输出格式控制字符 以整数形式输出 %d %6d 以浮点数形式输出 %f
以整数形式输出,且输出域宽为6位。 %6d %f 以浮点数形式输出 以浮点形式输出,且输出域宽为6位。 %6f 数字表示输出的域宽 以浮点形式输出,且小数点后2位。 %.2f %6d默认是右对齐,如果要左对齐,%-6d 以浮点形式输出,6位宽度,小数点后2位。 %6.2f 主讲教师:四川大学计算机学院 *** 2018/12/29

14 要求上机练习 1. 求表达式a-b、a*b、a%b的值。 2. 求表达式a/b的值,上机试一试是否如愿?查查资料了解为什么?
练习: 1. 求表达式a-b、a*b、a%b的值。 2. 求表达式a/b的值,上机试一试是否如愿?查查资料了解为什么? 3. a+(++b)、a+(b++) 、a>=b、a<b、a!=b、a==b、a=b、a&&b、a&b、a||b、a|b、a^b、!a、~a、a>b && !b、(a>b) ? a:b、a,b、sizeof a、sizeof (int)、sizeof (double)、a+=b、b*=a+1、b>>1、b<<a。 如果要得到a/b=0.5的结果,需将a、b都设置为float型 ^按位与非 !a是逻辑非 ~a是按位非 要求上机练习 主讲教师:四川大学计算机学院 *** 2018/12/29

15 求表达式a+b的值,然后在printf()函数中用%d和%u分别输出结果,看看有什么差异?
4.如果 a = -1; b = -2; 求表达式a+b的值,然后在printf()函数中用%d和%u分别输出结果,看看有什么差异? 查阅资料,了解这是为什么? Printf(“c=%0x.\n”,c); //可输出十六进制 无论是c是int还是unsigned,输出的十六进制数都是0xfffffffd= , , , 如果是int,负数的补码:除符号为外,其余各位按位取反加1,得到原码 , , , =-3 如果是unsigned,无符号数的补码即为原码 , , , = = 主讲教师:四川大学计算机学院 *** 2018/12/29

16 为何可以调用该函数? 2.1.3 求复杂表达式的值 例题s2_3 /* 1. 编译预处理命令和函数声明*/
#include <stdio.h> double Func (double x, double y); /* 2. 主函数*/ int main (void) /* 主函数函数头 */ { /* 主函数函数体 */ double a=100.0, b, sD; /* 定义了三个浮点型变量:a,b,sD */ printf("请输入一个实数:"); /* 输入提示语 */ scanf ("%lf", &b); /* 输入一个实数存入变量b */ sD = Func(a, b); /* 调用Func( )函数 */ printf ("The Square Difference is %lf.\n", sD); return 0; /* 返回值0 */ } 为何可以调用该函数? 主讲教师:四川大学计算机学院 *** 2018/12/29

17 /* 3. 自定义函数--定义Func( )函数 */ double Func (double x, double y) /* 函数头*/
{ /* 函数体*/ double z; /* 变量定义 */ z = (x+y) * (x-y); /* 求出x和y的平方差 */ return (z); /* 返回语句 */ } 主讲教师:四川大学计算机学院 *** 2018/12/29

18 替换Func调用可得别的功能 例题2.3的源代码分为三个部分: 1. 编译预处理命令和函数声明; 2. main( )函数定义;
double a=100.0, b, sD; scanf ("%lf", &b); sD = Func(a, b); 3. Func( )函数定义。 z = (x+y) * (x-y); 替换Func调用可得别的功能 主讲教师:四川大学计算机学院 *** 2018/12/29

19 输入项必须是变量地址 scanf ("%lf", &b); “%lf”合在一起就表示将以双精度浮点型数据格式处理输入的数据。
&表示取地址的意思,&b就表示变量b的存储空间的首地址 scanf (“%lf,%lf”, &a, &b); 前一个%lf对应a,后一个%lf对应b。 输入项必须是变量地址 主讲教师:四川大学计算机学院 *** 2018/12/29

20 %lf的使用? 如下: %c——代表字符型; %d——代表整型; %u——代表无符号整型; %ld——代表长整型; %f——代表浮点型;
常用的输入格式控制字符 如下: %c——代表字符型; %d——代表整型; %u——代表无符号整型; %ld——代表长整型; %f——代表浮点型; %s——代表字符串。 %lf的使用? 主讲教师:四川大学计算机学院 *** 2018/12/29

21 其次,将Func( )函数调用的返回值赋值给变量sD。
sD = Func(a, b); 语句包含两层意思: 首先,调用Func( )函数, 在调用时将实参a和b的值分别传递给Func( )函数的形式参数x和y,接着执行Func( )函数体中的每一个语句,并返回a和b的平方差; 其次,将Func( )函数调用的返回值赋值给变量sD。 主讲教师:四川大学计算机学院 *** 2018/12/29

22 double Func (double x, double y) 函数的函数体语句: z = (x+y)*(x-y); 该语句包含两层意思:
另外,表达式(x+y)*(x-y)通过*(求积运算符)把表达式(x+y)和表达式(x-y)连接起来。 主讲教师:四川大学计算机学院 *** 2018/12/29

23 堆栈的动态变化过程 int a, b, c; scanf ("%d%d", &a,&b); 0x3000ffff 0x3000fffe
#include <stdio.h> int Func(int x, int y); int main (void) { return 0; } 0x3000ffff 0x3000fffe 0x3000fffd 0x3000fffc 0x3000fffb 0x3000fffa int a, b, c; scanf ("%d%d", &a,&b); c = Func(a, b); z = ? z = 20 y = 20 int Func(int x, int y) x = 10 { int z; c = ? c = 20 z = (y-x)*x/y; b = ? b = 20 return z; a = ? a = 10 } 主讲教师:四川大学计算机学院 *** 2018/12/29

24 堆栈的动态变化过程 0x3000ffff 0x3000fffe 0x3000fffd 0x3000fffc 0x3000fffb
0x3000fffa 堆栈的动态变化过程 #include <stdio.h> int main (void) { return 0; } int a, b, c; a = 10; b = 20; c = Max(a, b); z = ? z = 20 y = 20 Max(int x, int y) x = 10 { int z; c = ? c = 20 z = x>y?x:y; b = ? b = 20 return z; a = ? a = 10 } 主讲教师:四川大学计算机学院 *** 2018/12/29

25 1. 修改Func()函数求三个double数据的平方和。(三个数据通过初始化赋值)
练习: 1. 修改Func()函数求三个double数据的平方和。(三个数据通过初始化赋值) double Func(double x, double y, double z)s2_3_1.c 2. 修改Func()求三个int数据的均方差。 每个数据与均值差的平方和再开平方根 S2_3_2.c 库函数double sqrt(double),包含在math.h头文件中 3. 求三个int数据或者三个double数据的最大值或最小值? S2_3_3.c(printf的位置变化) 4. main()函数中的数据全部键盘输入,如何修改程序?注:各输入项必须通过&取变量的地址。 均方差:每个数据与均值的平方和再开平方根。平方根函数的头文件:math.h; 函数功能: 计算一个非负实数的平方根; 函数原型:double sqrt(double); 主讲教师:四川大学计算机学院 *** 2018/12/29

26 练习: 5. 请修改Func()函数,求你想要的任何表达式的值,并上机实现它。并对照你的理论计算结果和计算机实际运行结果,看看是否有差异,如果有差异,请找出导致差异的原因。 主讲教师:四川大学计算机学院 *** 2018/12/29

27 2.2 相关语法 后面的部分可讲、也可自学。 建议自学,多上机演示程序。 主讲教师:四川大学计算机学院 *** 2018/12/29

28 数据类型是重要关键 数据类型是C语言的核心概念。 它隐含数据的编码规则和字节大小。 基本数据类型包括: 2.2.1数据类型
整型(short、int、long、long long)、 字符型(char)、 浮点型(float、double、long double)、 枚举型(enum)等 数据类型是重要关键 主讲教师:四川大学计算机学院 *** 2018/12/29

29 C语言数据类型图 (C99) 主讲教师:四川大学计算机学院 *** 2018/12/29

30 主讲教师:四川大学计算机学院 *** 单精度实型 float 双精度实型 double *长双精度 long double 8 (一般10)
类型名 类型关键字 存储空间 典型字节数 最小取值范围 无符号字符型 unsigned char 1 0~255 字符型 signed char -128~127 char C标准并未规定其是否带符号 无符号整型 unsigned int 2或4 0~65535或0 ~ 4,294,967,295 整型 [signed] int -32768~32767或 -2,147,483,648 ~ 2,147,483,647 无符号短整型 unsigned short [int] 2 0~65535 短整型 [signed] short [int] -32768~32767 无符号长整型 unsigned long [int] 4 0 ~ 4,294,967,295 有符号长整型 [signed] long [int] 长长整型 [signed] long long [int] 8 -263 ~ (C99新添加) 无符号长长整型 unsigned long long [int] 0 ~ (C99新添加) 单精度实型 float C标准:整数部分1.0E E+37, (6位精度); IEEE754实际达到3.4E-38~3.4E+38 ,(7-8位精度) 双精度实型 double C标准:整数部分1.0E E+37, (10位精度); IEEE754实际达到1.7E-308 ~ 1.7E+308,(15-16位精度) *长双精度 long double 8 (一般10) C标准规定它至少不能低于double类型的精度。 主讲教师:四川大学计算机学院 *** 2018/12/29

31 1. 整型数据修饰符short、long、long 2. 可用signed、unsigned修饰,int可省
3. 可以用10进制,16(0X、0x开头)进制,8进制(0开头)表示。 17表示十进制整型17。 017表示8进制整型15。 0X17表示16进制整数23。 主讲教师:四川大学计算机学院 *** 2018/12/29

32 常数直接以数字、字符或字符串的形式出现在程序中。 常数没名字、没有数据空间。不可用&取其地址。
2.2.2 常数 本讲义对常数和常量做以下区分: 常数直接以数字、字符或字符串的形式出现在程序中。 常数没名字、没有数据空间。不可用&取其地址。 常量在本质上还是一个变量,只是因为const的限制在程序运行过程中其值始终保持不变。 常量有名字、有数据空间、可以用&取其地址。 主讲教师:四川大学计算机学院 *** 2018/12/29

33 1.字符常数 单字节字符常数 :‘0’ 、‘A’ 、’a’ 多字节字符常数和宽字符常数:
转义字符 :‘\n’ 、‘\0’ 、'\x41'、'\101' 字符常量’0’的值为48,表示0这个字符;而‘\0’值为0,表示空字符 多字节字符常数和宽字符常数: 多字节字符包含了1个或者多个字符,比如UTF-8 :'ab' 宽字符所占空间大小都一样,wchar_t :L'A' ‘\101’ 与’\0101’值相同,表示八进制数 1、在所有字符集中,最知名的可能要数被称为ASCII的7位字符集了。它是美国标准信息交换代码(American Standard Code for Information Interchange)的缩写, 为美国英语通信所设计 2、但是,由于他是针对英语设计的,当处理带有音调标号(形如汉语的拼音)的亚洲文字时就会出现问题。因此,创建出了一些包括255个字符的由ASCII扩展的字符集。其中有一种通常被称为IBM字符集,它把值为 之间的字符用于画图和画线,以及一些特殊的欧洲字符。另一种8位字符集是ISO Latin 1,也简称为ISOLatin-1。它把位于 之间的字符用于拉丁字母表中特殊语言字符的编码,也因此而得名 3、亚洲和非洲语言并不能被8位字符集所支持。仅汉语字母表(或pictograms)就有80000以上个字符。但是把汉语、日语和越南语的一些相似的字符结合起来,在不同的语言里,使不同的字符代表不同的字,这样只用2个字节就可以编码地球上几乎所有地区的文字。因此,创建了UNICODE编码。 4、对可以用ASCII表示的字符使用UNICODE并不高效,因为UNICODE比ASCII占用大一倍的空间,而对ASCII来说高字节的0对他毫无用处。为了解决这个问题,就出现了一些中间格式的字符集,他们被称为通用转换格式,即UTF(Unicode Transformation Format)。常见的UTF格式有:UTF-7, UTF-7.5, UTF-8,UTF-16, 以及 UTF-32。 5、char是8位字符类型,最多只能包含256种字符,许多外文字符集所含的字符数目超过256个,char型无法表示。wchar_t数据类型一般为16位或32位,但不同的C或C++库有不同的规定,如GNU Libc规定wchar_t为32位,总之,wchar_t所能表示的字符数远超char型。标准C++中的wprintf()函数以及iostream类库中的类和对象能提供wchar_t宽字符类型的相关操作。 主讲教师:四川大学计算机学院 *** 2018/12/29

34 字符数据和整形数据的存储形式相同,两者可以通用:
char c=‘a’; char c=97; printf(“%c”,c); printf(“%d”,c);

35 主讲教师:四川大学计算机学院 *** 转义字符 转义字符的意义 ASCII代码 \a 鸣铃 7 \b 退格 8 \t 横向跳到下一制表位置
9 \n 回车换行 10 \v 纵向跳到下一制表位置 11 \f 走纸换页 12 \r 回车不换行 13 \” 双引号符 34 \' 单引号符 39 \? 问号标记 63 \\ 反斜线符"\" 92 \ddd 1~3位八进制数所代表的字符  比如:\101 \xhh 1~2位十六进制数所代表的字符  比如:\x41 主讲教师:四川大学计算机学院 *** 2018/12/29

36 2. 整型常数:1234L、1UL 3. 实型常数:123.4 、1e-2 4.字符串常数 :”ABC”
"I am student of sichuan university." "" “想加入优秀社团吗?在易书桥上优秀社团任你挑." 字符串常数以’\0’作为结尾。 主讲教师:四川大学计算机学院 *** 2018/12/29

37 012、0101;01A7(对吗?) 以0(零)开头的整型常量是八进制表示。 以0x或者0X开头的整型常量是十六进制表示。
比如:十进制30可以表示为0x1e或者0X1E( 十六进制)。 其余的为10进制常量。 比如:123、345等 012、0101;01A7(对吗?) 主讲教师:四川大学计算机学院 吴琼 2018/12/29

38 首地址 X、F、U、L分别表示什么意思? 图3.2 整型常量0XFUL在内存中的表示 主讲教师:四川大学计算机学院 吴琼
主讲教师:四川大学计算机学院 吴琼 2018/12/29

39 浮点常量自动是double型 浮点型变量也是吗?
浮点型常量包含了一个小数点( 比如:123.4)或者一个指数( 比如:1e-2)或者既包含小数点又包含指数( 1.2e-3)。有两种变现形式: 十进制小数形式;123.4 规范化的指数形式;1.234e2, e前必须有数字,后面必须是整数 无论何种变现形式,内存中均按指数形式存储 没有后缀的浮点型常量都是double类型。 实型常量占据4(单精度)、8(双精度)、10(长双精度)个字节,存放规则见第一章内容 可用sizeof(类型名)或sizeof(变量名)查询字节数 浮点常量自动是double型 浮点型变量也是吗? 主讲教师:四川大学计算机学院 吴琼 2018/12/29

40 float r; r=0.008; 编译器提示error,修改如下: double r; 或r=0.008f

41 常数位于程序存储区,没有名字, 不在数据区分配存储空间 \0的作用? 主讲教师:四川大学计算机学院 *** 2018/12/29

42 含义丰富呀! 变量就是其值可变的量 :有数据类型、有名字、有存储空间、一般有值。 变量必须先定义才能使用。 变量定义:
2.2.3 变量和标识符 变量就是其值可变的量 :有数据类型、有名字、有存储空间、一般有值。 变量必须先定义才能使用。 变量定义: char ch; unsigned char ch2; signed char ch3; short sC; int a, b, c; long lC; float fCount; double dCount; 含义丰富呀! 主讲教师:四川大学计算机学院 *** 2018/12/29

43 关键字 auto break case char const continue default do double else enum
extern float for goto if int long register return short signed static sizof struct switch typedef union unsigned void volatile while restrict inline _Imaginary _Complex _Bool 主讲教师:四川大学计算机学院 *** 2018/12/29

44 变量可读可写; 单纯定义变量就只能写。 变量初始化:定义变量的同时给变量赋初值 char ch = '\n'; int i = 0;
int j = i; int iCount = 100+1; float f = 1.19e-5; 变量可读可写; 单纯定义变量就只能写。 主讲教师:四川大学计算机学院 *** 2018/12/29

45 使用const定义常量(真常量) : 标识符命名: #define PI 3.14115 PI只是一个符号常数
const double PI = ; 标识符命名: 字母、下划线打头,可包含数字。 比如: 合法标识符:A、A1、_A1 非法标识符:1A、#A、int等。 命名习惯: 尽量不要用下划线作标识符的首字母 见名知意. #define PI PI只是一个符号常数 主讲教师:四川大学计算机学院 *** 2018/12/29

46 变量的存储类型及其初始值 : static(静态型变量)、 register(寄存器型变量)、 auto(自动型变量)、
extern(外部型变量)。 主讲教师:四川大学计算机学院 *** 2018/12/29

47 extern型:只是一个声明一般不分配存储空间。 static int a, b, sD=0;
register型:寄存器中。 auto型:堆栈中。 register和auto都随函数而生、随函数而死。 extern型:只是一个声明一般不分配存储空间。 static int a, b, sD=0; 主讲教师:四川大学计算机学院 *** 2018/12/29

48 有求值顺序的&&、||、,、?: 2.2.4 运算符和表达式 运算符是代表C语言运算法则的符号,比如+、-、*、/等。
表达式是由运算符连接常数、变量、函数和其他表达式所组成的式子。 表达式的值就是该表达式运算的最终结果值。 表达式求值按运算符的优先级、结合性和求值顺序进行。比如: a+b*c 有求值顺序的运算符包括:&&、||、,、?: 有求值顺序的&&、||、,、?: 主讲教师:四川大学计算机学院 *** 2018/12/29

49 主讲教师:四川大学计算机学院 *** 2018/12/29 运算符分类 运算符类别 运算符 说明 优先级和结合性 基本表达式 优先级提升
(Primary expressions) (),是指圆括号包围的表达式,主要用于运算符之间。 1 后缀表达式 数组下标运算 postfix-expression [expression] [],数组元素的下标。 2 函数调用 postfix-expression ( argument-expression-list) (),函数调用,括号内的参数可选。 成员访问 postfix-expression. identifier .,结构型或共用型成员,.号之前应为变量。 postfix-expression -> identifier ->,结构型或共用型成员,->号之前应为指针。 后缀自增 postfix-expression ++ 后缀自增1 2(右) 后缀自减 postfix-expression -- 后缀自减1 初始化列表 (type-name) { initializer-list } int a = 5; 复合初始化 int* a = (int[]) { 1, 2, 3 }; 等价于:(unamed表示不可见变量名) int unamed[] = {1, 2, 3}; int* a = unamed; 单目/一元运算符 前缀自增 ++ unary-expression 前缀自增1 3(右) 前缀自减 -- unary-expression 前缀自减1 取地址 &,unary-operator cast-expression 取变量所在存储单元的首地址 取值 *,unary-operator cast-expression 提取指针所指变量的内容 取正 +,unary-operator cast-expression 取正值 取负 -,unary-operator cast-expression 取负值 按位取反 ~,unary-operator cast-expression 位非 逻辑非 !,unary-operator cast-expression 求变量长度 sizeof unary-expression 求变量的字节数; int a; sizeof a; 求变量类型长度 sizeof ( type-name ) 求数据类型的字节数sizeof (int) 强制类型表达式 强制类型转换表达式 (type-name) cast-expression 类型强制转换 4 主讲教师:四川大学计算机学院 *** 2018/12/29

50 主讲教师:四川大学计算机学院 *** 2018/12/29 乘法表达式 *、/、% “ * ” 乘法运算符; “ / ”除法运算符;
“ % ” 取余运算符 5 加法运算符 +、- “ + ”加法运算符; “ - ”减法运算符 6 移位运算符 <<、>> << 左移运算符; >> 右移运算符。 7 关系运算符 <、<=、>、>= <、<=、>、>=关系运算符 8 相等运算符 ==、!= “ == ”等于运算符; “ != ”不等于运算符 9 位与运算符 & “ & ”按位与运算符 10 位异或运算符 ^ “^”按位异或运算符 (Bitwise exclusive OR operator)。 11 位或运算符 | “|”按位或运算符 (Bitwise inclusive OR operator) 12 逻辑与运算符 && “&&”逻辑与运算符。 13 逻辑或运算符 || “ || ”逻辑或运算符。 14 三元条件运算符 ? : ? :条件运算符。 15(右) 赋值运算符 =、 +=、 -=、 *=、 /=、 %=、 &=、 ^=、 |=、 <<=、 >>= =赋值运算符、 +=加赋值、 -=加赋值、 *=剩赋值、 /=除赋值、 %=取余赋值、 &=位与赋值、 ^=按位亦或赋值、 |=按位或赋值、 <<=位左移赋值、 >>=位右移赋值。 16(右) 逗号运算符 , “,”逗号运算符,称为逗号运算符(Comma Operator),可以把两个以上(含两个)的表达式连接成一个表达式:子表达式1, 子表达式2, ..., 子表达式n 17 主讲教师:四川大学计算机学院 *** 2018/12/29

51 几种典型的基本数据类型 char 1字节 字符型 0~127或者0~255 short 2字节 短整型 -32768~+32767 long
在典型系统中占据的字节数 意义 C标准规定的最小取值范围 char 1字节 字符型 0~127或者0~255 short 2字节 短整型 -32768~+32767 long 4字节 长整型 -231~231-1 前面已经谈到:在C89标准中,变量的定义必须集中在函数或者语句块( 语句“块”就是用一对大括弧括起来的多个语句)的最前面,且需要在所有的可执行语句之前;但是在C语言最新标准C99中,没有此要求,可以在语句可以出现的任何地方定义变量。 另外,计算机类学生应该了解:C语言标准并未规定short、int、long的具体长度,但要求short<=int<=long,且规定了每一种类型的最短长度,比如int>=16位。所以当大家遇到一个int既不是16位也不是32位时请不要吃惊。 float 4字节 浮点型 1E–37 ~ 1E+37 ,6位精度 double 8字节 双精度浮点型 1E–37 ~ 1E+37 ,10位精度 主讲教师:四川大学计算机学院 *** 2018/12/29

52 1. 优先级提升(Primary expressions) (),是指圆括号包围的表达式,主要用于运算符之间。
基本表达式: 1. 优先级提升(Primary expressions) (),是指圆括号包围的表达式,主要用于运算符之间。 主讲教师:四川大学计算机学院 *** 2018/12/29

53 数组下标运算postfix-expression [expression],[],数组元素的下标。
2. 后缀表达式: 数组下标运算postfix-expression [expression],[],数组元素的下标。 函数调用postfix-expression ( argument-expression-list),(),函数调用,括号内的参数可选。 成员访问postfix-expression. Identifier,.结构型或共用型成员,.号之前应为变量。 成员访问postfix-expression -> identifier,->结构型或共用型成员,->号之前应为指针。 后缀自增postfix-expression ++,后缀自增1 (右结合) 后缀自减postfix-expression --,后缀自减1 (右结合) 初始化列表(type-name) { initializer-list },int a = 5; 复合初始化(type-name) { initializer-list ,} int* a = (int[]) { 1, 2, 3 }; 等价于:(unnamed表示不可见变量名) int unnamed[] = {1, 2, 3}; int* a = unnamed; 主讲教师:四川大学计算机学院 *** 2018/12/29

54 3. 单目/一元运算符: 假定有int a = 2; (全部右结合) 前缀自增++ unary-expression,前缀自增1, ++a;
取地址&,unary-operator cast-expression,取变量所在存储单元的首地址, &a; 取值*,unary-operator cast-expression,提取指针所指变量的内容,*a; 取正+,unary-operator cast-expression,取正值,+a; 取负-,unary-operator cast-expression,取负值,-a; 按位取反~,unary-operator cast-expression,位非,~a; 逻辑非!,unary-operator cast-expression,逻辑非, !a; 求变量长度sizeof unary-expression,求变量的字节数; sizeof a; 求变量类型长度sizeof ( type-name )求数据类型的字节数sizeof (int)。 主讲教师:四川大学计算机学院 *** 2018/12/29

55 (type-name) cast-expression
4.强制类型表达式: 强制类型转换表达式 (type-name) cast-expression 比如: (short) a; 主讲教师:四川大学计算机学院 *** 2018/12/29

56 与运算符*优先级相同。 5. 乘法表达式: 乘法表达式*、/、% “ * ” 乘法运算符; “ / ”除法运算符; “ % ” 取余运算符
主讲教师:四川大学计算机学院 *** 2018/12/29

57 与运算符+ 优先级相同。 6. 加法运算符: 加法运算符+、- 7. 移位运算符: 移位运算符<<、>>
“ + ”加法运算符; “ - ”减法运算符 7. 移位运算符: 移位运算符<<、>> << 左移运算符; >> 右移运算符。 与运算符+ 优先级相同。 主讲教师:四川大学计算机学院 *** 2018/12/29

58 与运算符+ 优先级相同。 8. 关系运算符: 关系运算符<、<=、>、>= 9. 相等运算符: 相等运算符==、!=
<、<=、>、>=关系运算符 9. 相等运算符: 相等运算符==、!= “ == ”等于运算符; “ != ”不等于运算符 与运算符+ 优先级相同。 主讲教师:四川大学计算机学院 *** 2018/12/29

59 11. 位与运算符: 12. 异或运算符: 13. 位或运算符: 位与运算符&,“ & ”按位与运算符位
位异或运算符^,“^”按位异或运算符(Bitwise exclusive OR operator)。 13. 位或运算符: 位或运算符|,“|”按位或运算符(Bitwise inclusive OR operator) 主讲教师:四川大学计算机学院 *** 2018/12/29

60 13. 逻辑与运算符: 14. 逻辑或运算符: 15. 三元条件运算符:(右结合) 逻辑与运算符&&,“&&”逻辑与运算符。
逻辑或运算符||,“ || ”逻辑或运算符。 15. 三元条件运算符:(右结合) 三元条件运算符? :,? :条件运算符。 主讲教师:四川大学计算机学院 *** 2018/12/29

61 赋值和复合赋值运算符 16. 赋值运算符:(右结合)
赋值运算符=、 +=、 -=、 *=、 /=、 %=、 &=、 ^=、 |=、 <<=、 >>= =赋值运算符、 +=加赋值、 -=加赋值、 *=剩赋值、 /=除赋值、 %=取余赋值、 &=位与赋值、 ^=按位亦或赋值、|=按位或赋值、 <<=位左移赋值、>>=位右移赋值。 赋值和复合赋值运算符 比如: int a=1; a+=5; 主讲教师:四川大学计算机学院 *** 2018/12/29

62 “,”逗号运算符,称为逗号运算符(Comma Operator),可以把两个以上(含两个)的表达式连接成一个表达式:
17.逗号运算符: 逗号运算符,有求值顺序,从左至右 “,”逗号运算符,称为逗号运算符(Comma Operator),可以把两个以上(含两个)的表达式连接成一个表达式: 子表达式1, 子表达式2, ..., 子表达式n 表达式的值为第一个表达式的值 比如:a=1,b=2,c=3,d=4,e=5; 主讲教师:四川大学计算机学院 *** 2018/12/29

63 基准点? C语言中具有右结合性的运算符包括所有单目运算符(含后缀++和后缀--)、赋值运算符和条件运算符 。 判断表达式计算顺序时:
先按优先级高的先计算,优先级低的后计算, 当优先级相同时再按结合性,或从左至右顺序计算,或从右至左顺序计算。 左、右结合的基准点是两个同优先级的运算符相互为基准。左结合是位于左边(前面)的运算符先结合先运算,右结合则是位于右边(后面)的运算符先结合先运算。 基准点? 主讲教师:四川大学计算机学院 *** 2018/12/29

64 #include <stdio.h> int main(void) { int i=0,j=0,k=0;
k=++i,j=i++,j+++i; //k=1,j=2,i=2 // 赋值符号 =优先级高于逗号 , // k=(++i,j=i++,j+++i); //k=3,i=2,j=2 // 逗号 , 表达式的值为最后一个表达式的值 printf("i=%d,j=%d,k=%d\n",i,j,k); return 0;} 主讲教师:四川大学计算机学院 *** 2018/12/29

65 错? int x=2, y=3, z=4; y=x*z++; ++z++; ++(z++) ; 上述2表达式是否正确?错在哪里?
练习: int x=2, y=3, z=4; y=x*z++; ++z++; ++(z++) ; 上述2表达式是否正确?错在哪里? 自增自减只能作用于变量而不能作用于表达式 错? 自加,自减只能作用于变量,不能作用于表达式 主讲教师:四川大学计算机学院 *** 2018/12/29

66 选习题集的时候注意别做无用功 几种典型错误表达式: x = F1( i ) + F2( i++ );
printf("%d, %d\n", ++n, n); a[i] = i++; 选习题集的时候注意别做无用功 主讲教师:四川大学计算机学院 *** 2018/12/29

67 short (i) 低类型实际上是表示数的范围比较窄的类型, 高类型实际上就是表示数的范围比较宽的类型。 低->高,不会丢失数据
2.2.5 类型转换规则 低类型实际上是表示数的范围比较窄的类型, 高类型实际上就是表示数的范围比较宽的类型。 低->高,不会丢失数据 高->低,可能丢失数据,需要强制类型转换,比如: s = (short) i; short (i) 主讲教师:四川大学计算机学院 *** 2018/12/29

68 如果其中一个操作数为long double,则将另一个操作数转换为long double;
否则,如果其中一个操作数为double,则将另一个操作数转换为double; 否则,如果其中一个操作数为float,则将另一个操作数转换为float; 否则,如果其中一个操作数为unsigned long,则将另一个操作数转换为unsigned long; 主讲教师:四川大学计算机学院 *** 2018/12/29

69 否则,如果其中一个操作数为long,则将另一个操作数转换为long;
否则,如果其中一个操作数为unsigned int,则将另一个操作数转换为unsigned int; 否则,如果其中一个操作数为int,则将另一个操作数转换为int(C99则转换为unsigned int); 否则,全部转换为int再参与运算(C99为unsigned int)。 主讲教师:四川大学计算机学院 *** 2018/12/29

70 表达式(-1L > 1UL)是否为真?Why? (-1>1U):同样长度类型数据,有符号数将自动转换为无符号数
思考: 表达式(-1L > 1UL)是否为真?Why? (-1>1U):同样长度类型数据,有符号数将自动转换为无符号数 假设int是16位,并且long是32位,那么-1L < 1U,因为1U是一个unsigned int,将被转换为signed long。 但是-1L > 1UL,因为-1L将被转换为unsigned long,因而出现了一个大的正数。 主讲教师:四川大学计算机学院 *** 2018/12/29

71 2.3 *研究部分 请根据自己的情况自修 主讲教师:四川大学计算机学院 *** 2018/12/29

72 1. 修改例题2.2, 将本书的全部运算符和表达式的运算规则验证一下;
2.4 习题 1. 修改例题2.2, 将本书的全部运算符和表达式的运算规则验证一下; 2. 修改例题2.3,求一个复杂表达式的值,比如:a+b*sqrt(a/b)等等; 3. 输出ASCII表中的所有可打印字符,并记住’0’、’A’、’a’的ASCII码。 主讲教师:四川大学计算机学院 *** 2018/12/29

73 Thanks! The End 主讲教师:四川大学计算机学院 *** 2018/12/29


Download ppt "主讲教师:吴琼 微信群:C语言2016 QQ群: 密码scu2016 昵称:“学号+真名”"

Similar presentations


Ads by Google