我正在阅读我的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的情况如何相互作用。
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
并输出错误消息。
这本书没有给出一个完整的程序,只说明变量angle是一个double,而angletype是一个int,它将以某种方式决定使用哪种情况?
看起来像angletype
可能是一个枚举,如:
typedef enum {
DEG,
RAD
} AngleType;
AngleType angleType;
在switch
之前的代码中,angletype
的值必须设置为其中一个值。 (枚举不是唯一的方法... DEG
和RAD
当然可以是#define
s,但你切片的任何方式DEG
和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
案例主体中的第一行通过将angle
乘以π/ 180(因为π弧度有180°)将angle
转换为弧度。一旦RAD
转换为弧度,那么继续使用break
案例就可以继续进行任何额外的工作。请注意,在DEG
案例结尾处没有RAD
语句...这意味着执行不会停在那里,它只是继续进入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
命名枚举或其他一些整数值。并且,据推测,switch
在其中一个地方被设置。
您可以在C书中阅读有关qazxswpoi的更多信息。