总结操作符

C语言的操作符有很多,有算术操作符、移位操作符、位操作符、赋值操作符、单目操作符、关系操作符、逻辑操作符、条件操作符、逗号操作符、下标引用、函数调用和结构成员操作符等,那么,它们的具体使用是怎么样的呢?
1.算术操作符
算术操作符有+、-、*、/、%(整数求余)等。
说明:
(1)它们的结合性都是从左向右的。
(2)+、-、*、/的操作数可以是int型、float型、double型,%的操作数只能是整型。
(3)/:如果操作数都是整型,结果为整型。整数的得到并不是四舍五入,而是取整数部分,舍去小数。如果操作数有一个是浮点型,则结果为浮点型。a/b为a除以b的值
(4)%:模数,求余符号。a%b得到的是a除以b的余数。

2.移位操作符
左移操作符:<<       右移操作符:>>      两者对数的运算都是先将数化为二进制数,再进行左右移操作,从而改变原数的值
(1)<<
移位规则:左边抛弃,右边补0.
如:int num=9;int b=num<<2;  9的二进制表示为00000000000000000000000000001001,左移两位为00000000000000000000000000100100,十进制为36.
运算规律为:给一个数左移n位,相当于乘以2的n次方。
(2)>>
移位规则:右移运算分为两种:逻辑移位和算术移位,这取决于编译器。
(a)逻辑移位:左边用0填充,右边丢弃。
如:int num=-1; int b=num>>1;     -1在二进制中应该表示为:11111111111111111111111111111111,右移移位后变为01111111111111111111111111111111,化为十进制改变了原数的符号和值。
(b)算术移位(常用):左边用原该数的符号位填充,右边丢弃。
如:int num=-1; int b=num>>1;     -1在二进制中应该表示为:11111111111111111111111111111111,右移移位后变为11111111111111111111111111111111,化为十进制没有改变原数的符号。
注意:对于移位运算符,不要移动负数位。

3.位操作符:
(1)按位与:&      规则:先化为二进制数,一位一位&,同为1才为1。
如:int a=3,b=4;  int c=a&b;     a的二进制为00000000000000000000000000000011
                                                   b的二进制为00000000000000000000000000000100
                                             那么c的二进制为00000000000000000000000000000000
用途:用于求一个数二进制中1的个数。
如:int count=0;int m;
while(m)   {    m=m&(m-1);count++;}   count表示的是m化为二进制1的个数。
(2)按位或: |         规则:先化为二进制数,一位一位|,同为0才为0。
规则:先化为二进制数,一位一位|,同为0才为0。
如:int a=3,b=4;  int c=a&b;     a的二进制为00000000000000000000000000000011
                                                   b的二进制为00000000000000000000000000000100
                                             那么c的二进制为00000000000000000000000000000111
(3)按位异或:^      规则:先化为二进制数,一位一位^,相同为假,相异为真。
如:int a=3,b=4;  int c=a&b;     a的二进制为00000000000000000000000000000011
                                                   b的二进制为00000000000000000000000000000100
                                             那么c的二进制为00000000000000000000000000000111
用途:交换两个变量的值。
int num1=10;int num2=20; num1=num1^num2;num2=num1^num2;num1=num2^num1;
num1的二进制为00000000000000000000000000001010,
num2的二进制为00000000000000000000000000010100,
异或后num1=    00000000000000000000000000011110,
异或后num2=    00000000000000000000000000001010,即变为num1.
异或后num1=    00000000000000000000000000010100,即变为num2.

4.赋值操作符
(1)=:赋值操作符的左侧必须为一个变量。可以用在给变量定义并初始化时,也可以用在定义后给变量赋值。
如: int a=2;                   int b;  b=1;
=自右向左结合
(2)复合赋值符:+=、-=、*=、/=、%=、>>=、<<=、&=、|=、^=
这些赋值符都是自右向左结合。
5.单目运算符

