c语言教程if,C语言基本功教程系列(2) - if 语句

趁周末再写一章。今天就介绍下if语句

if语句很简单,相信大家都会,但是确有很多值得注意的。 首先来说一下code style的问题。

=========不好的风格===========

if( (x +4-y * 25) > 10 || y > 1023 || GetSomething())

{

....

}

=========好的风格============

if( (x +4-y * 25) > 10

|| y > 1023

|| GetSomething() )

{

....

}

相信大家能看出来第2段代码的时候要比第1段代码容易读的多。

if语句虽然简单,但是涉及到CPU的branch prediction的问题。简单的说, CPU有个指令缓存,会预先把一部分代码读到缓存中等待稍后执行。当CPU遇到 if语句的时候, 会把条件判断为true的那段代码读到缓存中,然后对if(条件判断)中的条件判断语句进行运算。如果运算结果是false,那么CPU就会重新从内存中载入false的代码,在这期间大部分CPU时间会被浪费点。

所以在写if语句的时候,一定要把最容易成立的条件放在最前面进行判断。 比如:

======错误的写法=======

if( (float)rand() / RAND_MAX < 0.2 )  //只有20%的可能运行if部分

{

// 被读入到指令缓存的部分。

}

======正确的写法=======

if( (float)rand() / RAND_MAX > 0.2 ) //有80%的可能运行if部分。

{

// 被读入到指令缓存的部分。

}

if语句另外一个需要注意的地方是在进行多重条件判断的时候,要安排好顺序。比如:

if (  (float)rand() / RAND_MAX < 0.4

&& (float)rand() / RAND_MAX < 0.3

&& (float)rand() / RAND_MAX < 0.2 )

{

......

}

根据C语言的规则(这点不同于Pascal),如果第一个条件(rand() / RAND_MAX < 0.4)不成立,那么就不会运行第2和第3个条件,而直接跳转。 所以应该把最难成立的条件放在第一的位置上,正确的代码为:

if (  (float)rand() / RAND_MAX < 0.2     // 只有%20的可能

&& (float)rand() / RAND_MAX < 0.3

&& (float)rand() / RAND_MAX < 0.4 )

{

......

}

由于编译器并无法计算和统计每种条件成立的可能性,只能靠大家手动的调整来提高代码的效率。

最后是if有一种技术叫做binary branch,举个简单的例子,代码如下:

int x;

if( x == 1)

{

}

else if( x == 2)

{

}

else if( x == 3)

{

}

else if( x == 4)

{

}

对付这段代码,可以用switch来解决,也可以用binary branch,修改后的代码如下:

if( x <= 2)

{

if( x == 1)

{...}

else

{...}

}

else

{

if( x == 3)

{...}

else

{...}

}

如果判断的情况复杂一点,编译器就没有优化的能力,需要考大家自己动手啦。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值