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

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))

{

//打印出i和j的值。

}

结果: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,然后3个6相加得18;而有的编译器计算出来为16(比如Visual C++6.0),先计算前两个i的和,这时候i自加两次,2个i的和为10,然后再加上第三次自加的i得16。其实这些没有必要辩论,用到哪个编译器写句代码测试就行了。但不会计算出15的结果来的。

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

A)

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

B)

for(i=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类。

留一个问题:

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

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

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

{

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

} 打印出什么结果?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值