c语言中的操作符和表达式
经过近一段时间的学习,学到了操作符和表达式,先将学到的整理如下:
一.算数操作符:+、-、*、/、%
这个没什么好说的,但要注意 /号的两侧只要有一个浮点数就是浮点类型,定义变量的时候要注意;
%(取余)的两侧必须全是整数。
二.移位操作符:左移<< 右移>>
要想理解右移的概念,要先知道计算机中数据的存储方式,要先知道原码、补码、反码的概念;
在计算机中数据是按二进制存储的,但存储的并不是原码,而是补码,以-1为例(在32位计算机中)
-1的原码为10000000 00000000 00000000 00000001,第一位表示符号位,1为负,0为正。
-1的反码为111111111 111111111 111111111 111111110,正数的反码是其本身,负数的反码在其原码的基础上, 符号位不变,其余各个位取反。
-1的补码为111111111 111111111 111111111 111111111,正数的补码就是其本身,负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1) 在计算机中,是以补码的形式存储的。
无论反码,补码符号位都不会变,同样在左移右移的操作中。符号位也不会改变,只是对补码进行操作。
左移:
移位规则:左边抛弃,右边补零;以int num=10为例
在移位操作中,num的值不会改变下面以一个程序来证明:代码如下
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int num = 10;
printf("%d\n",num << 1);
printf("%d\n", num );
return 0;
}
运行结果如下:num的值并未改变
:
右移:
移位规则:首先右移运算分两种
1.逻辑移位:
左边用0填充,右边丢弃
2.算术移位
左边用该值的符号位填充,右边丢弃
三:位操作符:操作数必须是整数,这些操作符也是用补码来计算的
& //按位与:两两相对,只要有一个0,这个位就为0,全为1才是1
| //按位或:只要有一个1,就为1;
^ //按位异或:相同为0,相异为1
四:赋值运算符,即"="
他可以让你得到之前不满意的值,另外还有复合赋值符,例如:
a+=b;意思为 a=a+b;其他类似的还有
-=;*=;/=;%=;>>=;<<=;&=;|=;^=
五:单目操作符
!逻辑反
- 负值
+ 正值
& 取地址
sizeof 操作数的类型长度(以字节为单位)
~ 对一个数的二进制按位取反
-- 前置、后置--
++ 前置、后置++
* 间接访问操作符(解引用操作符)
(类型) 强制类型转换
注意:sizeof 是操作符 不是函数
前置--和后置--是不一样的,前置是 先运算再赋值,后置是先赋值再运算;下面以一个程序来说明
代码:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int a = 10;
int b = 20;
printf("%d\n", --a);
printf("%d\n", b--);
return 0;
}
结果为:
强制类型转换写法为 变量=(类型)变量
六:关系操作符
>
>=
<
<=
!= 用于测试相等
== 用于测试相等
七:逻辑操作符
&&:逻辑与
||: 逻辑或
区分逻辑与和按位与
区分逻辑或和按位或
1&2----->0
1&&2---->1
1|2----->3
1||2---->1
八:条件操作符 exp1?exp2:exp3
类似于 if(exp1)
{
exp2
}
else
{
exp3
}
九:逗号表达式 exp1, exp2, exp3,
…expN
逗号表达式,就是用逗号隔开的多个表达式。
逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果
十:下标引用操作符[]
例如 int arr[10]={0};
arr[1]=10;
操作数为 arr和1.
十一:函数调用操作符()
函数调用操作符
接受一个或者多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数
的参数
注意:我们不能写出依赖求值顺序的表达式。这样的表达式是不可移植的。尽量避免。