您的位置:首页 > 编程语言 > C语言/C++

C语言基础知识(二)

2017-04-16 20:57 357 查看
第二部分:类型转换
1、隐式类型转换(自动转换)
在有多种数据类型混合计算的时候,若未人为控制类型,系统会自动进行类型转换
转换的规则是:存储长度较短的转换成存储长度较长的,且不丢失数据
char--->short--->int--->unsigned int(--->long--->unsigned long)--->double
float--------↑

2、赋值转换
如果赋值运算符两侧数据类型不一致,则在赋值时会发生赋值类型转换
1)int型与float型
将float类型赋值给int型时,会舍去小数部分。如:
int a = 3.5;
//此时a的值是3
将int类型赋值给float型时,数值会以float类型存储。如:
float f = 4;
//此时f的值是4.0
2)float型与double型
将double型赋值给float型时,截取7位有效数字存储在float类型中。但要注意不要超过float类型的存储范围(因为double类型存储范围比float类型大)
3)char型与int型
将int类型赋值给char类型时,直接截取低8位存储在char型中。
将char类型赋值给int类型时,分两种情况:
⑴无符号char类型(即unsigned char型),数据存储在int类型低8位,剩下24位补0
⑵有符号char类型,数据存储在int型低8位。若char首位是0,则int型剩下24位补0;若char首位是1,则int型剩下24位补1。
4)int型与long类型(只考虑int型与long类型长度不一致情况)
将long类型赋值给int类型时,直接截断数据,将低位原封不动存储在int型中。
将int类型赋值给long类型时,分两种情况:
⑴无符号int类型(即unsigned int型),数据存储在long类型低位,剩下位补0
⑵有符号int类型,数据存储在long类型低位。若int首位是0,则剩下位补0;若int首位是1,则剩下位补1。

3、强制类型转换
隐式类型转换或赋值转换有时不会得到我们预期的结果,这时我们可以使用强制类型转换来实现我们想要的类型转换结果。
强制类型转换:人为地将某类型转换为另一类型
强制类型转换符:()括号
用法:
(待转换的类型)变量
例如:
float a = 3.5;
(int)a;//将a强制转换成int类型

float pi = 3.1415926;
int x = (int)pi;
在这里x会变成3,而pi还是原数值(3.1415926)。即经过赋值运算后,pi的类型又变回浮点数,pi的值不会变。

第三部分:运算符与表达式
1、表达式
用运算符和括号将操作数连接起来的符合C语言语法规则的句子称为表达式。
如2*y+5中,*和+是运算符,2,y,5是操作数,整个句子符合C语言语法规则。
2、运算符
运算符用于执行程序代码运算,对一个以上的操作数进行运算。
在C语言中,运算符需要至少1个操作数(不超过3个)
在C语言中,把除了控制语句(如if,for等)和输入输出语句以外的几乎所有的基本操作都当做运算符处理。
3、运算符的分类
1)根据结合数的数目分类:
单目运算符:即操作数只有1个的运算符
双目运算符:即操作数有2个的运算符
三目运算符:即操作数有3个的运算符,只有一个( ?: )
2)根据运算符的用途分类:
赋值运算符:如=及其扩展运算符
逻辑运算符:如&&(与)、||(或)、!(非)
算数运算符:如+ - * / %等
关系运算符:如> < >= <= == !=等
位运算符:如<< >>等
条件运算符:只有一个 ?:
逗号运算符:只有一个 , 用于分隔
……
4、运算符的结合顺序
运算符有两种结合顺序:自左至右、自右至左
自左至右(左结合性):表示运算符的操作数是从左向右(先左再右)与运算符结合的,如加法+
例:3 + 5,即3加上5,先取3,再取+,再取5
自右至左(右结合性):表示运算符的操作数是从右向左(先右再左)与运算符结合的,如赋值=
例:a = 3,即先取数3,再给a赋值
5、运算符的优先级
C语言中运算符有优先级,从高到低分为15级(不同书籍划分方式不同,级数不同,这里采用百度百科划分方式),1级优先级最高,15级最低。
混合运算时,先算优先级高的,再算优先级低的(类比数学中,先算乘除,再算加减),同等级运算符则从左向右依次运算

6、算数运算符
符号及含义:+(加) -(减) *(乘) /(除) %(取余)
数目:双目运算符
结合性:自左至右
优先级:+和-:4级。*和/和%:3级
使用方法:表达式 运算符 表达式。如:3+5 a-b等
注意:
⒈C语言中,若相除2个数都是整数,则计算/时只取商,余数部分被舍去。
⒉%的操作数必须是整数

