我正在阅读我的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的情况如何相互作用。
答案 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
标签视为可能的值之一。
对于此特定代码段,DEG
和RAD
是某些整数值的符号常量,可能定义为
#define DEG 0
#define RAD 1
或类似的
此特定代码段使用弧度进行角度计算,因此它首先检查角度类型,以查看是否需要将其从度转换为弧度。如果angletype
是DEG
,它将分支到case DEG:
以在执行计算之前执行转换。如果angletype
为RAD
,则分支到case RAD:
以执行计算。如果angletype
是任何其他值,它将分支到default
并显示错误消息。
答案 1 :(得分:1)
这本书没有给出完整的程序,仅声明可变角度为双精度,而angletype为int可以确定使用哪种情况?
看起来angletype
可能是一个枚举,例如:
typedef enum {
DEG,
RAD
} AngleType;
AngleType angleType;
在switch
之前的代码中,angletype
的值必须设置为其中一个值。 (枚举不是唯一的方法... DEG
和RAD
当然可以是#define
s,但是无论如何,您都可以对其进行切片DEG
和{{ 1}}具有一些在编译时已知的设置值,而RAD
是可变的。
在angletype
为angletype
的情况下,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");
}
换句话说,只是简单条件的负载。这里没什么魔术。
大概DEG
和RAD
名称枚举或其他一些整数值。而且,大概angletype
被设置为其中某处的一个。
您可以在C书中阅读有关switch
的更多信息。