目录
操作符分类
1.算数操作符:
2.移位操作符:
2.1左移操作符:
2.2右移操作符:
二进制的三种形式
原码和补码
3.位操作符:
3.1按位与&:
3.2按位或|:
3.3按位异或^:
4.赋值操作符:
5.单目操作符:
6.关系操作符:
7.逻辑操作符:
8.条件操作符
9.逗号表达式
10.下标引用,函数调用,和结果成员
C语言中操作符总共有10种:
算术操作符 移位操作符 位操作符 赋值操作符 单目操作符 关系操作符 逻辑操作符 条件操作符 逗号表达式,下标引用、函数调用和结构成员。
+ - * / %
注意:/和%,不同,/是得到商,%是得到余数
1.除了 % 操作符之外,其余操作符可以作用于整数和浮点数。
2.对于 / 操作符如果两个操作数都为整数,执行整数除法。
3.而只要有浮点数执行的就是浮点数除法。
4.% 操作符的两个操作数必须为整数,返回的是整除之后的余数。
int main()
{
int a = 0;
a = 13 % 5;//读作13取模5
printf("%d", a);//3
return 0;
}
<< >>
因为元素在内存中是以二进制存储的,移的位都是二进制位,先把元素转换成二进制数。
int a = 10;
//二进制
//00000000000000000000000000001010
注:移位操作符的操作数只能是整数
(整数在内存中存储的时补码的二进制序列)
在计算也是用的补码计算。
打印出来是按照原码打印显
左边丢弃,右边补0
int a = 10;
int b = 0;
b = a << 1;//左移一位
printf("%d\n", b); //20
printf("%d\n", a); //10
//00001010
//-> 00010100
分为两种方式:(根据不同编译器决定,大多数是2)
1.逻辑右移:右边直接丢弃,左边补0(不怎么用,有缺陷)
2.算术右移:右边直接丢弃,左边补原数值符号位
原来是负数,左边补1;
原来是正数,左边补0;
注:(对于移位运算符,不能移动负数位
int num = 10;
num >> -1; 错误的)
移位操作跟二进制相关,整数的二进制分为三种
①原码:按照数值的正负,直接写出的二进制序列就是原码。
②反码:原码的符号位不变,其他位按位取反。
③补码:反码的二进制+1就得到补码
比如:10:
原码:00000000000000000000000000001010
反码:00000000000000000000000000001010
补码:00000000000000000000000000001010
-10:
原码:10000000000000000000000000001010
反码:111111111111111111111111111111110101
补码:111111111111111111111111111111110110
对于一个整数是4个字节=32个bit位
一个整数写出二进制序列时,就是32个bit位。
对于有符号的整数来说,最高位的1位时符号位
符号位1表示负数
符号位0表示整数
对于无符号位数整数来说,没有符号位,所有位都是有效位
正的整数,反码,补码相同,无需计算
原码可以通过取反,+1操作得到补码,补码也可以通过取反+1得到原码
& | ^
&: //按位与 :只有两个数的二进制同时为1,结果才为1,否则为0。
&1可以得到该二进制最后一位是0还是1
|: //按位或 两个数有一个为1,则为1.全0才是0
^: //按位异或 如果其中一个操作数中的位为 0,而另一个操作数中的位为 1,则相应的结果位设 置为 1。 否则,将对应的结果位设置为 0。相同为0,不同为1 a^a =0;0^5 =5;(支持交换律)
按位异或 ^ 是一种二进制运算符,它将两个数的每一位进行异或操作。异或运算的规则是:如果两个对应位的数相同,则该位结果为0;如果两个对应位的数不同,则该位结果为1。异或运算有以下几个特点:
- 0 ^ 0 = 0,0 ^ 1 = 1,1 ^ 0 = 1,1 ^ 1 = 0,这是异或运算的基本规则。
- 0异或任何数等于任何数本身,即0 ^ x = x。
- 1异或任何数等于该数的取反,即1 ^ x = ~x。
- 任何数异或自己等于0,即x ^ x = 0。
注:操作数必须是整数
int a = 3;
int b = 5;
int c = 0;
c = a & b;//按(2进制位)位与
//规则:对应位都是1,按位与为1。对应位有一个不是1,那按位与为0
//a:00000000000000000000000000000011
//b:00000000000000000000000000000101
//a&b:00000000000000000000000000000001
int a = 3;
int b = 5;
int c = 0;
c = a | b;
//对应位只要有一个1,那么就按位或该位置为1
//a:00000000000000000000000000000011
//b:00000000000000000000000000000101
//a|b:00000000000000000000000000000111
int a = 3;
int b = 5;
int c = 0;
c = a ^ b;
//对应位,相同为0,相异为1
//a:00000000000000000000000000000011
//b:00000000000000000000000000000101
//a|b:00000000000000000000000000000110
= += -= *= /= %= >>= <<= &= |= ^=
就是简单的将想要的值赋给另一个变量;复合赋值也只是为了简洁;
! 逻辑反操作
- 负值
+ 正值
& 取地址
sizeof 操作数的类型长度(以字节为单位)
~ 对一个数的二进制按位取反
-- 前置、后置--
++ 前置、后置++ *
* 间接访问操作符(解引用操作符)
(类型) 强制类型转换
重点在于sizeof :
sizeof:是在计算类型创建变量或者变量的大小,单位是字节
计算的结果是size_t类型的;
size_t 是无符号整型的,所以sizeof也是无符号的;
对size_t类型的数据进行打印,可以使用%zd;
sizeof是操作符,不是函数
sizeof:只在乎数组里面有多少个字符元素,来计算数组大小;
计算的占用内存的大小,无论对象啥类型;
strlen:遇到\0才算结束计算;
是库函数,统计字符串长度的;
只能针对字符串;
int main()
{
int a = 5;
printf("%d", sizeof(a));//计算int类型的长度
return 0;
}
强制类型转换也是常用的之一
int a = (int)3.14;//将double类型强制转换为整型
printf("%d\n", a);
> 大于
>= 大于或等于
< 小于
<= 小于或等于
!= 不等于
== 等于
特别注意“==”和“=”不一样
&&: 逻辑与
||: 逻辑或
&&:只有&&两边的表达式均为真,才表示真
||: 只要||一边的表达式为真,整个表达式就为真
注:要区分逻辑与 和 按位与
区分逻辑或和按位或
表达式1?表达式2:表达式3
如果表达式1成立,则执行表达式2的值,否则执行表达式3的值
int a = 3;
int b = 5;
int max = (a > b ? a : b);//用来找到两数的较大值
printf("%d\n", max);
表达式1,表达式2,表达式3,......表达式n
表达式的结果:从左向右依次执行,整个表达式的值是最后一个表达式的结果
int a = 3;
int b = 5;
int c = (a + b, b + 1, a++);//最后一个表达式的值
printf("%d\n", c);//3
1. [ ] 下标引用操作符 操作数:一个数组名 + 一个索引值
2. ( ) 函数调用操作符 接受一个或者多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数。
3. 访问一个结构的成员 . 结构体.成员名 -> 结构体指针->成员名
感谢你看到这里,身为初学者,自知有很多不足,望得到指点!!!