算术运算符: + - * / %(取余)

1.通用细节:

  • 整数计算,结果一定是整数

例如10 / 3 结果为3 而得不到3.333

  • 小数计算,结果一定是小数

  • 整数和小数计算,结果一定是小数

  • 小数直接参与计算,结果可能不精确

(计算机中存储方式为二进制,因此浮点数不准确)

2.取余细节

  • 运算的数据必须全部是整数
  • 获取余数的正负,是跟第一个数字保持一致的
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>

int main() {
//键盘录入一个三位数,将其拆分为个位 十位 百位
int a;
printf("Please type a number betweeen 100 and 999\n");
scanf("%d", &a);
printf("BAI WEI SHI %d\n",a / 100);
printf("SHI WEI SHI %d\n",a/10 % 10);
printf("GE WEI SHI %d\n",a % 10);
return 0;
}

==计算时,数据模型不一样不能直接运算,需要转换成一样的,才能运算==

隐式转换:把一个取值范围小的,转成取值范围大的

规则1: 取值范围小的,和取值范围大的,小的会自动升为大的,在进行运算

规则2: short char类型的数据在运算的时候,先提升为int,在进行计算

==取值范围:char<short<int<long<long long<float<double==

不同的数据类型进行计算,赋值等操作,会触发隐式转换

强制转换:如果把取值范围大的,赋值给取值范围小的,就需要进行强制转换

格式: 目标数据类型 变量名 = (目标数据类型)被强制转换的数据;

1
2
int b = 10;
short i = (short)b;
1
2
3
4
5
6
7
8
9
#include <stdio.h>

int main() {
short s1 = 10;
short s2 = 20;
short result = (short)(s1 + s2);
printf("%d\n", result);
return 0;
}

字符相加

字符跟数字进行转化的时候会查询ASCII码表(可直接用看)

1
printf("%d\n", 'a');

自增自减运算符:++和—

++表示 变量中的值+1; —表示 变量中的值-1;

++和—放在变量的前面或者后面,单独写一行结果是一样的

自增自减运算符应用场景:年龄增长,增减货物数量等等

自增自减运算符扩展用法

参与计算:例如定义 int a = 10;

int b = a++;先用后加,此时使用的是原来的值 得到b为10

int b = ++a;先加后用,此时使用的是自增之后的值 得到b为11

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include<stdio.h>
int main(){
int i = 10;
int j = 5;
int k = i++ + ++i - --j - i--;
printf("%d\n", k);
//win: 11+11-7-11
//mac: 10+12-4-12

//windows:7
//前缀优先于后缀
//前缀统一自增/自减,再把结果拿出来用
//int i = 10;
//++i + ++i;
//12 + 12 = 24
//后缀统一先用,等整个表达式中变量用完了,再进行自减
//int i = 10;
//++i + ++i;
// 10 + 10 = 20

//mac,linux:6
//前缀和后缀优先级一样,从左到右依次计算,每一个前缀后缀都是一个独立的个体

return 0;
}

赋值运算符

符号 说明 举例
= 直接赋值 int a=10,将10的值赋值给a
+= 加后赋值 a+=b,将a+b的值给a(左右相加赋值给左边对右边没影响 下面同理)
-= 减后赋值 a-=b,将a-b的值给a
*= 乘后赋值 a*=b, 将a乘以b的值给a
/= 除后赋值 a/=b,将a除以b的商给a
%= 取余赋值 a%=b,将a除以b的余数给a

关系运算符

==成立1(真) 不成立0(假)==

符号 说明
== a==b 判断a是否等于b
!= a!=b 判断a是否不等于b
> a>b 判断a是否大于b
>= a>=b 判断a是否大于等于b
< a<b 判断a是否小于b
<= a<=b 判断a是否小于等于b

逻辑运算符

符号 作用 说明
&& 与(而且) 两边都为真,结果才是真(同时满足)
\ \ 或(或者) 两边都为假,结果才是假(二选一)
! 非(取反) 取反
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>

int main() {
//键盘录入一个两位数,要求数字不能包含7
//如果符合要求,输出1,不符合要求输出0
int a;
printf("Type a num between 10 and 99\n");
scanf("%d", &a);
int ge = a % 10;
int shi = a/10 %10;
int result = (ge != 7 && shi != 7);
printf("%d\n", result);
return 0;
}

逻辑运算符的短路效果

&&与(而且) ||或(或者) 具有短路效果

例如定义int a = 0;此时printf("%d\n", a>1 && a<10);此时运行时,由于左边已得出结果为0可确定,因此右边不参与计算

==规则: 当左边的表达式能确定整个表达式的结果了,右边不会参与计算==

三元运算符

格式:关系表达式? 表达式1: 表达式2;

运行规则:先执行关系表达式(做一个判断).若结果成立,执行表达式1;若结果不成立,执行表达式2.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>

int main() {
//获取三个变量中的最大值
int a;
int b;
int c;
printf("type three numbers\n");
scanf("%d %d %d", &a, &b, &c);
int d = a > b ? a : b;
int e = d > c ? d : c;
printf("The biggest number is %d",e);
return 0;
}

逗号运算符

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

  • 从左到右
  • 最后一个子表达式的结果, 是整个表达式的结果
  • 优先级最低(永远是最后执行)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>

int main() {
//1.变成绝对值
//2.除以3获取余数
//3.乘以10
printf("Type a number\n");
int a;
scanf("%d", &a);
int b = a >= 0 ? a : -a;
int c = b % 3;
int d = c * 10;
printf("Result is %d",d);
return 0;
}

运算符的优先级

  • 小括号优先于所有
  • 一元 > 二元 > 三元
  • && > || > 赋值

一元:一个变量可以运算

++ —(自增自减) + - !(正负取反)

二元:

乘除取余;加减;关系运算符(>,>=,<,<=,==,!=);逻辑 与(&&);逻辑 或(||)

三元:

三元运算符,赋值运算符,逗号运算符