有时候编程编的久了,如果不停下来认真思考一下,即便是一些最基础的知识点,也可能让自己懵圈。其实,说到底还是打基础的时候没打牢,或者说自以为是地认为自己懂了,然后在打基础的时候就懒得思考懒得看了,结果就是对这个基础知识点的认识一直停留在自己的固有认识里。
好了,下面进入正题。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语句中比较字符串常量快。