高质量C++/C编程指南(四)表达式和基本语句

目录

一、运算符的优先级

二、复合表达式

三、if 语句

1、布尔变量与零值比较

2、整型变量与零值比较

3、浮点变量与零值比较

4、指针变量与零值比较

5、对if 语句的补充说明

四、循环语句的效率

五、for 语句的循环控制变量

 


一、运算符的优先级

优先级

运算符

名称或含义

使用形式

结合方向

说明

1

[]

数组下标

数组名[常量表达式]

左到右

--

()

圆括号

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

--

.

成员选择(对象)

对象.成员名

--

->

成员选择(指针)

对象指针->成员名

--

 

2

-

负号运算符

-表达式

右到左

单目运算符

~

按位取反运算符

~表达式

++

自增运算符

++变量名/变量名++

--

自减运算符

--变量名/变量名--

*

取值运算符

*指针变量

&

取地址运算符

&变量名

!

逻辑非运算符

!表达式

(类型)

强制类型转换

(数据类型)表达式

--

sizeof

长度运算符

sizeof(表达式)

--

 

3

/

表达式/表达式

左到右

双目运算符

*

表达式*表达式

%

余数(取模)

整型表达式%整型表达式

4

+

表达式+表达式

左到右

双目运算符

-

表达式-表达式

5

<<

左移

变量<<表达式

左到右

双目运算符

>>

右移

变量>>表达式

 

6

>

大于

表达式>表达式

左到右

双目运算符

>=

大于等于

表达式>=表达式

<

小于

表达式<表达式

<=

小于等于

表达式<=表达式

7

==

等于

表达式==表达式

左到右

双目运算符

=

不等于

表达式!= 表达式

 

8

&

按位与

表达式&表达式

左到右

双目运算符

9

^

按位异或

表达式^表达式

左到右

双目运算符

10

|

按位或

表达式|表达式

左到右

双目运算符

11

&&

逻辑与

表达式&&表达式

左到右

双目运算符

12

||

逻辑或

表达式||表达式

左到右

双目运算符

 

13

?:

条件运算符

表达式1?

表达式2: 表达式3

右到左

三目运算符

 

14

=

赋值运算符

变量=表达式

右到左

--

/=

除后赋值

变量/=表达式

--

*=

乘后赋值

变量*=表达式

--

%=

取模后赋值

变量%=表达式

--

+=

加后赋值

变量+=表达式

--

-=

减后赋值

变量-=表达式

--

<<=

左移后赋值

变量<<=表达式

--

>>=

右移后赋值

变量>>=表达式

--

&=

按位与后赋值

变量&=表达式

--

^=

按位异或后赋值

变量^=表达式

--

|=

按位或后赋值

变量|=表达式

--

 

15

逗号运算符

表达式,表达式,…

左到右

--

[规则4-1-1]  如果代码行中的运算符比较多,用括号确定表达式的操作顺序,避免使用默认的优先级。

二、复合表达式

[规则4-2-1]  不要编写太复杂的复合表达式。


[规则4-2-2]  不要有多用途的复合表达式。


[规则4-2-3]  不要把程序中的复合表达式与“真正的数学表达式”混淆。

三、if 语句

1、布尔变量与零值比较

       根据布尔类型的语义,零值为“假”(记为FALSE),任何非零值都是“真”(记为TRUE)。TRUE的值究竟是什么并没有统一的标准。 例如Visual C++将TRUE定义为1,而VisualBasic则将TRUE定义为-1。

[规则4-3-1]  不可将布尔变量直接与TRUE、FALSE 或者1、0进行比较。

2、整型变量与零值比较

[规则4-3-2]  应当将整型变量用“==”’或“!=”直接与0比较
假设整型变量的名字为value,它与零值比较的标准if语句如下:

不可模仿布尔变量的风格而写成

3、浮点变量与零值比较

[规则4-3-3]  不可将浮点变量用“==”或“! =”与任何数字比较
千万要留意,无论是float还是double类型的变量,都有精度限制。所以一定要避免将浮点变量用“==”或“! =”与数字比较,应该设法转化成“>=” 或“<=” 形式。

4、指针变量与零值比较

[规则4-3-4]  应当将指针变量用‘“==”或"! =” 与NULL比较
指针变量的零值是“空”(记为 NULL)。尽管NULL的值与0相同,但是两者意义不同。
假设指针变量的名字为p,它与零值比较的标准if语句如下:

5、对if 语句的补充说明

       有时候我们可能会看到if (NULL == p)这样古怪的格式。不是程序写错了,是程序员为了防止将if(p==NULL)误写成if(p=NULL),而有意把p和NULL颠倒。编译器认为if (p = NULL) 是合法的,但是会指出if (NULL = p)是错误的,因为NULL不能被赋值。
       程序中有时会遇到if/else/return的组合,return(condition ?x:y) ;
 

四、循环语句的效率

[建议4-4-1]  在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,以减少CPU跨切循环层的次数。例如示例右的效率比示例左的高。

[建议4-4-2]  如果循环体内存在逻辑判断,并且循环次数很大,宜将逻辑判断移到循环体的外面

示例左的程序比示例右多执行了N-1次逻辑判断。并且由于前者老要进行逻辑判断,打断了循环“流水线”作业,使得编译器不能对循环进行优化处理,降低了效率。如果N非常大,最好采用示例右的写法,可以提高效率。如果N非常小,两者效率差别并不明显,采用示例左的写法比较好,因为程序更加简洁。

五、for 语句的循环控制变量

[规则4-5-1]  不可在for循环体内修改循环变量,防止for循环失去控制。
[建议4-5-1]  建议for语句的循环控制变量的取值采用“半开半闭区间”写法。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值