isalpha (<mychar>) == верный оценивает ко лжи?

строковый временный файл равен "ZERO:\t. WORD\t1" от моего отладчика. (первая строка моего файла)

string temp = RemoveWhiteSpace(data);
int i = 0;
if ( temp.length() > 0 && isalpha(temp[0]) )
    cout << "without true worked" << endl;
if ( temp.length() > 0 && isalpha(temp[0]) == true )
    cout << "with true worked" << endl;

Это - мой код, чтобы проверить, является ли первый символ временного файла a-z, A-Z. Первое, если оператор оценит к истинному и 2-му ко лжи. ПОЧЕМУ?!?!?! Я попробовал это даже без "temp.length ()> 0 &&", и он все еще оценивает ложь. Это просто ненавидит "== верный". Единственная вещь, о которой я могу думать, состоит в том, что isalpha () возвращается! = 0 и верный == 1. Затем Вы могли получить isalpha () == 2! = 1. Но, я понятия не имею, является ли C++ этим... странным.

BTW, я не должен знать, что "== верный" логически бессмысленно. Я знаю.

вывод был

without true worked

Скомпилированный с CodeBlock с помощью GNU GCC на Ubuntu 9.10 (если это имеет значение кто-либо),

5
задан Buttink 25 March 2010 в 21:43
поделиться

4 ответа

Функции is* гарантированно возвращают ненулевое значение только в случае истины, но не обязательно 1. Типичная реализация основана на таблице, с одной записью в таблице для каждого символа и набором битов, определяющих, какой бит что означает. Функция is* просто AND правильную битовую маску со значением таблицы, и возвращает это значение, которое будет только значением 1 для того типа, которому случайно присвоена битовая позиция 0.

Например. :

#define __digit 1
#define __lower 2
#define __upper 4
extern int __type_table[];

int isdigit(int c) { 
    return __type_table[c+1] & __digit;
}

int isalpha(int c) { 
    return __type_table[c+1] & (__lower | __upper);
}

int islower(int c) { 
    return __type_table[c+1] & __lower;
}

int isupper(int c) { 
    return __type_table[c+1] & __upper;
}

Где __type_table определяется как что-то вроде int __type_table[UINT_MAX+1]; и инициализируется так (например) __type_table['0'+1] == __digit и __type_table['A'+1] == __upper.

Если вам интересно, часть '+1' - это оставить место в начале таблицы для EOF (которое обычно определяется как -1).

9
ответ дан 13 December 2019 в 19:24
поделиться

isalpha не возвращает true , он возвращает ненулевое значение. Это довольно распространено для API, разработанного для C.

Обратите внимание, что в выражении isalpha (ch) == true подвыражение true повышается до типа int со значением 1.

2
ответ дан 13 December 2019 в 19:24
поделиться

Что ж, документация предполагает, что он возвращает либо ноль, либо ненулевое значение, не обязательно просто ложь или истину. Так что вам лучше проверить (isalpha (temp [0])! = 0).

0
ответ дан 13 December 2019 в 19:24
поделиться

Не isalpha (ch) == true , но !! isalpha (ch) == true

0
ответ дан 13 December 2019 в 19:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: