《C语言程序设计》一 2.3 运算符和表达式

简介: 本节书摘来自华章出版社《C语言程序设计》一 书中的第2章,第2.3节,作者:赵宏 陈旭东 马迪芳,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

2.3 运算符和表达式

在前面的例子程序中已经多次用到基本的运算。运算符是表示某种操作的符号,操作的对象叫操作数,用运算符把操作数连接起来形成一个有意义的式子叫表达式。C语言为了加强对数据的表达、处理和操作能力,提供了大量的运算符和丰富的表达式类型,其中最常用的是算术运算符和赋值运算符。

2.3.1 算术运算符与算术表达式

算术运算符分为一元算术运算符和二元算术运算符两类,一元算术运算符只需要一个操作数,放在运算符的后面,二元算术运算符需要两个操作数,操作数写在运算符两边。
1.C语言提供的算术运算符
C语言提供了如下算术运算符:
+(正号、加法运算符)
–(负号、减法运算符)
*(乘法运算符)
/(除法运算符)
%(求余运算符)
两个整数相除结果还是整数,如8/3结果为2。如果参加运算的两个数中有一个是实型,则结果为double型。
求余运算符要求%两侧都是整型数据,表达式x%y的结果为两数相除后的余数,如果x能被y整除,则结果为零。求余运算符不能应用到float型或double型。
2.算术表达式的计算
用算术运算符把常量、变量、函数等运算对象连接起来,称为算术表达式,如a+b*c-2+‘a’是一个合法的算术表达式,表达式的结果为一个算术值。运算符都有优先级和结合性,因此在求表达式的值时,要按照优先级的高低依次计算,如果一个运算量两侧运算符优先级相同,则按规定的结合方向进行。
算术运算符的优先级与代数中相同,即先乘除,后加减,结合性是从左到右,如当表达式中有多个加法或减法,则按从左到右的顺序求值。算术运算符的优先级见表2-3。
image

编写程序时,应能将代数表达式用正确的算术表达式表示出来。例如:
1)求三个数的算术平均值:
image

这里必须使用括号改变运算的次序,如果不使用括号,根据运算符的优先级a + b + c/3的计算结果为a+b+。
2)根据三角形三边计算三角形面积:
image

表达式中使用开平方根函数sqrt(),使用函数时后面必须使用一对括号,把所有参数括进去,括号可以嵌套,但要保证配对正确。
3)根据半径计算圆的周长:
代数表达式:s=2πr
算术表达式:s=23.14159r
表达式中使用了常量π,但是π不是C/C++字符集中的字符,因此用3.141 59表示。

2.3.2 赋值运算符与赋值表达式

C语言中“=”就是赋值运算符,它的作用是将一个数据赋给一个变量。
1.简单的赋值运算符
简单赋值就是把一个表达式的值赋给一个变量,格式为:

变量名 = 表达式

例如:

i = 1                    /*将数值1赋给变量i*/
count = count + 1        /*计算count+1的值并赋给变量count*/
sum = i1 + i2            /*计算i1+i2的值并赋给变量sum*/

2.复合的赋值运算符
算术运算符与“=”结合在一起,形成复合的赋值运算符。例如:

i += 2等价于i = i + 2
a %= 3等价于a = a % 3
a * = b + 5等价于a = a *(b + 5)

对于复杂表达式,例如:

yyval[yypv[p1+p2] + yypv[p3+p4]] += 2

使用复合的赋值运算符简化了程序,使程序很容易理解,因为读者不必检查两个长表达式是否一致。赋值运算符也有利于编译,产生高质量的目标程序。
3.赋值表达式的计算
对赋值表达式求解的过程是:将赋值运算符右侧的表达式的值赋给左侧的变量。赋值表达式的值就是被赋值的变量的值。例如“x = 3”这个赋值表达式的值为3,而变量x的值也是3。
赋值运算符按照“自右向左”的结合顺序,如赋值表达式“a = b = 8”的计算顺序是:
1)首先计算“b = 8”的值,它的值等于8。
2)再计算“a = 8”,即a的值等于8,整个赋值表达式的值也等于8。
又比如,如果a的初值为6,赋值表达式“a += a-= a *= a”的求解步骤为:
1)先进行“a = a”的运算,它相当于a=aa=6*6=36。
2)再进行“a -= 36”的运算,它相当于a=a-36=36-36=0。
3)最后进行“a += 0” 运算,它相当于a=a+0=0+0=0。

2.3.3 数据类型的转换

当运算符两侧操作数的数据类型不同时,它们会按照提升规则自动进行类型转换,使二者具有同一类型,然后再进行运算。转换的规则见图2-2。
图2-2中横向向左的箭头表示必定的转换,如字符型(char)数据和短整型(short)必定先转换成整型(int),单精度浮点型(float)必定先转换为双精度浮点型(double),以提高运算精度。
图2-2中纵向的箭头表示当运算符两侧操作数的数据类型不同时自动转换的方向。数据总是由低级别向高级别转换,例如,一个int型数据与一个double型数据进行运算,则先将int型直接转换为double型,然后在两个同类型(double)数据之间进行运算;如果一个int型与一个long型数据进行运算,则将int型转换为long型再进行运算。
在进行赋值运算时也发生类型转换,右侧的值转换为左侧的值。例如,x为float型,i为int型,当进行x=i和i=x赋值操作时会引起类型转换。转换是按如下规则进行的:
1)char型转换为int型时没有变化。
2)long型转换为short型或char型时,截掉多余的高位信息。
3)float、double型转换为int型时,小数部分会被截掉。
在任何表达式中都可以强制类型转换。其形式为:

