笔记整理自哈尔滨工业大学的MOOC课程:C语言程序设计精髓
第二章:运算符和表达式
运算符的分类
表达式
操作数:运算对象(常量、变量、函数)
算数运算符:加(+)、减(-)、乘(*)、除(/)、求余(%)等
除法
* 整数除法 例:11/5=2
* 浮点数除法 例:11.0/5=2.2
求余 例:a%b(也称a对b取模)
* 操作数必须是整数,返回a与b相除后的余数
优先级
* 两类运算符的优先级相同时
*运算符的结合性
左结合——从左向右计算 例:3*4/2
右结合——从右向左计算 例:取两次相反数时:--4即-(-4)
求余运算别的用途
对p求模求余:H(k)=k%p
* 将一个大范围的自然数集合映射到一个只有p个元素的小集合上
例:随机函数rand(),生成一个在0~32767之间的随机数。
如何生成一个指定范围(如1~100)内的随机数?
magic=rand()%100; //0~99
magic=rand()%100+1; //1~100
常见数学函数
使用时,应在程序开头加上#include <math.h>
赋值运算符
如果变量在定义的时候没有初始化,那么输出的变量的值将是随机不确定的值,即乱码。
赋值运算符的特性
* 有方向性
* 左值和右值类型应一致
简单赋值:变量=表达式
多重赋值:变量1=变量2=表达式(赋值运算符右结合)
复合赋值(简写且执行效率更高的赋值):变量1 运算符= 表达式 例:a-=3 即 a=a-3
给变量赋值
(1)赋值表达式语句:变量 = 表达式;
(2)定义变量的同时为变量赋值——初始化: 类型 变量 = 表达式;
* int a=b=c=3;是错的,正确写法 int a=3,b=3,c=3;
增1和减1运算符(一元运算符)
增1运算符++(自增运算符):使变量的值增加1个单位
减1运算符--(自减运算符):是变量的值减少1个单位
* 前缀:
++n 即 n=n+1
--n 即 n=n-1
*后缀:
n++ 即 n=n+1
n-- 即 n=n-1
操作数只能是变量,不能是表达式,自增自减运算
对于更多的编译器来说,用增1和减1运算生成的代码运行速度更快
一元运算符的优先级高于二元运算符
例题:-(n++)把n++括起来的意义:n++这个操作的运算对象为n,而不是-n,并不是意味着此时括号内先执行
-n为一个表达式,而非一个变量
自动类型转换
* 不同类型数据的运算结果的类型时什么? 取值范围较大的那种类型
* C编译器将所有操作数都转换成取值范围较大的操作数的类型——类型提升
第二个例子是因为溢出
强制类型转换运算符——类型强转
(类型)表达式——一元运算符
类型强转后,并不改变原变量的类型和值