一、操作符类型分类
操作符可分为下面这些类型:
算术操作符
移位操作符
位操作符
赋值操作符
单目操作符
关系操作符
逻辑操作符
条件操作符
逗号表达式
下标引用、函数调用和结构成员
二、算数操作符
’+‘加 ’-‘减 ’*‘ 乘’/‘除 ’%‘ 取余
这个部分的操作符用法其实和数学中一样,我们只需要注意一下其中的==’/‘除法和 '%'取余就好。
1.’/‘除法操作符==的除数不能为0,这不符合数学规律,编译器也会报错,例如:
#include<stdio.h>
int main()
{
int m = 5;
int n = 0;
printf("%d",m/n)
return 0;
}
编译器无法算出答案。
2.当两边都是不为正整数时,计算出的结果和数学中的一样吗?
#include<stdio.h>
int main()
{
flaot m = 23/10;//输出2.000000
int n = 23/10;//输出2
printf("%d",m);
printf("%d",n);
return 0;
}
尽管上面m的数据类型为flaot浮点型,但是返回的数值仍为2.000000。这是因为当两边都是整数时,C语言中的整除运算只会返回整数,会将 小数舍去。那当我们需要小数时该怎么得到它呢?
#include<stdio.h>
int main()
{
flaot m = 23.0/10;//或者写成23/10.0
printf("%d",m);
return 0;
}
其实这很简单,我们只需要向上面一样,将23改为23.0或者将10改为10.0就可以,当我们需要得到浮点数的结果时,两个数中有一个数变为浮点数就可。
’%‘取余操作符为取模运算,即返回两个整数相除的余值。它只能用于整型,不能用于浮点型。
当负数求模时,第一个运算数的正负号决定了结果的正负号。
#include<stdio.h>
int main()
{
int m = 23%10;//输出3
int n = -23%10;//输出-3
int a = -23%-10;//输出-3
printf("%d",m);
printf("%d",n);
printf("%d",a);
return 0;
}
三、移位操作符
移位操作符分为左移操作符和右移操作符。
移位操作符的操作数只能为整数。
其中的位指的是二进制位。
1.左移操作符
移位规则:左边抛弃,右边补零。
#include<stdio.h>
int main()
{
int m = 4;
printf("%d\n",m << 2);
printf("%d",m);//观察一下它本身的变化
return 0;
}
运行结果如下:
16
4
由上面的运行结果显示,m向左移并不影响本身。
当向左移的数为负数时
#include<stdio.h>
int main()
{
int m = -4;
printf("%d\n",m << 2);
printf("%d",m);//观察一下它本身的变化
return 0;
}
运行结果为:
-16
-4
这是简单的分析结果。
正整数的原、反、补码都相同。
负整数的三种表⽰⽅法各不相同。
原码:直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。
反码:将原码的符号位不变,其他位依次按位取反就可以得到反码。
补码:反码+1就得到补码。
对于整形数据来说,数据存放在内存中的是补码。
2.右移操作符
右移分为逻辑右移和算术右移。
1.逻辑右移:左边填零,右边丢弃
2.算术右移:左边由原来的符号位确定,右边丢弃
对于移位运算符,不要移动负数位,这个标准是未被定义的。
四、位操作符
位操作符的分类
1.&按位与操作符
2.|按位或操作符
3.^按位异或操作符
同时位操作符的操作数也只能是整形。
这里的位指的也是二进制位。
接下来我们就看代码:
#include<stdio>
int main()
{
int m = 48;
int n = 16;
printf("%d\n",m&n);
printf("%d",m|n);
printf("%d",m^n);
return 0;
}
1.& (按位与操作符):只有都为1时才是1,其它都为0.
2.’ | '(按位或操作符):只要有1就是1,除非你都是0.
3.’ ^ '(按位异或操作符):相同则就是0,不同就是1.
五、赋值操作符
赋值操作法的话,是我们经常能用到的,我们只要不满意一开始输入的值,就可以重新赋值,看代码。
//赋值操作符
#include<stdio.h>
int main()
{
int weight = 100;
//太重了,我减肥了
//重新赋值
weight = 50;
//也可以连续赋值
int m = 0;
int x = 5;
m = x = 10 + 1;
//不过它不方便调试,也不是很美观
//一般还是分开写
x = 10 + 1;
m = x;
return 0;
}
//复合赋值符
#include<stdio.h>
int main()
{
int m = 10;
printf("%d\n", m += 2);
//这里的m += 2相当于
//m = m + 2;
//下面这些也类似
printf("%d\n", m -= 2);
printf("%d\n", m *= 2);
printf("%d\n", m /= 2);
printf("%d\n", m <<= 2);
printf("%d\n", m >>= 2);
printf("%d\n", m %= 2);
printf("%d\n", m &= 2);
printf("%d\n", m |= 2);
printf("%d\n", m ^= 2);
return 0;
}
运行结果如下:
六、单目操作符
单目操作符有:
1.! 逻辑反操作
2.- 负值
3.+ 正值
4.&取地址
5.sizeof 操作数的类型长度(以字节位单位)
6.~ 对一个数的二进制按位取反
7.-- 前置、后置
8.++前置、后置
9.* 解引用操作符
10.(类型)强制类型转换
1)!逻辑反操作符:就是将结果取反,真的变为假的,假的变为真的。
#include<stdio.h>
int main()
{
int m = 10;
int n = 0;
printf("%d\n", !m);
printf("%d\n", -m);
printf("%d\n", !n);
return 0;
}
运行结果为:
0
-10
1
C语言中用0表示逻辑假,非零表示逻辑真。
2)sizeof和数组
void test1(int A[])
{
printf("%d\n", sizeof(A));
}
void test2(char ch[])
{
printf("%d\n", sizeof(ch));
}
#include<stdio.h>
int main()
{
int A[10];
char a[10];
printf("%d\n", sizeof(A));
printf("%d\n", sizeof(a));
test1(A);
test2(a);
return 0;
}
sizeof求的是变量类型的大小。结果为:
40
10
4
4
3)++、–
//前置++、--和后置++、--
#include<stdio.h>
int main()
{
int m = 10;
int x = ++m;
//前置++,先自增,后使用;所以x = 11
int y = --m;
//同理,先自减,后使用,所以y的值为10
//后置++、--
int n = 10;
int a = n++;
//后置++,先使用,后自增,所以a的值为10
int b = n--;
//同理,先使用,再自减,所以b的值为11
}