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

{

//打印出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);

}

打印出什么结果?

你可能感兴趣的:(嵌入式Linux,C高级开发,语言,c,编译器,测试)