操作符详解

目录

操作符的分类:

算术操作符:+ - * / % (加减乘除)

移位操作符: <<  >>(左移右移)

位操作符: & | ^  (按位与,按位或,按位异或)

赋值操作符:=   +=    -=   *=    /=   %=   >>=   <<=   &=    |=   ^=

单目操作符:|  -  +   &   sizeof   ~    --    ++    *

关系操作符:>   >=   <     <=   !=    ==  

逻辑操作符  &&     ||

条件操作符  exp1 ? exp 2 : exp3

逗号表达式  exp1,exp2,exp3,.....expN

下标引用、函数调用和结构成员[]   ()   .   _>


1.算术操作符:+ - * / % (加减乘除)

  1. 除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。
  2. 对于 / 操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。
  3. % 操作符的两个操作数必须为整数。返回的是整除之后的余数。
2.移位操作符: <<  >>(左移右移)
  二进制位有三种:原码,反码,补码。二进制的第一位是符号位,负数是1,正数是0。左移右移是移动数字的二进制位--补码。正数的原码反码补码相同。
例如:-9
           -9= -(2³+2零次方)
.........2^62^52^42^32^22^12^0
原码10000000000000000000000000001001
反码11111111111111111111111111110110
补码11111111111111111111111111111111

反码=原码符号位不变,其它位按位取反

补码=反码+1

1.  <<左移:补码左n位抛弃,右边补n个0

补码11111111111111111111111111111111
首位1丢弃,末尾补0
丢111111111111111111111111111111111补0

  2.>>右移:

  1. 逻辑右移:右边n位丢弃,左边n位补0
  2. 算术右移:右边n位丢弃,左边原符号位填充,剩余补0(负数符号位是1,正数符号位是0)
 逻辑右移
补码11111111111111111111111111111111
补011111111111111111111111111111111丢1
算术右移
补码11111111111111111111111111111111
补111111111111111111111111111111111丢1
3.位操作符: & | ^  (按位与,按位或,按位异或)
  &  操作符两边对应的数的补码按位与,两者均为一,结果为一,否则为0 
   |   操作符两边对应的数的补码按位或,两者存在为一,结果为一,否则为0 
  ^  操作符两边对应的数的补码按位异或,相同为0,不同为1,0^n=n
例如:3^3=0; 
           3^5=2³+2²+2零次方=8+1=9
           3=2一次方+2零次方
           5=2²+2零次方
3的补码0011
5的补码0101
3^50110

练习:如何让不创建中间变量,实现两个数的交换
提示:利用按位异或
​
#include <stdio.h>
int main()
{
 int a = 10;
 int b = 20;
 a = a^b;
 b = a^b;     //a已经改变,b=a^b^b,b^b=0,a^0=a
 a = a^b;
 printf("a = %d b = %d\n", a, b);
 return 0;
}

​

4.赋值操作符:=   +=    -=   *=    /=   %=   >>=   <<=   &=    |=   ^=

i nt x = 10;
x = x+10;
x += 10;  复合赋值
其他运算符一样的道理。这样写更加简洁。
5.单目操作符:|  -  +   &   sizeof   ~    --    ++    *
!                  逻辑反操作
-                  负值
+                 正值
&                 取地址
sizeof          操作数的类型长度(以字节为单位)
~                 对一个数的二进制按位取反
--                 前置、后置--
++               前置、后置++
*                  间接访问操作符(解引用操作符)
前置++,--
++a  先对a进行自增,然后对使用a,也就是表达式的值是a自增之后的值
--a   先对a进行自减,然后对使用a,也就是表达式的值是a自减之后的值
后置++,--
a++  先对a先使用,再增加
a--    先对a先使用,再自减
sizeof有三种语法形式
1. sizeof( object );             // sizeof( 对象 );
2. sizeof( type_name );     // sizeof( 类型 );
3. sizeof object;                 // sizeof 对象;
所以,
int i;
sizeof( i );      √       
sizeof i;         √ 
sizeof( int );   √ 
sizeof int;       ×
数组的sizeof值等于数组所占用的内存字节数
6.关系操作符:>   >=   <     <=   !=    ==  
    注意:==相等,=赋值
7.逻辑操作符  &&     ||
&&逻辑与:有0结果为0
||   逻辑或 : 有一个非0,结果为1
1 & 2 = 0        按位与
1 && 2 = 1      逻辑与
1 | 2 = 3          按位或
1 || 2 = 1         逻辑或
练习
#include <stdio.h>
int main ()
{
    int i = 0 , a = 0 , b = 2 , c = 3 , d = 4 ;
    i = a ++ && ++ b && d ++ ;
    printf ( "a = %d b = %d c = %d d = %d " , a , b , c , d );
    return 0 ;
}
// 程序输出的结果是什么?
a++为0,&&左侧出现0,则后面的++b,d++都为假,不计算,但此时输出时a进行了自增,为1
输出:1234
#include <stdio.h>
int main ()
{
    int i = 0 , a = 1 , b = 2 , c = 3 , d = 4 ;
    i = a++||++b||d++;
    printf ( "a = %d  b = %d  c = %d  d = %d " , a , b , c , d );
    return 0 ;
}
//程序输出的结果是什么?
a++为1,为真,||后面的均为真不继续计算,但此时a自增
输出 :2234
8.条件操作符  exp1 ? exp 2 : exp3
a>5  ? 3 : -3
等价于
if ( a > 5 )
        b = 3 ;
else
        b = - 3 ;
9.逗号表达式  exp1,exp2,exp3,.....expN
逗号表达式,就是用逗号隔开的多个表达式。
逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果。
10.下标引用、函数调用和结构成员[]   ()   .   _>
       1. [ ] 下标引用操作符
        操作数:一个数组名 + 一个索引值
         int arr [ 10 ]; // 创建数组
         arr [ 9 ] = 10 ; // 实用下标引用操作符。
         [ ] 的两个操作数是 arr 9
      2.  ( ) 函数调用操作符,接受一个或者多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数。
       
#include <stdio.h>
void test1 ()
{
printf ( "hello\n" );
}
void test2 ( const char * str )
{
printf ( "%s\n" , str );
}
int main ()
{
test1 ();                                ()作为函数调用操作符。
test2 ( "hello world" );             ()作为函数调用操作符。
return 0 ;
}

3.访问一个结构的成员 

. 结构体 . 成员名
-> 结构体指针 -> 成员名
创建一个结构体类型 struct  Stu
struct Stu
{
   char name[];
    int age;
     char id[];
};
int main()
{
int a=0
struct  Stu s1={李某某,26,142321995....};
struct Stu*ps=&s1;
printf("%s\n",ps->name);
printf("%s\n",ps->age);   结构体指针->成员名
printf("%s\n",s1.id);        结构体.成员名

  • 8
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

看着不爽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值