运算符: 代指某种操作的 符号
表达式: 由 运算符 与 数据 按某种顺序 组合而成的 可以计算的一个 式子
C语言中 可以支持的运算符有:
1.算数运算符: +加 -减 *乘 /除 %求余 求模
/除 5 / 3 == 1 整数除法是求商 浮点数除法 结果为浮点数
%求余 必须是整数 5 % 3 == 2
其他数学运算 没有对应运算符 可以通过math库 实现
双目运算: 需要两个数参与的运算符
2.逻辑运算: 真 与 假的 运算
符号
逻辑与 && 双目运算 真 && 真 结果为真 一假得假
逻辑或 || 双目运算 假 || 假 结果为假 一真得真
逻辑非 ! 单目运算 !真 == 假
非0 为真 0假
5 || 0 结果 真 1
5 && 0 结果 假 0
!0.5
3.关系运算 大小比较 结果 真或假
> < == != >= <=
4.位运算 计算机中特有的运算 所有运算目标 均针对二进制而言
按位 & 将二进制中的每一位进行与操作 与0得0 与1不变
按位 | 将二进制中的每一位进行或操作 或1得1 或0不变
按位取反 ~ 单目运算
按位异或 ^ 相同为0 不同为1
移位运算
逻辑左移 << 高位移出丢弃 低位补0
算数右移 >> 低位移出对齐 无符号数 高位补0 有符号数 高位补符号位
a = 1100 0110 = 0xc6
b = 1111 0001 = 0xf1
a & b
= 1100 0000
a | b
= 1111 0111
~a
= 0011 1001
a ^ b
= 0011 0111
a<<1
= 1000 1100
a>>1
无数数a = 0110 0011 == 0x63
有符号数 = 1110 0011 == -29
作用: 多用于底层编程
示例: 有一个数a 希望 a的 [6:4] 设置为 0 其他位不变
a = a & 1000 1111;
= a & ~ 0111 0000;
= a & ~( 7 << 4);
有一个数a 希望 a的 [m:n] 设置为 0 其他位不变
a = a & ~( x << n); x = 2的(m-n+1)次方-1
有一个数a 希望 a的 [6:4] 设置为 1 其他位不变
a = a | 0111 0000;
= a | (7<<4);
有一个数a 希望 a的 [m:n] 设置为 1 其他位不变
a = a | (x << n); x = 2的(m-n+1)次方-1
a = **## ##** 将a的 [5:2] 设置为 y = 1100 = 12
a1= **11 00**
a1 = ( a & ~( 0xf << 2) ) | 12 << 2;
有一个数a 希望 a的 [m:n] 设置为值 y 其他位不变
a = (a & ~(x << n)) | (y << n); x = 2的(m-n+1)次方-1
交互a,b的值
中间变量法:
int c = a;
a = b; b = c;
加法:
a = a + b;
b = a - b;
a = a - b;
亦或法 5.赋值运算的复合运算 少用
a = a ^ b; ===> a ^= b;
b = b ^ a; ===> b ^= a;
a = a ^ b; ===> a ^= b;
a = a + b; ===> a += b;
a = a - b; a -= b;
a = b - a; ===> 不能
写一个程序 打印一个数 a的 最低4个bit的值 以二进制方式输出
a = 1100 x110
(a >> 3) & 1;
== (1100 x) & 0000 0001;
== 0000 000x;
a = b;
a = 10;
a = a + b + c;
a += b + c; ===> a = a + (b + c);
a = a * b + c;
a *= b + c; ===> a = a * (b + c);
选择运算 三目运算符:
a ? b : c;
逻辑: 若a 为真 则 执行 b; 表达式的值 为 b
若a 为假 则 执行 c; 表达式的值 为 c
示例: a = 3, b=10;
x = a > b ? a : b; 将ab中最大的赋值给x
计算机算法:
x = 0 ? a : b ;
x = b;
x
表达式的值 5;
逗号运算符,
表达式1, 表达式2, ... 表达式n;
运算逻辑, 每个表达式都执行一下, 整个表达式的值 为 表达式n 的值
a = 5, b = 10;
z = (x+=5, y = x+0.2);
&变量名 取地址符 得到变量的内存首地址 只能对变量或有内存空间的量使用
sizeof运算符: sizeof(变量名或类型名); 用于计算变量或类型 占用的内存空间大小 单位字节
自增自减运算符 ++ -- 单目运算
前缀++ 运算符 ++a; 先+ a=a+1 后用
后缀++ 运算符 a++; 先用 后+ a=a+1 指a++表达式结束
前缀-- 运算符 --a; 先- a=a-1 后用
后缀-- 运算符 a--; 先用 后- a=a-1
++a++; 不行 ++( a++) 先用 ++ 5 然后 a=a+1 存在对常量赋值
int a =5;
a < a++; 结果为 假
a >= a--; 假
a >= ++a; 真
a > a++; 结果为真 ===> a > 5; a=a+1;
表达式: 运算符 优先级
int a; -a; -a - a; -(a-a);
优先级问题:
1. 优先级提升运算符 ()
2. 单目运算符 优先级高 ++ -- & + - ! ~
3. 算数运算符 高于 移位运算 高于 关系运算 高于 位运算 高于 逻辑运算
4. 吊车尾 3兄弟 三目运算 赋值运算 逗号运算符
示例:
int x=1, y=0, z=0;
x>0 && ! (y==3) || z>5
== 1 && ! (y==3) || z>5
== 1 && ! (0) || z>5
== 1 && 1 || z>5
== 1 || z>5
== 1 || 0
== 1
根据情况 设计表达式
字符变量a 判断 是否 为 英文字母 ASCII
字符变量a 介于 'a' ~ 'z' 或 'A' ~ 'Z'
表达式 为真 是英文字母 为假 不是英文字母
数学表达式 'a' <= a <= 'z' 或 'A' <= a <= 'Z'
C语言表达式 ('a' <= a && a <= 'z') || ('A' <= a && a <= 'Z') == 0
练习题:
输入一个 年份, 判断是否为闰年? 输出 0或1
1. 能被4整除 不能被100 整除
2. 能被400整除
(y % 4 == 0 && y % 100 != 0) || y % 400 == 0
作业:
1. 求下列表达式的值 int a=0,b=1,c=2;
!(a+1>0) && b==0 || c>0
a<0 || b==0 && c>0
int b =1;
1 && b==2 && (b=2)
== 1 && b==2 && 2
== 1 && 1 && 2
== 1
C语言 采用此种算法:
1 && b==2 && (b=2)
== 1 && 0 && 2
== 0 && 1
== 0
3. 输入一个数, 判断是否为 水仙花数?
水仙花数: 一个3位数 其各个位数的 立方和 等于其本身
给定一个 n位数num 求其中m位的值 m<=n
y = num / x %10; 其中x = 10^(m-1); m
1个 = num / 1 % 10;
2十位 = num / 10 % 10;
3百位 = num / 100 % 10;
4千位 = num / 1000 % 10;
.....