目录

1.5 运算符和表达式

1.5.1 算术运算符和表达式

1.5.2 赋值运算符和表达式

1.5.3 逗号运算符和表达式

传送门上一节:C语言程序设计-常量与变量

传送门下一节:C语言程序设计-不带参数的主函数、赋值运算符、数据类型


1.5 运算符和表达式

C语言提供了非常丰富的运算符,由这些运算符可组成相应的表达式。请记住,任何C语言表达式都有一个确定的值。本节将介绍算术运算符、赋值运算符及其相应的表达式,而其他运算符和表达式将在后面陆续介绍。

1.5.1 算术运算符和表达式

1、算术运算符

C语言中提供的算术运算符如表1.2所示。

表1.2 算术运算符

从上面例题可以看到,如果+ ,- ,* ,/ 运算符的两侧都是整型,则按整型计算,且运算结果为整型,例如,1/2的结果是0,不是0.5;如果两侧运算量中至少有一个运算量为实型,则先将两个运算量都转化为双精度后计算,且运行结果为双精度型。另外运算符“%”两侧的运算量必须是整型。

使用算术运算符时应注意,在进行+、-、*、/ 算术运算时,系统自动先将数据的类型按一定的规则转换(即统一到同一种数据类型),然后再进行运算,运算结果类型是转换后的类型。图1.9给出了数据类型的转换规则,可根据“垂直降落,向上位移”的原理辅助理解。

图1.9 转换规则

1)垂直降落

如果运算量是char型,则必须先转换成int型,如果运算量是float型,则必须先转换成double型,然后再进行下一步运算。char型的指定地点是位于阶梯最低级的int型,而float型的指定地点是位于阶梯最高级的double型。

2)向上位移

将int型、long型和double型看成是由低到高的3个台阶,如果数据类型相同,也就是处于同一阶层,则系统不进行转换,而直接运算,其运算结果类型是该数据类型。如果数据类型不同,即处于不同阶层,则系统将其中低级别类型的数据统一到高级别类型,然后再运算,而且其运算结果类型是高级别类型。

类型转换通常一步到位。例如,int型或long型与double型进行运算,则先将int型或long型直接转换为double型,然后再对两个double型数据进行运算,其运算结果为double型。再如,int型与long型进行运算时,要先将int型转换为long型,接着再对两个long型数据进行运算,其运算结果为long型。

另外,如果两个运算量是int型和float型,由于系统必须先把float型转换为double型,因此进行运算之前int型也要随之转换为double型,其运算结果也为double型。

2、算术表达式

-2*((a+sqrt(4.0)) -1)是一个算术表达式,其中sqrt(4.0)是利用系统提供的求平方根函数计算4.0的平方根。在C语言中,将由算数运算符、圆括号和运算对象(包括常量、变量、函数等)组成,且符合C语言语法规则的表达式称为算术表达式。算术表达式的计算结果是一个数值

算术表达式的计算示例如表1.3所示。

表1.3 算术表达式的计算

说明:

(1)一个算术表达式可以有多个运算符,因此对算术表达式进行计算时,要注意运算的先后顺序。优先级越小,运算顺序就越在先,其优先级别也就越高。例如,圆括号、加法和乘法运算符优先级的数值分别为1、4、3,因此表达式2+3*5相当于2+(3*5),其结果为17。对于同一优先级的运算符,一定要按其结合方向进行运算,例如,运算符/和*的优先级都是3,结合方向为自左至右,因此表达式12/2*3相当于(12/2)*3,而不是12/(2*3)。

(2)算术表达式中出现的变量必须有确定的值

(3)C语言表达式中不能使用数学中的方括号“[ ]”和花括号“{ }”。C语言只允许使用圆括号,且可以用多层形式。

注:

(1)C语言不提供乘方运算符,因此只能用“ * ”计算乘方的值

(2)在C语言中,不能出现Π,因为它既不是变量,也不是常量,因此改写时根据所需精度用3.14159或3.14等代替。

(3)(a+b)当被除数时圆括号不能省略,例:3.14159*(r*r)/(a+b)。

1.5.2 赋值运算符和表达式

1.赋值运算符

C语言中提供的赋值运算符有=,+=,-=,*=,/=,%=等,其中后5个运算符是符合的赋值运算符(将在1.6.2节介绍)。赋值运算符的结合方向是由右至左。

2.赋值表达式

用赋值运算符把一个变量和一个C语言表达式连接起来的表达式称为赋值表达式。

赋值表达式的一般形式是:

变量=表达式

例如,i=3*2是赋值表达式,其含义是将3和2的乘积6赋给变量i。

说明:

(1)赋值表达式的处理过程是先计算赋值运算符右边表达式的值,然后把该值赋给左边的变量。

