第二章 C语言运算符和表达式

C语言中,运算符和表达式数量之多,在其他高级语言中是很少见的

正是丰富的运算符和表达式使C语言功能十分完善,这也是C语言的特点之一

本文介绍其中的一部分运算符,其他的运算符将陆续在后续各文中讲述

赋值运算符和赋值表达式

赋值运算符有“=”、“+=”、“-=”、“*=”、“/=”和“%=”等

用赋值运算符将运算对象连接而成的表达式称为赋值表达式

简单赋值运算符

将“=”右边表达式的值赋给左边的变量

例如: a=8;、 s=a*2+b;

先计算出右边表达式的值,再赋给左边的变量。如果“=”左右两边类型不同,系统会按照赋值类型转换的原则将右边的类型转换成左边的类型

复合赋值运算符

在简单赋值运算符前面加上算术运算符就构成复合算术赋值运算符,如下表所示:

运算符                          应用举例                                     等阶形式

+=a+=xa=a+(x)
-=a-=xa=a-(x)
*=a*=xa=a*(x)
/=a/=xa=a/(x)
%=a%=xa=a%(x)

赋值表达式

由赋值运算符将一个变量和一个表达式连接起来的式子所组成。一般形式为:变量 = 表达式

下面是赋值表达式的例子:

1
2
3
v=4.0*PI*r*r*r/3.0
a=15+(i=6)
b=(x=3)+(y=4)

而 3=x 和 a+b=4 都是错误的赋值表达式

赋值表达式的执行过程是:

  1. 计算赋值运算符右侧表达式的值;
  2. 将所计算出的值赋给赋值运算符左侧的变量

TIPS:

赋值运算符的左边只能是变量,不能是常量或表达式
赋值表达式的值就是赋值运算符左边变量的值
赋值表达式的右边也可以是一个赋值表达式

如下例题:

例:若有定义“int x=15,a,b;”,则表达式“x%=(a=3)+(b=4)”的值是 ?

答案:

  • x%=(a=3)+(b=4)
  • x%=3+4
  • x%=7
  • x=x%7
  • x=15代入得:
  • x=15%7=1

例:已有声明“int x=15, y; float z=12;”,下列表达式中语法正确的是 。
A.y=x%z
B.y=x+=z*=4
C.y=x/2=z
D.(y=x+3)=z/2

答案:B

算数运算符和算数表达式

基本的算术运算符

运算符+*/%
名称取余

TIPS:

两个整型数据做除法运算时,结果一定是整数
求余运算的结果是两个整型数据相除的余数。求余运算只能用于整型数据的运算
算数运算符两边的数据类型应相同,若不同时,编译系统会先转换为同一数据类型,然后再进行运算

单目运算符

  • - 负号:负数
  • ++ 自增运算符:使变量的值自加1
  • -- 自减运算符:使变量的值自减1

有两种使用形式:

  • 前缀方式:用于变量前面,它是 “先计算,后使用”
  • 后缀方式:用于变量后面,它是 “先使用,后计算”

例:设有定义如下:
#define d 2
int x=5;
float y=3.83;
char c=’d’;
分析以下各表达式使用正确与否:
A.(-x)++
B.y++
C.c++
D.d++

答案:A错 B对 C对 D错

算术运算符的优先级和结合性

  1. 单目运算符的优先级高于双目运算符
  2. 双目算术运算符中*、/、%的优先级高于+、-
  3. 在优先级相同的情况下,按规定的“结合方向”进行处理

算术表达式

  • 算术表达式是由算术运算符、运算对象和括号连接起来的式子
  • 所有的数学表达式均可写成C语言的算术表达式,但是有些数学表达式无法直接用C语言的算术表达式写出,此时需要调用C语言中的数学函数来实现
  • TIPS:

表达式中的乘号不能省略,且表达式中的所有字符均应写在同一行上
在表达式中还可以使用多层圆括号(不能使用中括号[]和花括号{}),但是要注意括号的配对
在数学中,5×6÷4的运算结果与6÷4×5的结果相同,都是 7.5,但是C语言中表达式56/4的结果却与6/45的结果不一样
还需注意 8/(8/10)之类的表达式,因为(8/10)的结果为 0,用0做除数将会出现运算溢出的错误,为了不使 8/10 的结果为 0,应将整型常量改为实型常量8.0/10

举个例子:

例:输入一个三位正整数,输出其反序数

1  #include<stdio.h>
2 int main()
3 {
4 int number = 456;
5 int a = number / 100; %

点赞