操作符分类:
算术操作符
移位操作符
位操作符
赋值操作符
单目操作符
关系操作符
逻辑操作符
条件操作符
逗号表达式
下标引用、函数调用和结构成员
1. 算术操作符
在这里主要介绍 / 和 %的作用
’ / ’
#include<stdio.h>
int main()
{
//操作符(运算符)
int ret1 = 10 / 3;
//对于除法操作符来说,如果除号两边都是整数,执行的是整数除法
//如果想计算出小数,除号两边至少有一个是浮点数
double ret2 = 10 / 3.0;
printf("%d\n", ret1);
printf("%lf\n", ret2);
//如果值想得到小数点后一位,在lf前加 .1 即可
//想得到小数点后几位,只需.+整数,例如:.2lf .3lf
printf("%.1lf\n", ret2);
return 0;
}
‘%’(取模或者取余操作符,计算的是整除之后的余数)
总结:
1. 除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。
2. 对于 / 操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。
3. % 操作符的两个操作数必须为整数。返回的是整除之后的余数。
2. 移位操作符
<< 左移操作符
>> 右移操作符
内存中存储的是二进制的补码,所以进行移位的时候是对补码进行移位
注:移位操作符的操作数只能是整数。
2.1 左移操作符
移位规则:
左边抛弃、右边补0
2.2 右移操作符
移位规则:
首先右移运算分两种:
1. 逻辑移位
左边用0填充,右边丢弃
2. 算术移位(平常使用)
左边用原该值的符号位填充,右边丢弃
算数右移:
逻辑右移:
平时右移时是采取的是算数右移
警告⚠ :
对于移位运算符,不要移动负数位,这个是标准未定义的。
例如:
int num = 10;
num>>-1;//error
3. 位操作符
位操作符有:
& //按位与
| //按位或
^ //按位异或
注:他们的操作数必须是整数。
& - 按(2进制)位与
对应的二进制位有0则0,两个同时为1,才为1
| - 按(二进制)位或
对应的二进制位有1则为1,两个同时为0则为0
^ - 按(2进制)位异或
对应的二进制位:相同为0,相异为1
4. 赋值操作符
赋值操作符是一个很棒的操作符,他可以让你得到一个你之前不满意的值。也就是你可以给自己重新赋值。
int weight = 120;//体重
weight = 89;//不满意就赋值
double salary = 10000.0;
salary = 20000.0;//使用赋值操作符赋值
赋值操作符可以连续使用,比如:
int a = 10;
int x = 0;
int y = 20;
a = x = y+1;//连续赋值
这样的代码感觉怎么样?
那同样的语义,你看看:
x = y+1;
a = x;
这样的写法是不是更加清晰爽朗而且易于调试。
复合赋值符
+=
-=
*=
/=
%=
>>=
<<=
&=
|=
^=
这些运算符都可以写成复合的效果。
比如:
int x = 10;
x = x+10;
x += 10;//复合赋值
//其他运算符一样的道理。这样写更加简洁
5. 单目操作符
5.1 单目操作符介绍
! 逻辑反操作
- 负值
+ 正值
& 取地址
sizeof 操作数的类型长度(以字节为单位)
~ 对一个数的二进制按位取反
– 前置、后置–
++ 前置、后置++
* 间接访问操作符(解引用操作符)
(类型) 强制类型转换
! 逻辑反操作就是进行取反,把原来的意思转换成相反的意思。
例如:
a为5,所以第一个打印出haha,又因为a为1 !=5,所以打印了wuwu。
&和 *
取地址是取出一个变量名的地址
int main()
{
int a = 10;
printf("%p\n", &a);
int* pa = &a;
char ch = 'w';
char*pc = &ch;
char arr[10] = { 0 };
char* p2 = arr;
char* p3 = &arr[0];
char* p = "abcdef";
printf("%p\n", p);
printf("%c\n", *p);
return 0;
}
* 间接访问操作符(解引用操作符),通常用于地址的解引用。
&取出a的地址放在pa里,通过*解引用找到a,可以对a进行修改以改变a的值。
sizeof 操作数的类型长度(以字节为单位)
int main()
{
int a = 10;
printf("%d\n", sizeof(a));//ok
printf("%d\n", sizeof a );//ok
printf("%d\n", sizeof(int));//ok
//printf("%d\n", sizeof int);
int arr[10] = { 0 };
printf("%d\n", sizeof(arr));//ok
printf("%d\n", sizeof arr);//ok
printf("%d\n", sizeof(int [10]));//ok
return 0;
}
函数调用的时候,要写()
但是sizeof后边的括号可以省略,说明sizeof不是函数
sizeof后面是变量名可以省略(),但后面是类型的时候不可以省略()
~ 对一个数的二进制按位取反
~ 不考虑符号位,是对所以的二进制数进行按位取反
~按位取反
000000000000000000000000000000000 - 0的补码
111111111111111111111111111111111 - 对0进行按位取反
100000000000000000000000000000001 - -1的原码
~ | & << >> ^ 的代码示例
int main()
{
int a = 9;
//00000000000000000000000000001001
//00000000000000000000000000010000 1<<4
//00000000000000000000000000011001
//
//把a的二进制中第5位改成1
a |= (1<<4);
printf("%d\n", a);
//把a的二进制中的第5位改回来,变成0
//00000000000000000000000000011001
//11111111111111111111111111101111 ~(1<<4)
//00000000000000000000000000001001
a &= (~(1 << 4));
printf("%d\n", a);//9
return 0;
}
本篇就到此结束了,喜欢的小伙伴们点个赞吧!
(如有错误,请留言评论,不胜感激!)