试图更好地理解switch语句以及它们的表达式是如何相关/测试的

问题描述 投票:0回答:3

我正在阅读我的C教科书,我完全不知道任何理解以下代码片段的尝试。这本书没有给出一个完整的程序,只说明变量angle是一个double,而angletype是一个int,它将以某种方式决定使用哪种情况?感谢任何帮助,谢谢。

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的情况如何相互作用。

c switch-statement
3个回答
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
投票

这本书没有给出一个完整的程序,只说明变量angle是一个double,而angletype是一个int,它将以某种方式决定使用哪种情况?

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

typedef enum {
    DEG,
    RAD
} AngleType;

AngleType angleType;

switch之前的代码中,angletype的值必须设置为其中一个值。 (枚举不是唯一的方法... DEGRAD当然可以是#defines,但你切片的任何方式DEGRAD都有一些在编译时已知的设定值,而angletype是可变的。

angletypeDEG的情况下,然后switch跳到DEG案件:

 case DEG:
    angle *= PI / 180.0; /* convert to radians */
    /* fall through */
 case RAD:
     while (angle > PI) /* normalise radians */
 //...

DEG案例主体中的第一行通过将angle乘以π/ 180(因为π弧度有180°)将angle转换为弧度。一旦RAD转换为弧度,那么继续使用break案例就可以继续进行任何额外的工作。请注意,在DEG案例结尾处没有RAD语句...这意味着执行不会停在那里,它只是继续进入switch案例。


1
投票

你的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"); } 声明相当于以下[更清楚]:

DEG

换句话说,只是一大堆直接的条件。这里没什么了不起的。

据推测,RADangletype命名枚举或其他一些整数值。并且,据推测,switch在其中一个地方被设置。

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

© www.soinside.com 2019 - 2024. All rights reserved.