Простой вопрос - PullRequest
       6

Простой вопрос

5 голосов
/ 27 февраля 2010

Я только недавно запустил C, и меня попросили ответить на некоторые упражнения по кодированию, в которых появляется следующий фрагмент кода:

typedef enum {
  false = 0,
  true = 1
} Bool;

Может ли кто-нибудь дать краткое и четкое объяснение этому?

Большое спасибо.

Ответы [ 6 ]

10 голосов
/ 27 февраля 2010

Это действительно делает две вещи; Вы можете разбить это примерно так:

enum _bool {
   false = 0,
   true = 1
};

А:

typedef enum _bool Bool;

Этот код создает новый тип перечисления, а затем использует typedef, чтобы дать ему удобное имя. Это позволит вам использовать новый «тип» с именем Bool в другом месте кода и присвоить ему значения false и true. Вот простой пример использования:

Bool logical_not(Bool in)
{
    if (in == true)
        return false;
    else
        return true;
}
4 голосов
/ 27 февраля 2010

Это просто определение перечисления, типа, который может принимать только дискретное число значений, то есть значений, заключенных в эти скобки. Каждому из этих значений присваивается имя, которое вы позже сможете использовать для ссылки на него. Если вы указываете только имя значений, а не фактическое значение, компилятор устанавливает их для вас в порядке возрастания, начиная с нуля для первого элемента.

См. Вики-статью о перечисляемых типах (и, в частности, разделе C ) для получения дополнительной информации.

Это конкретное перечисление определяет логический тип, то есть тип, который может принимать только два значения: true и false, где false =! True. Логические значения очень часто используются в программировании, например, в качестве флагов, указывающих, выполняется ли условие, и на самом деле многие языки включают их как нативный тип (например, C ++ и C99).

Кстати, чтобы определить это перечисление это:

enum Bool
{
    false = 0,
    true = 1
};

будет достаточно; однако из-за того, как C был разработан для объявления переменной типа Bool с этим кодом, вам необходимо всегда ставить ключевое слово enum перед Bool:

enum Bool myFlag=true;

Вместо этого, используя трюк с typedef, вы определяете анонимное перечисление, созданное таким образом, а затем вы предоставляете ему псевдоним Bool; таким образом, вы можете просто сделать:

Bool myFlag=true;
1 голос
/ 27 февраля 2010

Перечисление является целочисленным типом, который имеет ограниченное количество символических значений. Это позволяет вам делать такие вещи, как:

Bool finish = false;

while (finish != true)
{
    ...
}
1 голос
/ 27 февраля 2010

Предоставляет читаемые литералы для true и false. Но вы можете догадаться об этом.

Как это работает? Перечисление (ключевое слово enum) связывает серию токенов с целочисленными значениями, а typedef ... Bool; делает Bool имя типа перечисления.

В целом, я бы не одобрил эту идиому, потому что позже вы могли бы испытать желание использовать

int flag=false;
// something happens that might change the setting of flag that *doesn't* use the enum
if (flag == true) {
   //...
}

и если flag установлено в 2, это не будет делать то, что вы ожидаете.

Если вы долго используете c, то ноль - это ложь, а все остальное - истина. Интерпретация станет второй натурой.

1 голос
/ 27 февраля 2010

Поскольку C не имеет логического типа данных, ваш код имитирует его, используя typedef.

Вы можете использовать новый определенный пользователем тип данных следующим образом:

Bool find_key_in_array() {
        Bool found = false; // assume not found.

        // do searching and set found suitably.    

        return found;
}

int main()  {

        Bool result = find_key_in_array();

        return 0;
}
0 голосов
/ 27 февраля 2010

Из того, что я помню:

Это объявляет перечисление и затем связывает имя Bool с этим перечислением (через typedef ). Вы можете получить больше информации о C перечислениях здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...