(2)赋值表达式左边必须是变量(代表存储单元),右边可以是C语言的任何合法表达式。假设i中的值为3,则i=i*2是合法的赋值表达式,其处理过程是先计算表达式i*2的值(3*2的值为6),然后把6赋给i。

注意:赋值运算符左边变量代表一个存储单元,而右边出现的变量应理解为该变量中的值,其值必须是事先赋予的

(3)赋值表达式的值是赋值运算符左边的变量的值,例如,赋值表达式a=3*2的值为6;当b的值为5时,赋值表达式b=b+2的值为7;当a的值为1,b的值为2时,赋值表达式a=b的值是2,但同样当a的值为1,b的值为2时,b=a的值却为1;表达式y=8的值为8,因此赋值表达式x=(y=8)+1的值为9(即8+1)。

(4)由于赋值运算符的结合方向是自右至左,因此x=y=5等价于x=(y=5)。

(5)在合法的赋值表达式中,如果赋值运算符两边的数据类型不一致,则系统先将右边表达式值的类型自动转换成左边变量的类型,然后再进行赋值。赋值时的转换规则参见1.6.1节。在不同数据类型之间进行赋值处理时,容易产生意想不到的错误。例如,将double型数据赋给float型变量时,由于数值范围不同,容易产生数据溢出现象,因此尽量避免使用这种赋值形式。

数据的类型也可以利用强制类型转换的方法,其一般形式为:

(类型名)(表达式)

【例 1.14】编写一个强制类型转换的程序。

#include<stdio.h>
int main(void)
{int i=0,j=0,k=0;float x=5.8,y=3.7,f=8.56;i=(int)(x+y);   //将x+y的结果9.5(即5.8+3.7)转换成int型j=(int)x+y;     //将从x中取出的值5.8转换成int型后,与y相加k=(int)f%3;printf("i=%d,j=%d,k=%d,x=%f\n",i,j,k,x);    //x中的值还是5.8return 0;
}

运行结果:

i=9,j=8,k=2,x=5.800000

程序说明:

(1)强制类型转换运算符(int)类型名外的一对圆括号不可少,例如,将i=(int)(x+y)写成i=int(x+y)是错误的。

(2)(int)(x+y)和(int)x+y的含义不同,因此不要随意去掉(x+y)中的括号。

(3)(int)x的作用是将从x中取出的值5.8转换成整型5,但没把5存入变量x中(即x中的值没变),也没有将x的类型转换成整型

(4)%为求余运算符,要求两个运算量都是整型,因此f%3是不合法的表达式,但(int)f%3是合法的,因为(int)f的值是整型值8。

1.5.3 逗号运算符和表达式

1.逗号运算符

C语言中提供的逗号运算符是","。逗号运算符的优先级数值为15,是所有运算符中优先级最低的运算符,逗号运算符的结合方向是自左至右

2.逗号表达式

用逗号运算符把C语言表达式连接起来的表达式称为逗号表达式。

【例1.15】编写一个使用逗号表达式的程序。

#include<stdio.h>
int main(void)
{int a=0,b=0,x=0,y=0;a=(x=8,x%5);    //将逗号表达式(x=5,x%5)的值赋给ab=x=8,x%5;  //先将赋值表达式x=8的值赋给b,再求x%5的值。printf("%d,%d,%d\n",a,b,(y=2,y*3));    //输出a,b和表达式(y=2,y*3)的值。return 0;
}

运行结果:

3,8,6

程序说明:

(1)逗号表达式(x=8,x%5)的求解过程是先将8赋给x,再求8%5的值(值为3)。3是此逗号表达式的值。

(2)程序中a=(x=8,x%5)和b=x=8,x%5的作用不同。a=(x=8,x%5)的求解过程是:先求逗号表达式(x=8,x%5)的值,后给a赋值,这是一个赋值表达式。b=x=8,x%5的求解过程是:先将8赋给变量x,再将赋值表达式x=8的值8赋给b,最后求8%5的值(赋值运算符的优先级比逗号运算符高),即先求解第一个表达式,再求解第二个表达式,这是一个逗号表达式。因此在程序中不要随意添加或舍去圆括号。

(3)程序中的有些逗号作为分隔符使用,例如,在最后一条输出语句中a,b,(y=2,y*3)的前两个逗号是分隔符,后一个才是逗号运算符。

    逗号表达式的一般形式为:

        表达式1,表达式2,表达式3,...,表达式n

其求解过程是:从表达式1到表达式n按顺序求值。表达式n的值是逗号表达式的值。


传送门

