操作符详解

操作符分类:
算数操作符:+—*、‘
做除法时,要想结果为小数且正确,那么两数中必须有一个数是小数;
double a=7/2;那么a结果为3.00000;
取余操作符两边应该是整数不能是小数;
移位:<<,>>
其对象必须是整数,移动的是二进制位,且  不能移动负位数。

<<左移位操作符,int m=7;(00000000000000000000000000000111)
int n=m<<1;m左移一位是指将m的二进制的补码第一位丢弃,在最后一位后面补一个零:00000000000000000000000000001110,结果为14;注意这不会改变m的值,因此结果为m=7,n=14;
>>右移操作符
2种右移方式:逻辑右移(补码的最后一位丢弃,在第一位前补0 ),运算右移(补码的最后一位丢弃,在第一位前补原符号位,即负数补1整数补0);大部分编译器都是算术右移(因为逻辑右移会把负数变成整数).
整数二进制有三种表现形式:
原码:按照数值的正负,直接写出二进制序列。一个整数四个字节(32个比特位);对于有符号的整数来说,最高位的1位是符号位;符号位是1表示负数,符号位是0表示正数;对于无符号整数来说,所有位都是有效位 。
eg:10,原码:       00000000000000000000000000001010;
-10:1000000000000000000000000001010
对于正整数来说,原码,反码,补码相同,无需计算;
负整数的反码和补码计算:
反码:原码的符号位不变,其余位按位取反;-10:11111111111111111111111111110101
补码:反码的二进制加1;
-10:11111111111111111111111111110110
内存中都是用补码进行运算;
补码取反加一也能获得原码;
位操作符(操作数必须是整数):
&:按位与;
二进制补码位同时为1则为1,一个为0则为0;
int a=3;
00000000000000000000000000000011;
int b=1; 
00000000000000000000000000000001;
int c=a&b;
c:00000000000000000000000000000001;
(因为a与b只有最后一位同时为1)
|:按位或;
二进制补码两个同时为0才为0,有一个为1才为1;
int a=3;
00000000000000000000000000000011;
int b=-5;
10000000000000000000000000000101
11111111111111111111111111111010
11111111111111111111111111111011
int c=a|b;(c为-5;)
c的补码:11111111111111111111111111111011
c的反码:
11111111111111111111111111111010
c的原码:
10000000000000000000000000000101
^:按位异或;
二进制补码位相同为0,相异为1;
int a=3;b=-5; c=a^b(c结果为8);
a^a==a;  0^a==a
不创建临时变量,实现两数交换:
法1:int a=3;   
         int b=5;
         a=a+b ;b=a-b;a=a-b;
法2(效率低):a=a^b;b=a^b(3^5^5=3^0=3);b=a^b

赋值操作符:= +=,-=,*=,,,,,,
ina a=1;//不叫赋值叫初始化;
a=x=y+1;//连续赋值,从右到左计算,不推荐,分开写更清晰;
单目操作符:
!:逻辑反操作,int flag=0; if(!flag){}.!flag后条件为真;
-:取负;
&:取地址操作符
*:*p//对p进行解引用操作。
sizeof:计算类型创建的变量大小(以字节为单位).计算结果类型是size_t,无符号整形杨说明sizeof不是函数。后面的开好中在括号内写的不是类型的时候,括号可以省略,zhe
eg: int a=10;
printf("%zd\n",sizeof(a));//4
printf("%zd\n",sizeofa);//4
printf("%zd\n",sizeof(int));//4
int arr[10];
sizeof(arr)//40:
sizeof(arr[0])//4;
计算数组元素个数:sizeof(arr)/sizeof(arr[0]);
~:按位(二进制补码 )取反(即全部取反)
int a=0;
c=~a;//-1
记:-1的补码是全1 
sizeof和数组
当数组作为形参时,void a(int(char) arr[]){
sizeof(arr),结果为4或者8(32位或64位),因为此时数组相当于指针,括号中的相当于int(char)* p,因此sizeof求出的是指针地址 的大小。
}
++:自增1操作
分为前置和后置:++a(先加1后使用)    a++(先使用后加1)
int a=5; 

b=a++
printf("b=%d\n",b)//5
b=++a
printf("a=%d\n",b)//6
强制转换:
int a=(int)3.14; 被识别为 double类型,所以想要存储到a里面需 要类型转换。
 
逻辑运算符:
int i=0,a=0,b=2,c=3,d=4;
i=a++&&++b&&d++;
此时由于a++是先赋值后使用,a++给出的值时0,所以这个逻辑语为假,a++之后的就不再进行计算,故b,d的值不会改变,a为1,i为0
同时在||中,如果第一个为真那么后面的运算也不再进行; 
条件操作符(三目操作符)
exp1?exp2  :  exp3     exp1?   exp2  :  exp3
真       计算    不算       假     不算      计算
计算的表达式时整个表达式的最终结果
eg:a>b?a:b(如果a大于b,那么将a的值作为返回结果) ; 
逗号表达式:
从左向右依此计算,结果为最后一个表达式的结果
下标引用:
操作数:数组名+一个索引值
函数调用操作符:
printf(),这个括号就叫函数调用操作符,
函数名也是操作数,剩余的操作数是传递给函数的参数;
 访问结构成员:
结构体变量.成员
结构体指针->成员
结构体b想要访问变量值(name):b.name
隐式类型转换:
1,整型提升
当char类型或者短整型进行计算时转换成int
将原来补码二进制第一位补齐成32位。
类型计算
int即为 signed int;
char进行整形转换后时singed char还是unsinged int 取决于编译器;
char a=5
由于char是8个比特,所以a的存储为:
00000101;
计算时通过整型提升后为:
000000000000000000000000000000101;
char b=126;
01111110;
00000000000000000000000001111110;
char c=a+b
c为10000011
整形提升后为(补码):11111111111111111111111110000011
原码:1000000000000000000000001111101;
c结果为-125;
只有char 或short在计算时才会提升;
int c=1;
printf("%d",sizeof(c))//1
printf("%d",sizeof(+c))//4
2,算数转换(操作数大于整形)
long double          向上转换,即大于整形的
double                   各种操作数放一起时,计
float                       算中,会转换为更高的类
unsinged long int  型(左侧中下的会转换
long int                   为上的)
unsinged int
int
操作符属性:
1操作符的优先级
2操作符的结合性
3是否控制求值顺序
写代码最好拆开写:a*b+c*d+e*f要么加括号要么分开写,不然哪个*先进行都不知道。

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值