7、正运算符与负运算符
符号及含义:+(正数) -(负数)
数目:单目运算符
结合性:自右至左
优先级:2级
使用方法:+表达式 或 -表达式。如:
int a = 3;
printf("%d\n",-a);//对a取负数,会输出-3

8、关系运算符
符号及含义:>(大于) <(小于) >=(大于等于) <=(小于等于) ==(判等) !=(不等)
数目:双目运算符
结合性:自左至右
优先级:> < >= <=:6级。==和!=:7级
使用方法:表达式 运算符 表达式。如3<5,a==7等
注意:
⒈关系运算符只会返回0或1两个值。其中返回0代表假,返回1代表真。

⒉在C语言中,所有非0的数代表真,0代表假。

⒊注意判断两个表达式相等的运算符是==,与=(赋值运算符)要分开

9、自增运算符与自减运算符
符号及含义:++(自增) --(自减)
数目:单目运算符
结合性:自左至右 或 自右至左(取决于表达式位置)
优先级:2级
使用方法:
自增;表达式++ 或 ++表达式。如a++ 或 ++a
自减:表达式-- 或 --表达式。如b-- 或 --b
注意:
⒈自增自减运算符表示将表达式+1或-1。如:
int a = 3;
a++;
a会变成4。
⒉注意++/--运算符与+/-(正数/负数运算符)是同等优先级。当这两个运算符一起使用时,是右结合性。即-a++ <---等价于---> -(a++);
⒊++在前与++在后的区别(--同理):
++在后(如a++):先使用数,再加1
++在前(如++a):先加1,再使用数
若单独使用自增运算符时,a++ <---等价于---> ++a <---等价于---> a=a+1 <---等价于---> a += 1(见下)

10、逻辑运算符
符号及含义:&&(逻辑与) ||(逻辑或) !(逻辑非)
数目:!为单目运算符,&&和||为双目运算符
结合性:!为自右至左,&&和||为自左至右
优先级:!:2级。&&:11级。||:12级
使用方法:
⒈&&和||:表达式 运算符 表达式。如:a&&b a||b
⒉!:!表达式。如!a
注意:
逻辑运算符用于计算表达式的逻辑关系
⒈逻辑与:当且仅当两个表达式都为真时,则计算结果为真。否则为假
⒉逻辑或:当且仅当两个表达式都为假时,则计算结果为假。否则为真
⒊逻辑非:当原表达式为真时,计算结果为假;当原表达式为假时,计算结果为真
⒋逻辑运算符的返回结果同关系运算符,计算结果为真返回1,计算结果为假返回0

/************************逻辑运算符的短路现象*****************************/
当多个逻辑运算符连续使用的时候,会出现逻辑运算符短路的情况
1、与(&&)运算符短路
表达式1 && 表达式2 && 表达式3
当表达式1是真时,才会去判断表达式2的真/假。否则,如果表达式1是假,则之后的都不会进行运算。
当表达式2是真时,才会去判断表达式3的真/假。否则,如果表达式2是假,则之后的都不会进行运算。
示例:
int a=0,b=1,c=2,d;
d = a++ && b-- && ++c;
程序的执行结果是
a->1,b->1,c->2,d->0
分析:
⒈首先会计算a++,计算a++会首先取出a的值,此时a的值是0
⒉因为此时a的值是0,表达式1(a++)的位置是假,发生短路,后面的表达式2(b--)和表达式3(++c)都不会进行运算,此时返回假(0),赋值给d
⒊执行a++(a的值加1)
2、或(||)运算符短路
表达式1 || 表达式2 || 表达式3
当表达式1是真时,跳过判断表达式2和表达式3,直接返回真;当表达式1是假时,才去判断表达式2的真/假
当表达式2是真时,跳过判断表达式3,直接返回真;当表达式2是假时,才去判断表达式3的真/假
示例:
int a=0,b=1,c=2,d;
d = a++ || b-- || ++c;
程序的执行结果是
a->1 b->0 c->2 d->1
分析:
⒈首先会计算a++,计算a++会首先取出a的值,此时a的值是0
⒉因为此时a的值是0,表达式1(a++)的位置是假,需要判断表达式2(b--)的值
⒊计算b--,首先取出b的值,此时b的值是1
⒋因为此时b的值是1,表达式2(b--)的位置是真,发生短路,无需判断表达式3(++c)的真/假,此时返回真(1),赋值给d
⒌执行a++(a的值加1)和b--(b的值减1)

