C语言基本功教程系列 if 语句
2007-05-30 16:17
316 查看
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
{...}
}
如果判断的情况复杂一点,编译器就没有优化的能力,需要考大家自己动手啦。
=========不好的风格===========
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
{...}
}
如果判断的情况复杂一点,编译器就没有优化的能力,需要考大家自己动手啦。
相关文章推荐
- C语言基本功教程系列(2) - if 语句
- C语言基本功教程系列(3) - 快速的函数调用
- C语言基本功教程系列 循环
- C语言基本功教程系列 快速的函数调用
- 【iOS开发基础教程】C语言if语句的用法
- 转:C语言基本功教程系列(1)
- 简明C语言教程(十)if 语句
- C语言基本功教程系列 高效无错的内存访问
- C语言基本功教程系列(1)
- C语言基本功教程系列 文件, Socket 和 其它
- C语言分支结构语句if-else语句
- C++程序设计实践学材系列(18)——1.4.1 用if语句实现判断
- as3菜鸟教程if-else语句实现按钮的控制播放和暂停
- 【c语言问题系列教程之一】变量声明和初始化
- Python系列教程 if, while, for控制流
- Sqlserver基础教程系列3-基本的查询select语句
- javascript教程:关于if简写语句优化的方法
- Python 3基础教程8-if else语句
- C语言笔试题精选1---求两个数之间较大的数,不使用if、while、switch、for、?:/以及任何比较语句
- 《软件测试基本功》系列教程