c语言如何求一个数学表达式的值,浅谈C语言中表达式的求值

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

C语言研究性学习的路线

现行的多数C语言教材有太多的误区,不仅不能给读者提供有效的学习线索,还常常“误导”读者,于是,“死记硬背”便成了学习C语言的唯一选择。本文

以拙作《新编C语言程序设计教程》(清华大学出版社出版,配套视频zeq126.56.com)为基础,探讨了C语言的研究性学习。

二、 表达式的求值

(一)基础知识

在后面加一个分号(;),C语言表达式就变成了C语句,此时计算机执行C语句的过程就是对表达式求值的过程,因此表达式求值实际上模拟了计算机的计算。

C语言表达式的重要特征是每个表达式都有一个确定的值及类型。求值时需根据操作符的优先级和结合性来确定运算顺序。能否顺利地求出表达式的值可作为判断C语言表达式是否合法的依据。

从表3-1可知,C语言操作符的种类繁多,但是数学上常见的一些运算在C语言中却并没有相关的操作符,如求平方根、求绝对值、幂运算等,不过C语言提

供了相应功能的库函数,如sqrt函数、fabs函数、pow函数等。与printf函数类似,使用这些库函数需要在程序中包含math.h头文件

(#include )。

重点:

1. 每个表达式都有一个确定的值。

2. 利用数学库函数写出常见的数学式子。

3. 查表根据优先级和结合性利用加括号的方式确定复杂的表达式的求值顺序,如3+5*2为(3+(5*2));i=j=k=23为(i=(j=(k=23)))。

(二)赋值表达式

赋值操作符的优先级倒数第二,右结合。

重点:

1. 赋值操作符“=”读作“赋值为”。

2. i=i+1;i=j;的执行过程。

3. 如何判断表达式i=j=k=23的合法性。

4. 理解复合赋值操作符的本质,如i*=a+b;。

难点:

类型不匹配时的赋值操作。

1. 整型之间相互赋值

1.1 编码长度相同,但有无符号数和有符号数的区别,如unsigned

short型和short型,此时只是简单地把被赋值变量的状态设置成赋值变量的存储状态。赋值后两者的值通常不同,如有unsigned uh;

short h=-1; ,则uh=h;后uh的值为65535。

1.2 编码长度不同,如long型与short型或unsigned

short型。以a=b为例,又分两种情况。当b的编码长度小于a时,赋值原则为赋值后两者的值相同。如有long l; unsigned short

uh=65535; short

h=-1;则l=uh后,l的值为65535;而l=h后,l的值为-1。由练习2.6可知,编码长度增加而值不变时编码的变化规律。当b的编码长度大于

a时,赋值操作只能使a的状态与b的部分字节状态一致,舍弃了b中高位的状态,赋值后两者的值通常不同。

2. 整型与浮点型之间的相互赋值

整数可以看作是小数部分为0的浮点数,而浮点型变量向整型变量赋值时会舍弃小数部分。

注意:

1. 编程时尽量使用安全的赋值操作。(赋值后两者的值相等)

2. 应理解类型不匹配时的赋值原则。

(三)算术表达式

C语言中算术操作符的优先级和结合性虽然和数学上的一致。但由于计算机中不同类型数据的编码格式不同,当类型不同的操作数混合运算时,得出与计算机一致的结果也并非易事。

先讨论整型间的算术运算。

表达式求值通常在运算器中进行,而运算器中专用存储单元的长度是固定的,因此,整型间运算时,当操作数的编码长度“不够”长时会被自动扩充成相应的长度。需注意两点:

1. 短变长是安全的“赋值操作”。

2. C语言中这个长度是“逻辑的”,即编译系统中int型的长度,而非计算机的实际长度。int型在TC中是2个字节,在VC6.0中是4个字节。

这也就意味着同样的代码可能可能在TC中不需扩充而直接计算,但在VC6.0中则需要扩充后才能计算。当然,字符型进行算术运算时被看作只有1个字节的整

型,无论如何都会被扩充的。

你可能感兴趣的:(c语言如何求一个数学表达式的值)