C语言面试题----switch语句

来源:互联网 发布:淘宝市场数据分析 编辑:程序博客网 时间:2024/06/02 02:07

 原创2017-12-21创新教育研究中心TeachPlus 

   C语言面试题----switch语句

阅读下面的程序:

# include <stdio.h>int  main(){   int a = 4;   switch(a > 5)   {       case 0:       printf("this is 0\n");       break;       case 1:       printf("this is 1\n");       break;       case 2:       printf("this is 2\n");       break;       default:       printf("this is default\n");   }   return 0;}

写出该程序的输出是什么?
答案:
输出 this is 0

本题解析

首先来看一下switch的用法,switch会计算括号中表达式的值。

并逐个与其后的常量表达式值相比较,

当表达式的值与某个常量表达式的值相等时, 即执行其后的语句,然后不再进行判断,

继续执行后面所有case后的语句。

如表达式的值与所有case后的常量表达式均不相同时,则执行default后的语句。

那么在本题中switch后面括号中的表达式是一个判断表达式,

判断表达式只有真和假两种,而在c语言中,0为假,非零为真,

所以a=4时,a>5的结果为假,匹配的是case 0的语句,输出结果为this is 0;

相关知识点

下面是该题的另一个变种,更更加具有迷惑性

# include <stdio.h>int  main(){   int a = 4;   switch(a - 2)   {      case 0:      printf("this is 0\n");      break;      case 1:      printf("this is 1\n");      break;      case 2:      printf("this is 2\n");      break;      default:      printf("this is default\n");   }    return 0;}

该题的输出结果为this is 2;

如果没有前面一道题的话,该题应该绝大多数人都能够正确解答,

但是因为有前面一题的影响,所以,有人会看到a - 2的结果为2,然后就会考虑到2为非零,

也就是真,c语言中通常使用1作为真的代表,因此就会给出this is 1的答案,

显然这是不不符合switch的使用方法的。

switch首先进行的是计算括号中表达式的值,对于判断表达式来说,

只能得出真和假两种答案,或者说0或1的答案,

但是对于其他的表达式可以计算出多种多样的答案,不可以受到惯性思维的影响。

除此之外,还有的题目问的更更直接,例如:

switch后面的括号中,可以放什么东西

对于这个答案,各人给出的答案不一,你可能会看到这样的说法:

可以是任何类型、在与表达式进行对比的时候会被自动取整

但是,上面的说法不全面,比如在括号中为float类型的时候就会报错,不能通过编译,

因为float类型和double都是有精确程度的,超过了这个程度,就没有办法匹配了。

根据编译报错的提示: error: switch quantity not an integer  ,

我们可以得知,switch要求小括号中的值应为整数类型,同时我们可以参考c99标准中的表述:

The controlling expression of a switch statement shall have integer type.
The expression of each case label shall be an integer constant expression and no two of
the case constant expressions in the same switch statement shall have the same value
after conversion.


这段话的大体意思应该是,switch控制表达式应该是整数类型。

每一个case标签后面的表达式也应该是整数常量表达式,

并且两个case表达式转换后的值不应该是相同的值。

因此我们觉得下面的表述是更合适的:

switch后面的括号中的数据类型,必须为数值型,

包括int、char、long、short以及枚举类型。


同时我们也可以给出下一个题的答案了:

swi switch中 case标签后面应该是什么类型;

答案是:

应该是数值型常量或常量表达式,而且两个 case语句后面的值经过转化后不可以相等。

原创粉丝点击