试图更好地理解switch语句及其表达/测试之间的关系

时间:2019-04-15 15:12:53

标签: c switch-statement

我正在阅读我的C教科书,并且完全不了解尝试理解以下代码片段的任何尝试。本书没有给出完整的程序,仅声明可变角度为双精度,而angletype为整数,将以某种方式确定使用哪种情况?感谢您的任何帮助,谢谢。

switch (angletype)
{
 case DEG:
  angle *= PI / 180.0; /* convert to radians */
  /* fall through */
 case RAD:
  while (angle > PI) /* normalise radians */
   angle -= 2.0*PI;
  while (angle < -PI)
   angle += 2.0*PI;
  break;
 default:
  printf("Error: Invalid type\n");
  break;
}

编辑:这是到目前为止我对该片段所做的事情:

#include <stdlib.h>
#include <stdio.h>
#define DEG
#define RAD
#define PI 3.14


void main()
{

int angletype;
double angle;

switch (angletype)
{
 case DEG:
 angle *= PI / 180.0; /* convert to radians */
 /* fall through */
 case RAD:
  while (angle > PI) /* normalise radians */
  angle -= 2.0*PI;
  while (angle < -PI)
  angle += 2.0*PI;
 break;
 default:
 printf("Error: Invalid type\n");
 break;
}

}

我只是想出一些可行的原型。我不确定表达式“(angletype)”以及DEG和RAD的情况如何相互作用。

3 个答案:

答案 0 :(得分:2)

switch语句使用一个整数表达式作为其控件,每个case标签也是一个整数表达式:

switch( some_integer )
{
  case 1: // do something if some_integer == 1
    break;

  case 2: // do something else if some_integer == 2
    break;

  case 3: // do some completely different thing if some_integer == 3
    break;
  ...

  default: // do something else if some_integer isn't a value covered by
           // any of the previous cases
}

switch视为计算得出的GOTO,并将每个case标签视为可能的值之一。

对于此特定代码段,DEGRAD是某些整数值的符号常量,可能定义为

#define DEG 0
#define RAD 1

或类似的

此特定代码段使用弧度进行角度计算,因此它首先检查角度类型,以查看是否需要将其从度转换为弧度。如果angletypeDEG,它将分支到case DEG:以在执行计算之前执行转换。如果angletypeRAD,则分支到case RAD:以执行计算。如果angletype是任何其他值,它将分支到default并显示错误消息。

答案 1 :(得分:1)

  

这本书没有给出完整的程序,仅声明可变角度为双精度,而angletype为int可以确定使用哪种情况?

看起来angletype可能是一个枚举,例如:

typedef enum {
    DEG,
    RAD
} AngleType;

AngleType angleType;

switch之前的代码中,angletype的值必须设置为其中一个值。 (枚举不是唯一的方法... DEGRAD当然可以是#define s,但是无论如何,您都可以对其进行切片DEG和{{ 1}}具有一些在编译时已知的设置值,而RAD是可变的。

angletypeangletype的情况下,DEG跳至switch情况:

DEG

case DEG: angle *= PI / 180.0; /* convert to radians */ /* fall through */ case RAD: while (angle > PI) /* normalise radians */ //... 主体中的第一行通过将DEG乘以π/ 180来将其转换为弧度(因为π弧度为180°)。将angle转换为弧度后,就需要进行其他任何工作,继续使用angle案例是有意义的。请注意,在RAD情况的末尾没有break语句...这意味着执行不止于此,它只是继续进行DEG情况。

答案 2 :(得分:1)

您的switch语句等效于以下[更清晰]:

if (angletype == DEG)
{
   // Convert to radians
   angle *= PI / 180.0;
   angletype = RAD;
}

if (angletype == RAD)
{
   // Normalise radians
   while (angle > PI)
      angle -= 2.0 * PI;

   while (angle < -PI)
      angle += 2.0 * PI;
}
else
{
   printf("Error: Invalid type\n");
}

换句话说,只是简单条件的负载。这里没什么魔术。

大概DEGRAD名称枚举或其他一些整数值。而且,大概angletype被设置为其中某处的一个。

您可以在C书中阅读有关switch的更多信息。