操作符详解2与结构体再次简单介绍

取反操作符(~)

对二进制补码的每一位按位取反(包括符号位)

前置++与后置++与前置--与后置--

1.++与--都分为前置与后置,后置++的规则是先在代码语句中使用,在自增1。前置++是先自增1,然后再在代码语句中使用(不管是在打印,赋值,还是函数啊等等,都一样)

2.++与--都是带有副作用的,就是说会对自己本身起作用。而比如说:b=a+1,这样子的话对a是没有影响的

3.当然++与--不一定只有整数才可以这样操作,后期我们还会讲指针也可以这样进行操作

间接访问操作符(解引用操作符)* 

1. *叫做间接访问操作符也叫做解引用操作符,这个符号与取地址&是一对的,两个一般都是搭配起来一起使用的

(类型) 强制类型转化

1. (类型)数据,这个叫做对数据强制类型转换,当你感觉类型用的不爽的时候,可以用强制类型转化。比如:

srand((unsigned int)time(NULL));

对于sizeof与数组传参的一些补充

1.数组传参,形参可以写成数组,也可以写成指针,而实参就是数组名。

2.但不管人摸狗样写成什么东西,数组名在函数内部本质上是一个指针,也就是数组首元素的地址(地址与指针是同一回事),其实写成数组,本质上上也是指针。既然是数组首元素的地址\指针,那么在32位机器上,变量的每一个地址都是一个32位的二进制序列(比特位),也就是说占了4个字节。

3.这里尤其要注意:字符的地址也是地址,整形的地址也是地址,虽然字符占一个字节,而整形占四个字节,但是它们的地址的大小都是一样的。

4. 关于sizeof其实我们之前已经见过了,可以求变量(类型)所占空间的大小,单位字节。

5.sizeof返回的是一个无符号的整形,在打印的时候最好用%zd,但%zd与%d打印出来也一样,你用%u也是可以的。

6.补充:%s是用来打印字符串的,如果你要打印整形数组的话,只能循环一个一个的打印,然后在这个循环里面,可以用下标访问进行打印,用指针也可以进行打印。
在这边还是得再尤其强调一次,当用数组传参的时候(比如说是实参就是数组名arr),不管你形参用什么去接收,在函数体里面,arr本质上就是代表一个指针,代表元素的地址。如果你要访问某一个数组的元素,用arr[ i ]与*(arr+i)都是一样的一个道理,这两种表达中,后者更为底层,因为前一种表达运行时实际上也是转化为后一种表达。

关系操作符

1.关系操作符实际上就是比较大小与相不相等。

逻辑操作符 

1.逻辑操作符就两个,一个是逻辑与&&(并且的意思),一个是逻辑或 ||(或者的意思)。这个要与之前讲的操作符进行区分,&表示按位与,|表示按位或,这两个操作符是通过二进制计算的。而逻辑与与逻辑或才不关注什么二进制,它关注的只有真假。在这边又得强调一下:在c语言当中,0表示假,非0表示真。

如:判断闰年

if (((y%4==0)&&(y%100!=0))||(y%400==0))

2.在逻辑表达式当中,如果为真,就以1作为结果,如果为假,就以0作为结果。

3.对于并且(&&)操作符而言,只要一旦左边发面有假(或为0),那么在操作符右边就不会运行下去了无需计算,因为反正最后的结果肯定是假,因此操作符右边的式子的效果不会产生,因为根本就没有执行。这个叫做短路。

 

4. 对于或者( | |)操作符而言,只要一旦左边发面有真(或为非0),那么在操作符右边就不会运行下去了无需计算,因为反正最后的结果肯定是真,因此操作符右边的式子的效果不会产生,因为根本就没有执行。这个叫做短路。

条件操作符

1. 接下来是条件操作符,这个其实也不难,其实就是这么一个形式:exp1 ? exp2 :  exp3。其中这个exp叫做表达式。那么这个条件操作符到底是怎么执行的呢?其实也可以把这个当做一个整体表达式。
如果表达式1为真,那么表达式2需要计算,表达式3不用管,然后整个表达式的结果就是表达式2的结果。
如果表达式1为假,那么表达式2不用计算,计算表达式3,然后整个表达式的结果就是表达式3的结果。
总而言之,先去看表达式1到底是不是真,还是假。
这个条件操作符也叫做三目操作符 

