目录
1.操作符分类
操作符种类很多,分为:
1.算数操作符
2.移位操作符
3.位操作符
4.赋值操作符
5.单目操作符
6.关系操作符
7.逻辑操作符
8.条件操作符
9.逗号表达式
10.下标引用,函数调用和结构成员
2.操作符详解
2.1算数操作符
算数操作符也叫作运算符,它就是我们平时最常用到的 ‘+’ ‘-’ ‘*’ ‘/’ '%' ,
其中,除了‘%’,我们都很了解,所以给大家重点介绍‘%’。
1.‘%’叫模,是用来求余数的,我们举个例子:
求 a=10%4,我们可以很轻松得到a=2;
求a=3%4 ,则a=3;
我知道这如果是一道数学题,肯定很容易就得到结果,但是当它作为编程中的一个问题时,需要转一下脑筋才能出来。所以这里有一个结论:
当前一个数小于后一个数取模时,得到的结果总是前一个数。
2.处‘%’之外,其他几个操作符可以作用于整数和浮点数;
3.对于‘/'如果俩个操作数都为整数,则执行整数除法;只要操作数中有一个是浮点数,执行的就是浮点数除法;
4.’%‘两端的操作数必须是整数,返回的是整除之后的余数。
5.在double和float中,想要结果保留小数点后几位,就加.几;
例如,想要保留小数点后一位,就是printf(“%.1lf”);
保留小数点后俩位,printf("%.2lf");
我们看代码:
#include<stdio.h>
int main()
{
//除法
int a = 6 / 4;//整数除法
printf("a=%d\n", a);
double b = 10.0 / 2;//浮点数除法
printf("b=%lf ", b);
printf("b=%.1lf\n", b);//保留小数点后一位
//取余
int c = 10 % 4;
printf("c=%d\n", c);
int d = 2 % 4;
printf("d=%d\n", d);
return 0;
}
我们得到结果如下:
2.2移位操作符
移位,移的是二进制位。
移位操作符有 << 左移,>>右移。
移位操作符的操作数只能是整数,不可以移负数位。
在内存中存储的起始是补码的二进制,在参与移位时,移动的都是补码。
2.2.1原码、补码与反码
1.正数的原码反码和补码都是相同的;
2.负数
原码:按照一个数的正负,直接写出它的二进制的表现形式,得到的就是原码;
反码:除符号位,原码其他位按位取反;
补码:反码加一;
例如:2的原码是:00000000 00000000 00000000 00000010
反码是:00000000 00000000 00000000 00000010
补码是:00000000 00000000 00000000 00000010
-10的原码是:10000000 00000000 00000000 00001010
反码是:11111111 11111111 11111111 11110101
补码是:11111111 11111111 11111111 11110110
2.2.2左移与右移
1.左移:左边丢弃,右边补0;
左移一位,得到的值是原来值的2倍。
例如,让10左移一位。
10的补码是:00000000 0000000 00000000 00001010
则补码整体向左移动一位,右边补0,因为只能保留32位,所以左边丢弃一位
左移后,得到的补码是:0000000 00000000 00000000 00010100
它在转换为原码是:00000000 00000000 00000000 00010100
则10左移之后,就变为了20,出现了*2的效果。
2.右移:参考左移
右移分为算数右移和逻辑右移;
算数右移:右边丢弃,左边补原来的符号位;
逻辑右移:右边丢弃,左边直接补0。
我们平常见到的都是算数右移。
其中只有-1的补码是全1,-1右移一位还是-1.
我们看代码:
#include<stdio.h>
int main()
{
int a = 10;
int b = a << 1;//左移
printf("b=%d\n", b);
int c = a >> 1;//右移
printf("c=%d\n", c);
return 0;
}
结果:
2.3位操作符
位操作符有 & | ^
位操作符的操作数必须是整数
&:按位与,俩个操作数对应补码二进制位有0,则为0,俩个同时为1,才为1;
|:按位或,俩个操作数对应的补码二进制位有1则为1,两个同时为0,才为0;
^:按位异或,俩个操作数对应的补码二进制位相同位0,相异为1;
^支持交换律,其中 a^a=0;
0^a=a;
a^b^a=a^a^b=b;
看代码:
#include<stdio.h>
int main()
{
int a = 3;
int b = -5;
int c = a & b;//按位与
int d = a | b;//按位或
int e = a ^ b;//按位异或
printf("c=%d\n", c);
printf("d=%d\n", d);
printf("e=%d\n", e);
return 0;
}
结果:
2.4赋值操作符
赋值操作符可以连续使用;
赋值操作符从右向左赋值;
复合赋值符:+= -= /= *= %= <<= >>= &= |= ^=
例如:a=a/10等价于a/=10;
看代码:
#include<stdio.h>
int main()
{
int a = 10;
int b = 0;
int c = 20;
a = b = b + c;//连续赋值,这样的代码可读性不高
printf("a=%d\n", a);
c = c / 10;
printf("c=%d\n", c);
c = 20;//还原c的初始值
c /= 10;
printf("c=%d\n", c);
return 0;
}
结果:
2.5单目操作符(双目,三目)
1.单目操作符:!表示非,例如!0,就是不是0,常用在条件语句中,用来判断;
- + 正负号,表正负数;
&表取地址,与 &与操作符不同;
sizeof,变量类型所占空间的大小,单位是字节;
~表示对一个二进制数按位取反(补码计算);
++ -- 前置与后置加加减减;
(类型),表强制类型转换;
* 表解引用操作符,指针中会用到。
2.例如 a+b,则 + 就是双目操作符;
3.三目操作符目前我们用到的只有条件操作符一个: exp1?exp2:exp3 ,在2.8中举例子介绍。
其中exp1是条件语句,判断这个条件,如果为真,执行exp2,否则执行exp3;
看代码:
#include<stdio.h>
int main()
{
int a = 10;
int i = 2;
while (i != a)//单目操作符!
{
i++;
}
printf("i=%d\n", i);
int* b = &a;//&取地址操作符
printf("b=%p\n", b);
*b = 20;//解引用操作符
printf("a=%d\n", a);
int c = 0;
int d = ~c;//按位取反~
printf("d=%d\n", d);
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };//sizeof求arr数组在内存中占了多大空间
int sz = sizeof(arr);
printf("sz=%d\n", sz);
int j = 12;
int k = j++;//后置++,先使用j,j在自加1;若是++j,则j先+1,在使用,--也是相同道理
printf("k=%d,j=%d\n", k, j);
int f = (int)3.14;//强制类型转换,让3.14变为整数3
printf("f=%d\n", f);
return 0;
}
看结果:
2.6关系操作符
关系操作符有:< > >= <= == !=
== 用来测试两边操作数相等;
!=用来测试不相等。
看代码:
int main()
{
int n = 5;
int i = 0;
for (i = 0; i < 10; i++)
{
if (i == n)
printf("%d ", i);
if (i != n)
printf("* ");
}
printf("\n");
return 0;
}
2.7逻辑操作符
逻辑操作符有 || 表示或;
&& 表示与。
||:表达式中只要有一个结果为真,就结束计算;
&&:表达式中只要有一个结果为假,就结束计算。
看代码:
int main()
{
int i = 0, a = 0, b = 2, c = 3, d = 4;
i = a++ && ++b && d++;
printf("a=%d,b=%d,c=%d,d=%d\n", a, b, c, d);
int j = 0, e = 0, f = 2, k = 3, l = 4;
j = e++ || --f ||k++|| l++;
printf("e=%d,f=%d,k=%d,l=%d\n", e,f,k,l);
return 0;
}
结果是:
2.8条件操作符
条件操作符也叫三目操作符
看代码:
#include<stdio.h>
int main()
{
int a = 10;
int b = 20;
int c=a > b ? a : b;
printf("c=%d\n", c);
return 0;
}
2.9逗号表达式
从左向右依次执行,整个表达式的结果是最后一个表达式的结果。
看代码:
#include<stdio.h>
int main()
{
int a = 10;
int b = 20;
int c = (a++, b--, a = a * 2, b = a + b);
printf("c=%d\n", c);
return 0;
}
结果是:
2.10下标引用,函数调用和结构成员
1,[ ]:下标引用操作符,是一个双目操作符,它的操作数为一个数组名+一个索引值;
2.():函数调用操作符,例如自定义函数:int max=get_max(a,b);
3.访问结构体成员,用 . 或者—>来访问。
总结完毕啦各位小伙伴们,完结撒花!!!