строковый временный файл равен "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 (если это имеет значение кто-либо),
Функции 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).
isalpha
не возвращает true
, он возвращает ненулевое значение. Это довольно распространено для API, разработанного для C.
Обратите внимание, что в выражении isalpha (ch) == true
подвыражение true
повышается до типа int
со значением 1.
Что ж, документация предполагает, что он возвращает либо ноль, либо ненулевое значение, не обязательно просто ложь или истину. Так что вам лучше проверить (isalpha (temp [0])! = 0).
Не isalpha (ch) == true
, но !! isalpha (ch) == true