isalpha (<mychar>) == true оценивает как false?
Строка temp равна "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;
Это мой код, чтобы проверить, является ли первый символ temp аз,AZ. Первое выражение if будет иметь значение true, а второе - false. ЗАЧЕМ?!?!?! Я пробовал это даже без "temp.length() > 0 &&", и он все еще оценивает false. Это просто ненавидит "== правда". Единственное, о чем я могу думать, это то, что isalpha() возвращает!= 0 и true == 1. Тогда вы можете получить isalpha() == 2!= 1. Но я понятия не имею, является ли C++ таким... странно.
Кстати, мне не нужно знать, что "== true" логически бессмысленно. Я знаю.
выход был
without true worked
Скомпилировано с CodeBlock с использованием GNU GCC в Ubuntu 9.10 (если это имеет значение)
4 ответа
Функции is* гарантированно возвращают ненулевое значение, только если оно истинно, а НЕ обязательно 1. Типичная реализация основана на таблице, с одной записью в таблице для каждого символьного значения и набором битов, определяющих, какой бит означает, что, Функция is* будет просто И правильной битовой маской со значением таблицы и вернет ее, которая будет только значением 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).
isalpha
не возвращается true
, он возвращает ненулевое значение. Это довольно часто встречается для API, разработанного для C.
Обратите внимание, что в выражении isalpha(ch) == true
подвыражение true
повышен до типа int
со значением 1.
Что ж, документация предполагает, что она возвращает либо ноль, либо ненулевое значение, не обязательно просто false или true. Так что вам лучше проверить (isalpha(temp[0])!= 0).