(1)!   逻辑反操作
用法:int a=10;printf("%d",!a);  结果 :0       
(2)-    负值    R-L    (表示从右向左结合)    
(3)+   正值    R-L            
(4)sizeof    操作数的类型长度(以字节为单位)
如:char arr[]="abcdef";  printf("%d",sizeof(arr));结果输出7,这是因为系统自动给字符串的末尾加上‘\0'.
(5)~  对一个数的二进制按位取反。
如:int a=5;  int b=~a;   printf("%d",b);
5的二进制为00000000000000000000000000000101
按位取反为  11111111111111111111111111111010
最高位是1,说明是负数。负数以原码的补码存储在二进制中。原码转换补码的方法是:符号位不变,其它位按位取反,再给末位加1.反过来求:先减1,按位取反,符号位不变。所以b的原码是10000000000000000000000000000110,化为十进制为-6.(6)--  自减符号
用法:--i  :在使用i之前给i减1.         i++:  在使用i之后给i加1.
如:int  i=5;   int m=--i;  int n=i--;  那么m的值是4,n的值是5.
(7)++  自加符号
用法:++i:在使用i之前加1      i++:在使用i之后加1.
如:int  i=5;  int m=++i;  int  n=i++;那么m的值是6,n的值是5.
(8)&  取地址  R-L 
如:int i;  int* p;  p=&i;   那么p存放的是i的地址。
(9)*  间接访问操作符   
对指针变量前加*可以间接访问指针变量所指向的变量。
如:int num=10;  int *p=&num;   *p=20;   那么num的值变为了20.
(10)(类型符)  强制转换类型符
如:int  a=1;   double b=(double)(a);   这就实现了把a的值先转换为浮点型后再赋给b.

6.关系操作符
有>、<、>=、<=、!=(测试“不相等“)、==(测试相等),多用于判断或循环结构。
注意:在写判断条件时,一定不能把==写成=。=为赋值符号。这些操作符在判断中的值都是1或0,即真或假。
如:int age=0;  if(18<=age<=30)   printf("成年“);  计算前面18<=age,结果为0,再算后面0<=30,则整个表达式的值为1,输出”成年“。但实际上并不是要这样输出,应改为if((age>=18)&&(age<=30)).


7.逻辑操作符
&&   逻辑与         ||   逻辑或
用法:(表达式)&&(表达式)   当两个表达式的值都为真时,结果才为真。
         (表达式)||(表达式)          当两个表达式的值都为假时,结果才是假。
当一个大的表达式中有多个逻辑与或逻辑或时,只要可以判断出整个表达式的值,后面的表达式就不再执行。
如:int  i=0,a=0,b=2,c=3,d=4;    i=a++&&++b&&d++;   printf("a=%d b=%d c=%d d=%d\n",a,b,c,d);
分析:a++为0,a变为1.0&&任何数都是0,所以后面的表达式不再执行。结果:1,2,3,4
区分逻辑与和按位与:
如:  int  a=1,b=2;  
1&2:   1的二进制是00000000000000000000000000000001,
          2的二进制是00000000000000000000000000000010,
            那么1&2是11111111111111111111111111111100.
1&&2:左式为1,右式也为1,表达式为1.

8.条件操作符
(表达式1)?(表达式2):(表达式3)     判断表达式1,如果为真,则执行表达式2,否则执行表达式3.
如:c=a>b?a:b;   表示把a和b中的较大值赋给c。

9.逗号表达式
表达式1,表达式2,表达式3……表达式n.   从左向右依次执行,整个表达式的值为最后一个表达式的值。


10.下标引用
[ ]   有两个操作数:一个数组名+一个索引值    如:arr[1]指数组arr下标是1的元素。数组下标的数据类型可以是整型常量或整型表达式。
11.函数调用操作符
()操作数=函数名+参数,第一个操作数是函数名,剩下的操作数是传递给函数的参数。
如:Swap(&a,&b);   表示调用Swap函数,把a的地址和b的地址作为实参传给Swap.
12.访问结构成员的运算符
.  结构体.成员  结构体对象访问成员方式    如:stu.name表示引用结构体stu的name成员。
->结构体指针->成员名   指向结构体对象的指针访问成员方式    如:struct stu;   struct stu* pstu=&stu;  pstu->age=20;定义了一个结构体变量stu和指向结构体stu的指针变量pstu.pstu->age相当于stu.age,即把20赋给stu.age。


操作符的优先性由高到低分别是:()函数调用 、[ ] 下标引用、. 访问结构成员、-> 访问结构指针成员、++后缀自增、--后缀自减、! 逻辑反、~ 按位取反、+ 表示正值、- 表示负值、++ 前缀自增、-- 前缀自减、* 间接访问、& 取地址、 sizeof 计算字节大小,单位是字节。、(类型) 类型转换



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值