C语言操作符(运算符)详解

1、C语言的操作符有以下几种类型

 2、算数操作符

+ - * / %五种

/ 分为:整数除法10/3=0   浮点数除法  10.0/3=3.333333(/两边至少有一个操作数为浮点数)   

%取余/取模     10%3==1     左右两边的操作数都要为整型类型

3、移位操作符

位是指二进制位,操作数只能是整数。对整数的二进制位进行移动

对于一个整型,有4个字节32位(二进制位),有原码、反码、补码三种表示形式,内存中存的是补码    所以在参与移位的时候,移动的都是补码    但%d打印出来的都是原码

<<左移操作符

补码整体向左移动,左边的丢掉,右边补0,然后再变回去原码   如:a=-1,a<<1==-20     a=10   a<<1==20,a向左移动一位的结果是20,但a本身大小不变,操作符可理解为运算符,仅表示进行一种运算。  不一定都是严格*2,要按照补码进行运算,但大部分范围内都是*2                                 有符号的int范围是  -2^31----2^31-1  21亿多的一个数

>>右移操作符

1、算术右移(平常见的)  右边丢掉,左边补原来的符号位

2、逻辑右移  右边丢掉,左边直接补0

4、位操作符(包括符号位)

操作数必须是整数,对二进制位进行操作,对内存中二进制位的补码进行操作

&按位与   都是1才是1,有一个是0就是0

|按位或    都是0才是0,有一个是1就是1

^按位异或  相同为0,相异为1

有几个特点    1、a^a=0完全相同没有异   2、a^0=a完全不同还是本身

3、a^a^b=a^b^a=b  异或支持交换律    5^5^3=5^3^5

    

a^b很重要,^a得到b   ^b得到a。  上图为不创建第三个变量来交换两个变量值的方法,不产生进位,所以没有溢出,从而解决了问题。                                                                           

 5、赋值操作符

a=x=y+1 可以从右向左连续赋值,但不好调试且可读性差,可以拆成x=y+1,a=x

复合赋值符

 6、单目操作符

目指的是操作数,单目操作符只有一个操作数

补充:布尔类型(C99标准中引入),用来表示真假的类型  头文件#include<stdbool.h>         _Bool flag=true或false,在判断素数的函数中,也可以使用布尔类型,return true-1/false-0  

补充:如果unsigned int a=-10把负十赋给一个无符号整型a,相当于把-10的补码给a,但取出的时候没有符号位,当成有效位,%u(打印无符号数)打印出一个很大的数  42亿多 32位

sizeof运算符,运算这个操作数/类型  占用内存的大小

sizeof内部的表达式不参与实际计算  整型数据放到短整型中会发生截断 

~按位取反操作符,符号位也取反。    ~0=-1

位操作符结合~&|^操作符  可以实现对某个数的二进制的某一位进行具体操作

a=10  b=a++  -->a=11,b=10 有a++,a就会改变,  a++-->a=a+1  ==  a+=1

++和--带有副作用,会使自身的值发生改变

强制类型转换 

 int a=(int)3.14   可能会导致数据丢失,同时例如结构体等类型没法进行强转

6、2sizeof和数组

sizeof(arr)求的是整个数组所占内存的大小

将arr传参传入函数内部时,接收可以用指针和数组两种形式来接收,但实质上还是指针,此时sizeof(arr)求的是这个指针变量的大小 

 7、关系操作符

比较大小   是否相等  !=       ==

注意:区分=和==一个是赋值,一个是等于,比较容易出错

8、逻辑操作符

逻辑操作符与为操作符&和|不同,前者只关注逻辑上的真与假

逻辑与&&(并且)   两个都是真才为真,有一个假就是假。

逻辑或  | |(或者)   有一个是真就是真,两个都假才是假。

0表示真,非0表示假,逻辑操作符/运算符在  判断时  返回0或非0表示真假,逻辑表达式1为真

被注释的结果是1 2 3 4,没被注释的结果是1 3 3 4

&& 有一个为假,其他全为假,不用看和计算 

||有一个为真,结果就为真即1,把1赋给i,不进行后续d++的计算

9、条件操作符(三目操作符)

(exp1?exp2:exp3)(exp为表达式)

exp1为真,exp2作为整个表达式的结果

exp1为假,exp3作为整个表达式的结果

10、逗号表达式

(epx1,exp2,exp3,.....expN)

逗号隔开的多个表达式,从左向右一次执行,整个表达式的结果是最后一个表达式的结果

虽然表达式的结果是最后一个表达式的结果,但是前面的步骤可能会影响最后一个表达式的参数,因而影响最终结果,必须从左到右排着计算。

11、下标引用操作符、函数调用、结构成员

 arr[4]  操作数为函数名arr和参数4

strlen(“abcdef”) 函数名和参数      至少一个参数(为函数名,有时可以没有参数)

结构成员

C语言中的内置类型有int char  float等

还有自定义(聚合类型)的类型:结构体、枚举、联合体…… 它们产生的原因是生活中有些对象被描述时,不能简单的使用单个的内置类型   如一本书、一个学生   包含多种元素信息 复杂描述

name、author、price都是结构成员,用  .  来访问 

.的左边为变量名,右边为成员名

用结构体指针指向成员名,注意结构体要定义在print函数之前,不然找不到结构体

得到结构体变量  用.      得到结构体指针   用-> 

同时注意传值调用和传址调用

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值