有时候编程编的久了,如果不停下来认真思考一下,即便是一些最基础的知识点,也可能让自己懵圈。其实,说到底还是打基础的时候没打牢,或者说自以为是地认为自己懂了,然后在打基础的时候就懒得思考懒得看了,结果就是对这个基础知识点的认识一直停留在自己的固有认识里。

  好了,下面进入正题。if、else if和else是我们经常要用到的基本语法结构。某日,在园子里看到一博客贴出了这样一个问题。

  控制台输入一个成绩,如果 成绩>=90 :输出A,如果90>成绩>=80 输出B,如果80>成绩>=70 输出C ,如果70>成绩>=60 输出D,如果 成绩<60输出E。请思考用if好还是用if-else好还是if else if好,为什么好?

  if的代码实现如下:

if (score >= 90)
{
Console.WriteLine("A");
}
if (score >= 80)
{
Console.WriteLine("B");
}
if (score >= 70)
{
Console.WriteLine("C");
}
if (score >= 60)
{
Console.WriteLine("D");
}
if (score < 60)
{
Console.WriteLine("E");
}

  if...else的代码实现如下:

if (score >= 90)
{
Console.WriteLine("A");
}
else//<90
{
if (score >= 80)
{
Console.WriteLine("B");
}
else//<80
{
if (score >= 70)
{
Console.WriteLine("C");
}
else//<70
{
if (score >= 60)
{
Console.WriteLine("D");
}
else
{
Console.WriteLine("E");
}
}
}
}

  if...else if的代码实现如下:

if (score >= 90)
{
Console.WriteLine("A");
}
else if (score >= 80)
{
Console.WriteLine("B");
}
else if (score >= 70)
{
Console.WriteLine("C");
}
else if (score >= 60)
{
Console.WriteLine("D");
}

  在公司做开发时,相信有不少人乱用这几个结构。

  我们首先看看if的实现,很明显,各个if语句之间是独立的,无论前面的if语句是否未真,当前if语句均会执行,显然,这种实现效率低下。

  再来看第二种和第三种实现,本质上,这两种实现是等价的,在大多数编程语言实现中,else if都不是作为一种基本的关键字出现的,它实际是else语句和if语句的结合,这种组合构造避免了仅使用if、else时的多重嵌套,就像上面的第二种实现,类似于语法糖,便于程序员敲代码。

  另外,这种情形也可以使用switch...case结构实现。在C#中,当在整型常量上使用switch结构时,CLR总是会将switch翻译为查找表结构,从而使得每个case分支都能获得相同的执行时间,在这种情形下,相比使用if...else结构同时有一个值或者少量的几个值出现的频率明显较高,那么使用if...else结构且将出现频度较高的值排在前面的执行速度比switch结构会更快。

  最后,C#中的switch...case结构还允许使用string常量,这和整型常量稍微不同。它在case标签较少的情况下(大约是6个左右),switch语句将编译成和if语句类似的结构。但是,如果case标签数量足够大(大于6个),那么c#编译器将创建一个HashTable对象,用字符串常量填充它,然后在该表上进行查找,然后跳转。Hashtable查找不是严格意义上的O(1),并且具有显著的常量代价,但是若case标签的数量足够大,它的速度将比在多个if语句中比较字符串常量快。

最新文章

  1. Java集合——ConcurrentHashMap
  2. 介绍四款windows下的神器
  3. 咱就入个门之NHibernate映射文件配置(一)
  4. struts2.1笔记02:servlet简介
  5. CPrintDialog 构造函数参数详解
  6. 数据结构——POJ 1686 Lazy Math Instructor 栈的应用
  7. Big Event in HDU(杭电1171)(多重背包)和(母函数)两种解法
  8. easyui datagrid自定义按钮列,即最后面的操作列(转)
  9. 是时候给大家介绍 Spring Boot/Cloud 背后豪华的研发团队了。
  10. Linux中查看TCP连接数
  11. [luogu2051][bzoj1801][AHOI2009]chess中国象棋【动态规划】
  12. 前端学习历程--js--原型&amp;闭包
  13. 【转】使用kettle工具遇到的问题汇总及解决方案
  14. SpringBoot读取application.properties文件内容
  15. Spring ApplicationContext(六)BeanPostProcessor
  16. for-in循环(for-in Loops)
  17. java后台校验 hibernate validator
  18. CSS层叠样式
  19. 多项式求逆元详解+模板 【洛谷P4238】多项式求逆
  20. logback将日志写入不同文件夹里

热门文章

  1. delete,truncate,drop的区别
  2. predict.glm -&gt; which class does it predict?
  3. 配置myslq提示 the configuration step starting server is taking longer than expected we apologize for thi
  4. selenium webdriver ——执行javascript代码
  5. Java Web 从入门到精通(明日科技)
  6. Python运维开发基础04-语法基础
  7. Ssm框架常见报错
  8. 96. Unique Binary Search Trees (Tree; DP)
  9. MySQL学习3---事务
  10. mysql启动参数 skip-grant-tables