2.这个条件操作符一般可以用来表达逻辑较为简单的if, else语句,对于逻辑复杂的并不适用

判断两数大小

a>b?a:b

求绝对值

a>0?a:-a

逗号表达式

1.接下来讲一下逗号表达式,逗号表达式其实就是用逗号隔开的多个表达式:exp1,exp2,exp3,exp4,exp5........expn。那么它的计算规则是怎么样的呢?它是从左向右依次执行,整个表达式的结果就是最后一个表达式(expn)的结果,但是别忘了之前的那些表达式都会被依次执行,会产生各种各样的效果。

2. 再次强调一下赋值运算符=,是先执行右边,然后再把等号右边的东西赋给等号左边

3. 虽然逗号表达式的结果是最后一个小表达式,但是之前那些表达式都是依次执行的,有些可能不会产生效果,但是有些表达式是会产生效果的。总而言之,之前那些表达式也不能忽略,也是都要运行的。不然,我干嘛不直接写最后一个表达式

下标引用、函数调用和结构成员

1.下标引用操作符[ ],运用在数组当中,这个操作符的操作数有两个,一个是数组名,一个是下标。

2. 函数调用操作符(),我们都知道在调用函数的时候,后面这个括号是不能够省略的,无论有没有参数,你都必须得带一个括号。这个操作符的操作数有两个,一个是函数名,另外一个是函数参数。

结构体再次稍微了解

1. 其实我们学到今天用的最多的是诸如char, int, short, long, longlong, float, double, int*, char*...这些类型,这些类型都叫做内置类型,在我们c语言中除了这些内置类型之外,还有自定义类型。这个自定义类型有那么几种:结构体,枚举,联合体。现在先简单的介绍一下结构体。
2. 结构体其实是一种自定义类型(也叫聚合类型),那为什么是这么叫的呢?因为我们发现在生活中,有些对象要被描述的话,不能简单的使用单个内置类型。比方说我要描述一本书,我总不能说书为3.14吧。书的话我们一般有书名,作者,出版社,定价等等。所以你会发现任何一个复杂的对象,不可能就单单运用什么内置类型比如说一个数字,一个浮点数就可以描述清楚的。它需要复杂的描述形式。比如说以书为例,书名是字符串,作者与出版社也是字符串,定价是浮点数等等,好像把什么字符数组啊,整形啊好像结合在一起,这就是所谓的聚合:把一些简单的类型多个聚合在一起,我们就把这个叫做结构体。

3. 那到底怎么去做呢?这个时候给了一个关键字:struct,可以去自定义类型,比如说:struct book,注意此时类型的名字就叫做:struct book,与那些int, char地位平等,大家都是类型嘛。4. 有了这个类型,可以来创建变量,创建变量如果初始化的时候,有一个大括号{  },里面用具体的东西去填充结构体类型当中的结构体成员。

(补充一下:结构体变量如果创建之后,还要创建一个指针变量,那么道理也一样的,就比如:struct Stu* pa)
5. 然后接下来是打印的问题,要打印我肯定是打印结构体成员,那么这个时候怎么打印呢?我们只需要变量名.结构体成员即可打印。因此你会发现这个“.”左边是结构体变量,右边是结构体成员名。事实上,结构体变量也可以对地址解引用得到。
6. 然而事实上还有一种方法,结构体变量的指针->结构体成员,这时候左边是结构体指针,右边是结构体成员名。这两种方法其实一样。如果你得到结构体变量,那么就可以用  .  ,如果你得到结构体(变量的)指针,你也可以用箭头。

TIPS

1. 再次警告一下:如果函数传参的时候不是传址调用,那么形参就是实参的一个临时拷贝,你在函数体内改来改去,不会影响我的实参。结构体变量与平时我们再讲的一些变量,道理其实是一样的,地位平等。当你用传址调用时,函数体内部的造成变化是会对全局有影响。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

絕知此事要躬行

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

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

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

打赏作者

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

抵扣说明:

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

余额充值