C语言开发之运算符、表达式用法

2016-12-14 09:57:01来源:http://blog.csdn.net/Jsetc_Linux/article/details/7768802作者:Jsetc_Linux人点击

C语言中运算符和表达式数量之多,在高级语言中是少见的。正是丰富的运算符和表达式使C语言功能十分完善。这也是C语言的主要特点之一。C语言的运算符不仅具有不同的优先级,而且还有一个特点,就是它的结合性。在表达式中,各运算量参与运算的先后顺序不仅要遵守运算符优先级别的规定,还要受运算符结合性的制约,以便确定是自左向右进行运算还是自右向左进行运算。这种结合性是其它高级语言的运算符所没有的,因此也增加了C语言的复杂性。


运算符简介


C语言的运算符可分为以下几类:


1.
算术运算符:用于各类数值运算。包括加(+)、减(-)、乘(*)、除(/)、求余(或称模运算,%)、自增(++)、自减(--)共七种。


2.
关系运算符:用于比较运算。包括大于(>)、小于(<)、等于(==)、大于等于(>=)、小于等于(<=)和不等于(!=)六种。


3.
逻辑运算符:用于逻辑运算。包括与(&&)、或(||)、非(!)三种。


4.
位操作运算符:参与运算的量,按二进制位进行运算。包括位与(&)、位或(|)、位非(~)、位异或(^)、左移(<<)、右移(>>)六种。


5.
赋值运算符:用于赋值运算,分为简单赋值(=)、复合算术赋值(+=,-=,*=,/=,%=)和复合位运算赋值(&=,|=,^=,>>=,<<=)三类共十一种。


6.
条件运算符:这是一个三目运算符,用于条件求值(?:)


7.
逗号运算符:用于把若干表达式组合成一个表达式()


8.
指针运算符:用于取内容(*)和取地址(&)二种运算。


9.
求字节数运算符:用于计算数据类型所占的字节数(sizeof)


10.
特殊运算符:有括号(),下标[],成员(->.)等几种。


运算符优先级



































































































































































































































































































优先级



运算符



名称或含义



使用形式



结合方向



说明



1



[]



数组下标



数组名[常量表达式]



左到右



()



圆括号



(表达式)/函数名(形参表)



.



成员选择(对象)



对象.成员名



->



成员选择(指针)



对象指针->成员名



2



-



负号运算符



-表达式



右到左



单目运算符



(类型)



强制类型转换



(数据类型)表达式



++



自增运算符



++变量名/变量名++



单目运算符



--



自减运算符



--变量名/变量名--



单目运算符



*



取值运算符



*指针变量



单目运算符



&



取地址运算符



&变量名



单目运算符



!



逻辑非运算符



!表达式



单目运算符



~



按位取反运算符



~表达式



单目运算符



sizeof



长度运算符



sizeof(表达式)



3



/





表达式/表达式



左到右



双目运算符



*





表达式*表达式



双目运算符



%



余数(取模)



整型表达式/整型表达式



双目运算符



4



+





表达式+表达式



左到右



双目运算符



-





表达式-表达式



双目运算符



5



<<



左移



变量<<表达式



左到右



双目运算符



>>



右移



变量>>表达式



双目运算符



6



>



大于



表达式>表达式



左到右



双目运算符



>=



大于等于



表达式>=表达式



双目运算符



<



小于



表达式<表达式



双目运算符



<=



小于等于



表达式<=表达式



双目运算符



7



==



等于



表达式==表达式



左到右



双目运算符



!=



不等于



表达式!= 表达式



双目运算符



8



&



按位与



表达式&表达式



左到右



双目运算符



9



^



按位异或



表达式^表达式



左到右



双目运算符



10



|



按位或



表达式|表达式



左到右



双目运算符



11



&&



逻辑与



表达式&&表达式



左到右



双目运算符



12



||



逻辑或



表达式||表达式



左到右



双目运算符



13



?:



条件运算符



表达式1? 表达式2: 表达式3



右到左



三目运算符



14



=



赋值运算符



变量=表达式



右到左



/=



除后赋值



变量/=表达式



*=



乘后赋值



变量*=表达式



%=



取模后赋值



变量%=表达式



+=



加后赋值



变量+=表达式



-=



减后赋值



变量-=表达式



<<=



左移后赋值



变量<<=表达式



>>=



右移后赋值



变量>>=表达式



&=



按位与后赋值



变量&=表达式



^=



按位异或后赋值



变量^=表达式



|=



按位或后赋值



变量|=表达式



15



,



逗号运算符



表达式,表达式,…



左到右



从左向右顺序运算



说明:


同一优先级的运算符,运算次序由结合方向所决定。简单记就是:! >算术运算符 >关系运算符 > && > || >赋值运算符