(类型名)表达式

例如,库函数sqrt()需要一个double型的参数,如果n是一个整型数,我们可以使用sqrt((double)n) 把n的值转换为double型。注意,在强制类型转换时,得到了一个所需类型的中间变量,原来变量n的类型并未发生变化。例如,有程序片段:

float x;  int i;
x = 3.6;
i = (int)x;
printf("x=%f,i=%d\n", x , i);

运行结果如下:

x=3.600000, i=3

x的类型仍为float型,值仍等于3.6。
总之,在程序设计中,表达式的应用应注意两点,首先是考虑如何将代数式表示成正确的表达式,其次是考虑运算符的优先级、结合性及参与运算的数据类型的逐步转换问题。

相关文章
|
28天前
|
存储 C语言 C++
【c语言】运算符汇总(万字解析)
今天博主跟大家分享了c语言中各种操作符的功能、使用方法以及优先级和结合性,并且与大家深入探讨了表达式求值的两个重要规则--算数转换和整形提升。学习这些知识对我们的C语言和C++学习都有着极大的帮助。
106 2
|
24天前
|
C语言
【C语言】条件运算符详解 - 《 A ? B : C 》
条件运算符(也称为三元运算符)是C语言中唯一的三元运算符。它通常用于替代简单的 `if-else` 语句。
77 6
|
3月前
|
C语言
C语言判断和运算符联系
在 C 语言中,判断与运算符紧密相关,主要体现在条件表达式的使用上。
205 87
|
3月前
|
安全 C语言
C语言运算符的使用注意点
在C语言中,正确使用运算符能提升代码的可读性和效率。本文介绍了八大注意事项:运算符优先级和结合性影响运算顺序;自增/自减运算符分前缀和后缀形式;逻辑运算符有短路特性;位运算符直接操作二进制位需谨慎;条件运算符简洁但避免复杂嵌套;类型转换避免意外结果;使用括号明确运算顺序。掌握这些要点有助于编写更安全高效的代码。
216 72
|
1月前
|
C语言
c语言运算符
C的运算符有以下几种: 算术运算符:+、-、*、/、% 结合方向自左向右 关系运算符:>、<、==、>=、<=、!= 逻辑运算符:!、&&、|| 位运算符<<、>>、~、|、^、& 赋值运算符:=及符号扩展赋值运算符(+=、-=、*=、/=) 条件运算符:? : 逗号运算符:, 指针运算符:*、& 求字节运算符:sizeof 强制类型转换运算符:((类型)) 分量运算符:.、-> 下标运算符:[]
40 4
|
2月前
|
存储 Java C语言
【一步一步了解Java系列】:了解Java与C语言的运算符的“大同小异”
【一步一步了解Java系列】:了解Java与C语言的运算符的“大同小异”
46 3
|
2月前
|
C语言
C语言条件运算符详解
C语言条件运算符,也称为三元运算符,是一种简化if-else语句的表达式,形式为:条件?表达式1:表达式2。当条件为真时,计算并返回表达式1的值;否则计算并返回表达式2的值。它可用于快速实现简单的条件分支逻辑。
|
3月前
|
安全 C语言
在C语言中,正确使用运算符能提升代码的可读性和效率
在C语言中,运算符的使用需要注意优先级、结合性、自增自减的形式、逻辑运算的短路特性、位运算的类型、条件运算的可读性、类型转换以及使用括号来明确运算顺序。掌握这些注意事项可以帮助编写出更安全和高效的代码。
62 4
|
3月前
|
程序员 C语言
【C语言基础考研向】06运算符与表达式
本文介绍了C语言中的运算符分类、算术运算符及表达式、关系运算符与表达式以及运算符优先级等内容。首先概述了13种运算符类型,接着详细说明了算术运算符的优先级与使用规则,以及关系运算符和表达式的真假值表示,并给出了C语言运算符优先级表。最后附有课后习题帮助巩固理解。
117 10
|
3月前
|
存储 编译器 C语言
【C语言基础考研向】07逻辑运算符与赋值运算符
本文介绍了C语言中的逻辑运算符与逻辑表达式、赋值运算符以及求字节运算符`sizeof`。逻辑运算符包括`!`(逻辑非)、`&&`(逻辑与)和`||`(逻辑或),其优先级规则与数学运算符类似。通过示例展示了如何用这些运算符判断闰年及逻辑非的运算方向。此外,文章还解释了左值与右值的概念及其在赋值运算中的应用,并介绍了复合赋值运算符的使用方法,如加后赋值`+=`和乘后赋值`*=`。最后,通过`sizeof`运算符示例展示了如何获取变量的字节大小。