C语言程序设计-算数运算符、赋值运算符、逗号运算符及表达式相关推荐

  1. c语言程序计算p q真值表,C语言程序设计第2章数据类型﹒运算符和表达式.ppt

    C语言程序设计第2章数据类型﹒运算符和表达式 教学目标 掌握C语言标识符的组成 理解C语言的基本数据类型 掌握变量定义的方法 掌握常用的运算符的使用 掌握混合运算的数据转换方法 2.1 C语言的数据类 ...

  2. c语言程序设计运算符及表达式,c语言程序设计3第3章运算符和表达式

    1.第3章 运算符和表达式,3.1 表 达 式 3.2 运算符及表达式 3.3 运算符优先级和结合性,3.1 表 达 式,C语言的表达式分为基本表达式和复杂表达式. 基本表达式是由以下单项构成的,即: ...

  3. 二进制补码求值用c语言,C语言程序设计第2章数据类型.运算符与表达式.ppt

    C语言程序设计第2章数据类型.运算符与表达式 教学目标 掌握C语言标识符的组成 理解C语言的基本数据类型 掌握变量定义的方法 掌握常用的运算符的使用 掌握混合运算的数据转换方法 2.1 C语言的数据类 ...

  4. python中的逗号运算符_C++ 逗号运算符 | 菜鸟教程

    C++ 逗号运算符 使用逗号运算符是为了把几个表达式放在一起. 整个逗号表达式的值为系列中最后一个表达式的值. 从本质上讲,逗号的作用是将一系列运算按顺序执行. 表达式1, 表达式2 求解过程是:先求 ...

  5. 第2章 C语言的赋值运算符、复合运算符与逗号运算符 (十一)

    文章目录 文档视频讲解链接地址 2.13 赋值运算符与赋值复合运算符 1. 赋值运算符 2. 赋值复合运算符 2.14 逗号运算符 文档视频讲解链接地址 腾讯课堂视频链接 : 13_表达式_复制与复合 ...

  6. C语言——赋值运算符、复合的赋值运算符、自增自减运算符、逗号运算符、条件运算符、goto语句、注释

    目录 一.赋值运算符 二.复合的赋值运算符 三.自增自减运算符 四.逗号运算符 逗号表达式的语法 五.条件运算符 六.goto语句 七.注释 一.赋值运算符 语法: - int a; - a = 5; ...

  7. c语言程序设计运算符及表达式,C语言程序设计3第3章运算符和表达式.ppt

    退出退出 第3章 运算符和表达式 3.1 表 达 式 3.2 运算符及表达式 3.3 运算符优先级和结合性 3.1 表 达 式 C语言的表达式分为基本表达式和复杂表达式. 基本表达式是由以下单项构成的 ...

  8. c语言中逗号自加,计算机二级自加、自减运算符和逗号运算符

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 1.设有定义:int k=0;,以下选项的四个表达式中与其他三个表达式的值不相同的是( ). A.k++ B.k+=1 C.++k D.k+1 参考答案: ...

  9. C语言基础丨运算符之逗号运算符(八)

    在C语言和C++语言中,可以把多个表达式用逗号联接起来(或者说,把这些表分达式用逗号分开),构成一个更大的表达式.其中的逗号称为逗号运算符,所构成的表达式称为逗号表达式.逗号表达式中用逗号分开的表达式 ...

最新文章

  1. 在这个问题上,能看出 Java 工程师的真实水平
  2. IDEA出现import org.junit.Test飘红解决方案
  3. 为什么总说做产品经理的门槛低?
  4. sort()基本用法
  5. 程序员怎样练出倒三角身材
  6. ADO.NET Entity Framework 实体框架映射方案
  7. Docker入门学习四之自己制作Docker镜像
  8. 关于c++的return
  9. ModelSim 2019安装教程
  10. 怎么学计算机制作ppt,怎样制作ppt详细步骤(电脑怎么做ppt新手)
  11. HTML——网页设计基础
  12. H5移动端出生日期插件
  13. 理解本真的REST架构风格
  14. PHP开发的93手赚网手机赚钱任务平台源码
  15. 性价比哪家强?富勒G93S光磁微动鼠标深度评测
  16. Debug 武侠世界
  17. ADC类型和技术指标
  18. 皮肤结构走向运用仿制图章
  19. [CVPR2018](SMALR)Lions and tigers and bears: Capturing non-rigid, 3d, articulated shape from images
  20. 【渝粤教育】21秋期末考试互联网金融10139k2

热门文章

  1. 将地质图(shp文件)叠加到天地图上
  2. nanopi neo2 black 上电使用
  3. 微信缴纳罚款无法连接服务器,为什么我的违章罚款在微信上交不了?原因竟是…...
  4. 牛客网_java选择题
  5. You're a brave boy!
  6. Linux基础第一章:基础知识与基础命令(第三部分)
  7. Cesium平台构建诗词地图故事
  8. 一文读懂无线充电技术(附方案选型及原理分析)
  9. mysql中查询名字第二位为_(12) 查询出名字倒数第二位为S的员工信息。_学小易找答案...
  10. 人工智能还是人工学习