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

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

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

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

赋值运算符和赋值表达式

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

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

简单赋值运算符

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

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

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

复合赋值运算符

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

运算符                          应用举例                                     等阶形式

+= a+=x a=a+(x)
-= a-=x a=a-(x)
*= a*=x a=a*(x)
/= a/=x a=a/(x)
%= a%=x a=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
2
3
4
5
6
7
8
9
10
#include<stdio.h>
int main()
{
    int number = 456;
    int a = number / 100; 					/* 计算百位数 */
    int b = (number - a * 100) / 10;				/* 计算十位数 */
    int c = number % 10;					/* 计算个位数 */
    printf("反序数是:%d%d%d\n", c, b, a); 		/* 输出*/
    return 0;
}

运行结果:反序数是:321

逗号运算符和逗号表达式

逗号运算符(,):功能是把多个表达式连接起来组成一个表达式,称为逗号表达式

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

表达式1,表达式2,…,表达式n

  1. 逗号表达式的执行顺序:从左到右依次执行每个表达式
  2. 逗号表达式的值为“表达式n”的值
  3. 逗号运算符是双目运算符,其优先级最低,是左结合的
  4. 并非所有出现逗号的地方都可以作为逗号表达式,如printf("%d%d",&a,&b),其中的 "%d%d",&a,&b 并不是一个逗号表达式,而是printf函数的参数

例:逗号表达式应用示例

1
2
3
4
5
6
7
8
9
#include <stdio.h>
int main() 
{
	int i,j=7;
	float k=5;
	i=(j=j+2,j/k);
	printf("i=%d\n",i);
	return 0;
}

运行结果:i=1

求字节数运算符

sizeof(…):是一个单目运算符,用于计算数据类型所占的字节数,其一般格式为:

  1. sizeof(表达式)或sizeof 表达式
  2. sizeof(数据类型名)

例:不同数据类型字节数示例

1
2
3
4
5
6
7
8
9
10
#include<stdio.h>
int main() 
{
    printf("char类型占%d字节\n",sizeof(char));
    printf("short int类型占%d字节\n",sizeof(short int));
    printf("int类型占%d字节\n",sizeof(int));
    printf("float类型占%d字节\n",sizeof(float));
    printf("double类型占%d字节\n",sizeof(double));
    return 0;
}

运行结果:

  • char类型占1字节
  • short int类型占2字节
  • int类型占4字节
  • float类型占4字节
  • double类型占8字节

例:求字节数运算符示例

1
2
3
4
5
6
7
8
9
#include<stdio.h>
int main()
{
	int a,b;
	a=sizeof(3+5.0);
	b=sizeof 3+5.0;
	printf("%d,%d,%d\n",a,b,sizeof("china"));
	return 0;
}

运行结果:8,9,6

上一篇:2021-10-16


下一篇:二维数组长度、初始化