上表不容易记住。其实也用不着死记,用得多,看得多自然就记得了。也有人说不用记


这些东西,只要记住乘除法的优先级比加减法高就行了,别的地方一律加上括号。这在你自己写代码的时候,确实可以,但如果是你去阅读和理解别人的代码呢?别人不一定都加上括号了吧?所以,记住这个表,我个人认为还是很有必要的。


一些容易出错的优先级问题


上表中,优先级同为1
的几种运算符如果同时出现,那怎么确定表达式的优先级呢?这


是很多初学者迷糊的地方。下表就整理了这些容易出错的情况:



这些容易出错的情况,希望读者好好在编译器上调试调试,这样印象会深一些。一定要


多调试,光靠看代码,水平是很难提上来的。调试代码才是最长水平的。


逻辑运算符


||&&是我们经常用到的逻辑运算符,与按位运算符|&是两码事。下一节会介绍按位


运算符。虽然简单,但毕竟容易犯错。看例子:


int i=0;


int j=0;


if((++i>0)||(++j>0))


{


//打印出ij的值。


}


结果:i=1;j=0


不要惊讶。逻辑运算符||两边的条件只要有一个为真,其结果就为真;只要有一个结果


为假,其结果就为假。if((++i>0)||(++j>0))语句中,先计算(++i>0),发现其结果为真,后面


(++j>0)便不再计算。同样&&运算符也要注意这种情况。这是很容易出错的地方,希望读


者注意。


条件运算符和条件表达式


如果在条件语句中,只执行单个的赋值语句时,常可使用条件表达式来实现。不但使程序简洁,也提高了运行效率。


条件运算符为?和:,它是一个三目运算符,即有三个参与运算的量。


由条件运算符组成条件表达式的一般形式为:


表达式1?表达式2:表达式3


其求值规则为:如果表达式1的值为真,则以表达式2的值作为条件表达式的值,否则以表达式2的值作为整个条件表达式的值。


条件表达式通常用于赋值语句之中。


例如条件语句:


if(a>b) max=a;


else max=b;


可用条件表达式写为


max=(a>b)?a:b;


执行该语句的语义是:如a>b为真,则把a赋予max,否则把b赋予max


使用条件表达式时,还应注意以下几点:


1)
条件运算符的运算优先级低于关系运算符和算术运算符,但高于赋值符。


因此


max=(a>b)?a:b


可以去掉括号而写为


max=a>b?a:b


2)
条件运算符?和:是一对运算符,不能分开单独使用。


3)
条件运算符的结合方向是自右至左。


例如:


a>b?a:c>d?c:d


应理解为


a>b?a:(c>d?c:d)


这也就是条件表达式嵌套的情形,即其中的表达式3又是一个条件表达式。


++--操作符


绝对是一对让人头疼的兄弟。先来点简单的:


int i = 3


++i+++i+++i);


表达式的值为多少?15
吗?16 吗?18吗?其实对于这种情况,C语言标准并没有作出规定。有点编译器计算出来为18,因为i经过3次自加后变为6,然后36相加得18;而有的编译器计算出来为16(比如Visual
C++6.0
),先计算前两个i的和,这时候i自加两次,2i的和为10,然后再加上第三次自加的i16。其实这些没有必要辩论,用到哪个编译器写句代码测试就行了。但不会计算出15的结果来的。


++--作为前缀,我们知道是先自加或自减,然后再做别的运算;但是作为后缀时,到底什么时候自加、自减?这是很多初学者迷糊的地方。假设i=0,看例子:


A)


j =(i++,i++,i++);


B)


fori=0;i<10;i++


{


//code


}


C)


k =i+++i+++i++);


你可以试着计算他们的结果。


1)
例子为逗号表达式,i 在遇到每个逗号后,认为本计算单位已经结束,i这时候自加。关于逗号表达式与“++”或“--”的连用,还有一个比较好的例子:


int x;


int i = 3;


x = (++i, i++, i+10);


x 的值为多少?i的值为多少?


按照上面的讲解,可以很清楚的知道,逗号表达式中,i在遇到每个逗号后,认为本计算单位已经结束,i这时候自加。所以,本例子计算完后,i的值为5,x的值为15


2)
例子i 10进行比较之后,认为本计算单位已经结束,i这时候自加。


3)
例子i 遇到分号才认为本计算单位已经结束,i这时候自加。


也就是说后缀运算是在本计算单位计算结束之后再自加或自减。C语言里的计算单位大体分为以上3类。


留一个问题:


fori=0printf(“First=%d”,i;


i<10printf(“Second=%d”,i;


i++printf(“Third=%d”,i))


{


printf(“Fourth=%d”,i);


}


打印出什么结果?

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台