Попытка лучше понять операторы switch и как их выражения связаны / тесты - PullRequest
0 голосов
/ 15 апреля 2019

Я читаю свой учебник по Си и совершенно сбит с толку при любой попытке понять следующий фрагмент кода. Книга не дает полной программы и только утверждает, что переменная angle является двойной, а 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.

Ответы [ 3 ]

2 голосов
/ 15 апреля 2019

A 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 голос
/ 15 апреля 2019

Ваше 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 в своей книге на языке Си.

1 голос
/ 15 апреля 2019

В книге не дается полная программа, а только утверждается, что переменный угол является двойным, а angletype - это int, который каким-то образом определит, какой случай использовать?

Этопохоже, что angletype, вероятно, является перечислением, например:

typedef enum {
    DEG,
    RAD
} AngleType;

AngleType angleType;

Где-то в коде, предшествующем switch, значение angletype должно быть установлено на одно из значений.(Перечисление - не единственный путь ... DEG и RAD, конечно, могут быть #define с, но в любом случае, если вы его нарезаете, 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 для любой дополнительной работы. Обратите внимание, что в конце дела DEG нет оператора break ... это означает, что выполнение не останавливается на достигнутом, оно просто продолжается вRAD кейс.

...