算数操作符

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#include<stdio.h>
int main()
{
int a = 10;
float b = 2.5;
//printf("%d\n",a + b);//有警告,类型不一致,打印结果不正确。

b = 30;//隐式类型转换
//从左到右,由大到小 short ----- int ----- long ----- float ----- double
//printf("%d\n",a + b);//有警告,类型不一致,打印结果不正确。
printf("%f\n",a + b);

//除法运算符(/):当两个操作数都是整数时,结果也是整数,如果有小数则丢弃。不进行四舍五入。
//有一个操作数是浮点数,结果也是浮点数,不是整除运算。

int a = 5 / 4;//整除运算
printf("a:%d\n",a);//1

float b = 5 / 4;//整除运算
printf("b:%f\n",b);//1.000000

float c = 5.0 / 4;//浮点数除法
printf("c:%f\n",c);

int d = 6 / 4.0;//浮点数除法(隐式自动转换)小数部分会被舍弃,也不进行四舍五入。
printf("d:%d\n",d);//1

int e = 5 / 4.0;//(隐式自动转换)
printf("e:%d\n",e);//1

float g = (float)5 / 4;//(强制转换)
printf("g:%f\n",g);//1.250000

float f = (float)(5 / 4);//(强制转换)(显式自动转换)
printf("f:%f\n",f);//1.000000

// 取模运算符(%)(取余运算):两个整数相除,取余数,取模运算符
//小数不能做取模运算
//功能:
//1、获取一个整数中的每一位数字 2、
//例如:235 :个位5 十位3 百位 2
//235/1%10 得个位5
//235/10%10 得十位3
//235/100%10 得百位 2
//2、计算判断奇偶数 XX % 2
//3、判断一个数能被另一个数整除

int a = 5 % 3;
printf("a:%d\n", a);//2

int b = 3 % 5;
printf("b:%d\n", b);//3

// float c = 5.0 % 3.0;//error:%只能是整数参与运算


//单独使用,a++与++a效果一样;
//参与赋值,a++:先赋值后自增,++a:先自增后赋值
int num1 = 5;
printf("(num1++) + 3:%d\n", num1++ +3);//8
printf("num1:%d\n", num1);//6

int num2 = 5;
printf("++num2 + 3:%d\n", ++num2 + 3);//9

//当++在变量前时,先自增运算,再使用这个变量
//当++在变量后时,先使用这个变量,再自增运算
int a = 10, b = 20;
int c = (a++)+(++b);//c=(10)+(21)=31
printf("a:%d\nb:%d\nc:%d\n", a, b, c);//a:11, b:21, c:31

int b = (++a) + (a++) + (++a) + a;
// (6) + (6) +(8) +(8)
// a:6(6) (6) a:7 a:8 (8) 8
//不同的编译器可能有不同的解析方式,结果可能不同。

printf("a=%d\n", a);
printf("b=%d\n", b);


return 0;
}

赋值操作符

操作符 解释 说明
= 赋值 int a=10,b=20;,将10赋值给变量a
+= 加后赋值 a+=b,即a = a+b,将a+b的值给a
-= 减后赋值 a-=b,即a=a-b,将a-b的值给a
*= 乘后赋值 a*=b,即a=a×b,将a×b的值给a
/= 除后赋值 a/=b,即a=a/b,将a/b的商给a
%= 取余数后赋值 a%=b,即a=a%b,将a÷b的余数给a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
int main()
{
short c = 32767;//-32768~32767
c += 1;//c = c+1 //溢出:表示整数溢出,结果为-32768
printf("%hd\n", c);//-32768
printf("%d\n", (int)c);//-32768
printf("~~~~~%hu\n", c);//32768 //unsigned short c:%hu表示无符号的short类型0~65535

int x = 10;
int y = x = 100;//可以连写
//int t = u = v = w = 200;//error:u,v,w都是变量名,没有定义,不能连写
return 0;
}

关系操作符

操作符 解释
> 大于
< 小于
== 等于
>= 大于等于
<= 小于等于
!= 不等于

所有关系操作符结果只能是两种:
“真”:1
“假”:0

在c语言中,非0数据都为真,0为假

条件运算符

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

计算规则
首先计算关系表达式的值
如果值为真,表达式1的值就是运算结果
如果值为假,表达式2的值就是运算结果

scanf()函数

数据类型 输出/输入格式字符串
int %d
short %hd
long %ld
long long %lld
float %f
double %lf
char %c
string %s
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#include <math.h>
int main()
{
int a = 0,b = 0;
char c = 0;
printf("请输入两个整数:");
//键盘输入两个整数,求出较大的整数,如果输入小数或者非数字,要进行判断
int n = scanf("%d%d%c",&a,&b,&c);//scanf()函数返回值是从键盘实际读取到数据的变量的个数
// printf("a = %d,b=%d,c=%d,c=%c\n", a,b,c,c);
// printf("n = %d\n", n);

n == 3?(c != '\n' ? printf("输入数据错误!\n"):printf("两个数中的最大数是:%d\n", a > b ? a : b )):printf("-----输入数据错误!!\n");

n == 3?(c != '\n' && c != ' ' && c!='\t' ?printf("~~~~输入数据错误!\n"):printf("~~~两个数中的最大数是:%d\n", a > b ? a : b )):printf("~~~~----输入数据错误!!\n");

n==3?(c == '\n' || c == ' ' || c=='\t' ?printf("~~~两个数中的最大数是:%d\n", a > b ? a : b ):printf("~~~~输入数据错误!\n")):printf("~~~~----输入数据错误!!\n");
return 0;
}

