c语言操作符总结
一、算数操作符 +. -. *. /. %
1. %操作符的两个操作数必须为整数。返回的是整数之后的余数。
2. 除%操作符之外,其他几个操作符可以作用于整数和浮点数。
3. /操作符的两个操作数是整数的话,执行整数除法;只要有浮点数执行的话,就执行浮点数除法。
二、移位操作符 << >>
1. << 左移操作符
移动规则:左边抛弃,右边补0。
左移1位相当于该数乘以2,左移2位相当于该数乘以2*2=4,15<<2=60,即乘了4。但此结论只适用于该数左移时被溢出舍弃的高位中不包含1的情况。
假设以一个字节(8位)存一个整数,若a为无符号整型变量,则a=64时,左移一位时溢出的是0
,而左移2位时,溢出的高位中包含1。
2. >> 右移操作符
移动规则:
(1)逻辑移位:左边用0填补,右边丢弃。
(2)算数移位:左边用原该值的符号位填补,右边丢弃。
一般用算数移位,右移1位相当于该数除以2。
三、位操作符 & | ^
1. &按位与
如果两个相应的二进制位都为1,则该位的结果值为1;否则为0。这里的1可以理解为逻辑中的true,0可以理解为逻辑中的false。按位与其实与逻辑上“与”的运算规则一致。逻辑上的“与”,要求运算数全真,结果才为真。
(1)将二进制数中的某一位置0或者置1
例:将下面的1置0
00000000 00000000 00000000 10011001
与
<===11111111 11111111 11111111 11110111
按位取反
<===00000000 00000000 00000000 00001000
1左移3位
<===1<<3
(2)清零
若想对一个存储单元清零,即使其全部二进制位为0,只要找一个二进制数,其中各个位符合一下条件:
原来的数中为1的位,新数中相应位为0。然后使二者进行&运算,即可达到清零目的。
2. 按位或 |
两个相应的二进制位中只要有一个为1,该位的结果值为1。借用逻辑学中或运算的话来说就是,一真为真。
3. 按位异或 ^
a^a=0 0^a=a
交换两个值,不用临时变量
c语言源代码:
#include <stdio.h>
main()
{
int a=3;
int b = 4;
a=a^b;
b=b^a;
a=a^b;
printf("a=%d b=%d",a,b);
}
四、赋值操作符
赋值操作符可以让你得到一个你之前不满意的值。
复合操作符:+=.-=.*=./=.>>=.<<=.&=.|=.^=
五、单目操作符
1. 逻辑反操作 !
a=10; !a=0;
2. 负值 -
a=10; -a=-10;
3. 正值 +
4. 取地址 &
printf(“%p”,&a);
printf(“%x”,&a);
5. 操作数的类型长度(以字节为单位) sizeof
sizeof不是函数;
6. 前置、后置 --
1-- 先使用后自加;--1先自减后使用
7. 前置、后置 ++
1++ 先使用在自加;++1 先自加后使用
8. 间接访问操作符 * (指针变量)
int a=10;
int *p=&a;
*p=20; //int*是整形指针类型,不是操作符; p是变量名,p的类型是int*; p存a的地址;
9. 强制类型转化 ()
int num =0;
float f=3.14f;
num=(int)f;
将f为float 类型转换为int类型
10. 对一个数的二进制按位取反 ~
int a=0;
~a=-1;
六、关系操作符
> 、>= 、< 、<=、!=、==
== 等于
= 赋值
七、逻辑操作符
&& 逻辑与
||逻辑或
区分逻辑与和按位与:
1&2 -->01 10-->0
1&&2-->真 真-->1
区分逻辑或和按位或
1|2-->01|10-->11-->3
1||2-->真|真-->真
八、条件操作符
三目操作符 exp1 ? exp2 :exp3
Eg; b=(a>5)? 3:(-3); //判断a是否大于5,如果大于,则将a等于3的值赋值给b;否则将a等于-3的值赋值给b。
Eg:max=(a>b)? a:b; //求两个数中的最大值。
九、逗号操作符
exp1 , exp2 ,exp3 ,exp4 ......expN
逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果。
十、下标引用、函数调用和结构成员
1、[]
操作数:一个数组名,一个索引值
int arr[10];//创建数组
arr[9]=10;//实用下标引用操作符
2、()
函数调用操作符
接受一个或者多个操作数,第一个操作数是函数名,剩余的操作数就是传递给函数的参数。
Eg:
#include <stdio.h>
void test1()
{
printf("hehe! ");
}
void test2(const char *str)
{
priintf("%s ",str);
}
int main()
{
test1();//()不能省略
test2(“hello world!”);
return 0;
}
3、访问一个结构体成员
.结构体.成员
->结构体指针->成员名
Eg:
#include <stdio.h>
struct Stu //类型
{
char name[10];
int age;
char sex[5];
double score;
};//分号不能省略
void set_age2(struct Stu* pStu)
{
pStu->age=18; //结构体成员访问
}
int main()
{
struct Stu stu; //stu是对象
struct Stu* pStu=&stu; //结构体成员访问
stu.age=20; //结构体成员访问
set_age1(stu);
pStu->age=20; //结构体成员访问
set_age2(pStu);
return 0;
}