操作符
分类:
算数操作符
移位操作符
位操作符
赋值操作符
单目操作符
关系操作符
逻辑操作符
条件操作符
逗号操作符
下标引用、函数调用和结构成员
#
算数操作符
+ 加、- 减、* 乘、/ 除、% 模运算或求余
除了%操作符之外,其他的几个操作符可以作用于整数和浮点数。
对于/操作符,如果两个操作符都是整数,执行整数除法。而只要有浮点数就执行浮点数除法。
%左右两边必须是两个整型操作数,返回值是余数而不是商。
#include<stdio.h>
int main()
{
float sum=1/3;
printf("%lf",sum);
return 0;
}
结果为3
移位操作符
<< 左移操作符 、 >> 右移操作符
1.左移位操作
移位规律:左边丢弃,右边补0
2.右移位操作
移位规律:
逻辑移位:左边补0,右边丢弃
算数移位:左边移入的位取决于符号位(符号位为1,用1填充;符号位 为0,用0填充)
标准说明:
无符号值执行所有移位操作默认就是逻辑移位;但对于有符号数,到底采用逻辑移位还是算术移位就取决于编译器。
左移一位有乘2的效果,右移一位有除2的效果(左移右移的效率要比乘除高)。
对于移位操作符,不要移动负数位,这个是标准未定义的。
//写一个函数返回参数二进制中1的个数
方法一
#include<stdio.h>
int count_one_bits(unsigned int value)
{
int count=0;
while(value)
{
if(value%2!=0)
count++;
value=value / 2;
}
return count;
}
int main()
{
unsigned int value;
printf("请输入一个数:");
while ((scanf("%d", &value)) != EOF)
printf("%d\n",count_one_bits(value));
system("pause");
return 0;
}
方法二
#include<stdio.h>
int main()
{
int num=-1;
int i=0;
int count=0;
for(i=0;i<32;i++)
{
if((num>>i)&1)==1)
count++;
}
printf("%d",count);
return 0;
}
位操作符
&按位与 |按位或 ^按位异或
1.A&B :同零为零,同一为一,相异为零
2.A|B :同零为零,同一为一,相异为一
3.A^B :相同为零,相异为一
说明:他们的操作符必须为整数。
//交换两个数的值
#include<stdio.h>
int main()
{
int a = 10;
int b = 20;
a = a^b;
b = a^b;
a = a^b;
printf("a=%d,b=%d", a, b);
system("pause");
return 0;
}
赋值运算符
=
赋值是表达式,表达式就具有一个值;其值就是赋值表达式左值的新值。
结合性(求值顺序):从右到左。
赋值操作符可以连续使用:a=x=y+1;
符合赋值符
+=、-=、*=、/=、%=、<<=、>>=、&= 、^= 、|=
这些操作符都可以写成符合的效果。
如:
int n=n+1;
int i>>=1;
等效于
int n+=1;
int i=i>>1;
单目操作符 ##
! 逻辑取反操作,这个操作符产生一个整型结果0或1
~ 对整型类型操作数进行求补操作
++ 前置
– 后置
产生操作数的正值
产生操作数的负值
& 取地址
~ 对一个数的二进制按位取反
- 间接访问(解引用操作符)
(类型) 强制类型转换
sizeof 判断它操作数的类型长度(以字节为单位)
++:
后置++:先使用,后++ 前置++:先++,后使用 后置--:先使用,后-- 前置--:先--,后使用
&:
int arr[10]={0};
printf(“%p”,&arr);//数组的地址
printf(“%p”,&arr+1);//跳过整个数组的下一个地址
printf(“%p”,arr);//数组首地址
printf(“%p”,arr+1);//数组的第二个元素地址sizeof:
int a=10;
printf(“%d”,sizeof(a));//4
printf(“%d”,sizeof a);//4
printf(“%d”,sizeof(int));//4
sizeof(数组名)——数组名表示整个数组——–计算整个数组的大小—单位是字节
sizeof(&a)//4//地址占四个字节
#include<stdio.h>
int main()
{
int a=10;
int b=20;
printf("%d",sizeof(b=a+5));//sizeof中表达式不参与运算
printf("%d%d",a,b);
return 0;
}
//4 10 20
关系操作符 ##
>
=
<
<=
!=
==//要注意与赋值操作符区分
逻辑操作符
&& 逻辑与
|| 逻辑或
int i=0,a=0,b=2,c=3,d=4,j=0;
i=a++&&++b&&d++//只要与到0,就不再往下计算
j=a++||++b||d++//只要或到真,就不再往下计算
//&&:a=1,b=2,c=3,d=4
//||: a=1,b=3,c=3,d=4
条件操作符
exp1?exp2:exp3//若exp1为真,值为exp2,反之exp3
逗号表达式
逗号操作符用于将两个或着多个表达式分隔开,这些表达式至左向右逐个进行求值,整个逗号表达式的值是
最后那个表达式的值。
int a=1,b=2;
int c=(a>b,a=b+10,a,b=a+1)//c=13
下标引用、函数调用和结构成员
- []
操作数:一个数组名+一个索引值
双目操作符 ()函数调用操作符
接受一个或者多个操作数:第一个操作数是函数名,剩余操作数是传递给函数的参数,
printf(”%p”,APP);//取出的是函数地址和&APP没有区别访问结构成员操作符
. 结构体.成员名
-> 结构体指针->成员名