思考1:
如若将以上2个示例改写成:
d = a++ || b-- && ++c;
程序的执行结果是什么?先猜想结果,再上机验证
答案:
a->1 b->0 c->3 d->1
思考2:
如若将以上2个示例改写成:
int a=1,b=2,c=3,d;
d = a++ || b-- && ++c;
程序的执行结果是什么?先猜想结果,再上机验证
答案:
a->2 b->2 c->3 d->1
注意:这里要特别注意&&的运算优先级比||高。运算优先级高并不代表会先运算,而是代表先与操作数结合。而整个算式还是按照自左至右顺序计算。
在示例2中,因为&&的优先级比||高,因此算式等价于:
d = a++ || (b-- && ++c);
此时进行自左至右的运算,当遇到a为真(1)的时候,整个算式发生了短路,括号内的b--和++c都不会执行
在这里要特别注意运算优先级高不代表会先运算,而是代表先与操作数结合
/***********************逻辑运算符的短路现象end***************************/

11、赋值运算符及复合赋值运算符
符号及含义:=(赋值) +=(加后赋值) -=(减后赋值) *=(乘后赋值) /=(除后赋值) %=(取余后赋值) <<=(左移后赋值) >>=(右移后赋值) &=(按位与后赋值) ^=(按位异或后赋值) |=(按位或后赋值)
数目:未知(取决于是否存在多重赋值)
结合性:自右至左
优先级:14级
使用方法:
一次赋值:待赋值 运算符 表达式。如a=3,a=5+4,a+=5等
多重赋值:将同一个值赋给多个变量的操作,如a=b=c=10。此时a,b,c都为10
复合赋值:先将左值取出,之后与右值进行运算(运算取决于运算符),将运算后的结果再赋值给左值。如:a += 3 -----> a = a + 3

12、条件运算符
符号及含义:?:(判断?前表达式是否成立,若成立取:前表达式,否则取:后表达式)
数目:三目运算符(C语言中唯一的三目运算符)
结合性:自右至左
优先级:13级
使用方法:表达式1?表达式2:表达式3。先判断表达式1是否成立,若成立取表达式2,否则取表达式3。
条件运算符相当于小型的if-else表达式

13、长度运算符
符号及含义:sizeof()(计算括号内数据类型或表达式的大小)
数目:无
结合性:无
优先级:2级
使用方法:sizeof(表达式) 或 sizeof(类型名)
sizeof()用于计算某类型或某表达式所占内存的大小,经常与结构体/数组等连同使用

14、位运算符
注意:位运算符的操作数只能是整数或字符型数。当操作数进行位运算的时候,操作数转换为2进制数。
1)按位运算符
符号及含义:&(按位与) ^(按位异或) |(按位或) ~(按位取反)
数目:&和^和|:双目运算符。~:单目运算符。
结合性:&和^和|:自左至右。~:自右至左
优先级:
~:2级
&:8级
^:9级
|:10级
使用方法:按位运算会先将操作数转换成2进制数,对每一个位(bit)进行运算
按位与&:1&1=1 1&0=0 0&1=0 0&0=0(当且仅当全是1时值才为1,否则为0)
按位异或^:1^1=0 1^0=1 0^1=1 0^0=0(当且仅当两个数不相同时值才为1,否则为0)
按位或|:1|1=1 1|0=1 0|1=1 0|0=0(当且仅当全是0时值才为0,否则为1)
按位取反~:1-->0 0-->1(若是1则变成0,若是0则变成1)
注意:要将&(按位与)和&&(逻辑与)、|(按位或)和||(逻辑或)区分开

在进行位运算时一定要注意运算符优先级。对于不确定优先级的,我们要学会使用()来分隔运算符和操作数

2)移位运算符
符号及含义:<<(左移) >>(右移)
数目:双目运算符
结合性:自左至右
优先级:5级
使用方法:表达式1 左移/右移 表达式2。如a<<3
左移/右移运算符是先将操作数转换成2进制数,然后将这个数向左/右位移x(表达式2的值)位
左移的高位会溢出,直接舍去。低位会补0
右移的低位会溢出,直接舍去。高位补0还是补1见以下规则:
⒈对于无符号数,高位补0
⒉对于有符号数,若为非负数(即最高位(符号位)是0),则高位也是补0。若为负数,在高位补0还是补1取决于系统。补0的称之为“逻辑右移”,补1的称之为“算数右移”
对于整数,左移x位相当于乘2的x次方,右移x位相当于除2的x次方

15、逗号运算符
符号及含义:,(分隔作用)
数目:未知
结合性:自左至右
优先级:15级(最低)
使用方法:表达式,表达式……
逗号运算符是运算符里优先级最低的运算符,仅仅起到分隔的作用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言