逻辑操作符

操作符 解释 说明
&& 逻辑与 并且、都满足才成立
|| 逻辑或 或者,只要有一个满足就成立
逻辑非 取反
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
26
27
28
29
//对于逻辑与&&和逻辑或||来说,当第一个操作数能够确定整个表达式的值时,就不会计算第二个操作数。
#include <stdio.h>
int main()
{
int a = 1;int b = 2;int c = 3;

c = (a > -3) || (b = 40);//对于逻辑或来说,第一个操作数1>-3成立,所以第二个操作数不会被计算,这就是短路运算规则
printf("a = %d\n", a);//1
printf("b = %d\n", b);//2, 说明第二个操作数没有被计算
printf("c = %d\n", c);//1

c = a > 3 && (b = 400);//对于逻辑与来说,第一个操作数1>3不成立,所以第二个操作数不会被计算,这就是短路运算规则
printf("a = %d\n", a);//1
printf("b = %d\n", b);//2, 说明第二个操作数没有被计算
printf("c = %d\n", c);//0

c = (b = 400) && (a = 3);//没有短路运算
printf("a = %d\n", a);//3
printf("b = %d\n", b);//400, 说明第二个操作数被计算了
printf("c = %d\n", c);//1

//(a && b || c)
//a为0,b不会执行,c要执行
int i = 2,k = 0,m = 0;
(i = 0) && (b = 5) || (c = 10);//&&有短路运算,i为0,k不执行,c要执行
i = 2,k = 0,m = 0;
(i = 20) || (b = 5) && (c = 10);//有短路运算,a为1,b不执行,c也不执行
return 0;
}

移位操作符

用来对二进制数字进行向左或向右移位操作。

左移运算符(<<)

将一个数的二进制表示向左移动指定的位数

int a = 4;
int b = a<<1;
第一步:将4转换为二进制 0100;
第二步:将二进制0100 左移动1位,变成1000;
第三步:将二进制1000 转换为十进制 8;

左移位规则:左边抛弃、右边补0结果为原数乘以2的移位位数次方

右移运算符(>>)

右移位规则:右边抛弃,左边补0结果为原数除以2的移位位数次方

1
2
3
4
5
6
7
8
9
10
11
12
13
#include<stdio.h>
int main()
{
//右移:有符号数右移,符号位不变,高位补符号位
int a2 = -1073741824;//int范围:-21亿多~21亿多
int b2 = a2 >> 3;
printf("b2:%d\n",b2);

unsigned int a3 = 3373741824;//无符号数右移,高位补0, unsigned int 范围0~42亿多
unsigned b3 = a3 >> 3;
printf("b3:%u\n",b3);
return 0;
}

位操作符

位操作符用于对二进制数进行操作

操作符 解释说明
按位与:& 对两个二进制对应位都为1时,结果为1,否则为0
按位或:| 对两个二进制对应位只要有一个为1时,结果为1,否则为0
按位取反:~ 对一个二进制数的每一位进行取反操作,将0变为1,将1变为0
按位异或:^ 对两个二进制数的每一位进行异或操作,当两个对应位不相同时,结果为1,否则为0。
1
2
3
4
5
6
7
8
9
10
11
12
13
//不创建临时变量(第三个变量),实现两个数的交换。
#include <stdio.h>
int main()
{
int a = 2;
int b = 4;
a = a^b;//010 ^ 100 = 110

b = a^b;//110 ^ 100 = 010
a = a^b;//110 ^ 010 = 100
printf("a = %d b = %d\n", a, b);
return 0;
}

其他操作符

sizeof操作符

获取数据类型或变量所占用的字节数

语法:sizeof(数据类型/变量)

用途:
1、动态获取内存空间大小,可以避免硬编码造成的错误;
2、在定义数组时,可以用sizeof操作符计算数组长度

强制类型转换

将数据类型强制转换为需要的类型

语法:(数据类型)

注意:强制转换可能会导致数据精度的丢失或溢出,因此在进行强制转换时应谨慎使用,并确保转换结果符合预期。

用途:
1、当需要将一个数据类型的值赋给另一个不同数据类型的变量时,需要进行强制类型转换
2、在表达式中,有时需要将某些操作数强制转换为特定的数据类型,以便进行正确的计算

表达式

逗号表达式

格式:表达式1,表达式2,表达式3…表达式n;

规则:依次计算每个表达式,并返回最后一个表达式的值作为整个表达式的值。

操作符的优先级

优先级 操作符 解释
1 ()、 []、 ->、 . 括号、数组、两种结构成员访问
2 !、~、++、–、+、-、*、&、(类型)、sizeof 否定、按位取反、自增、自减、正号、负号、间接访问、地址访问、类型转换、内存大小
3 * 、/、% 乘、除、取余
4 +、- 加、减
5 <<、>> 左移、右移
6 <、<=、>=、> 小于、小于等于、大于等于、大于
7 ==、!= 等于、不等于
8 & 按位与
9 ^ 按位异或
10 按位或
11 && 逻辑与
12 || 逻辑或
13 ?: 条件操作符
14 =、+=、-=、*=、/=、%= 赋值、加等、减等、乘等、除等、取模等
15 逗号运算