2010-03-25 2 views
5

строка temp равна «ZERO: \ t.WORD \ t1» из моего отладчика. (Первая строка моего файла)isalpha (<mychar>) == true оценивает значение false?

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. Первый оператор if будет оценивать true, а второй - false. ЗАЧЕМ?!?!?! Я пробовал это даже без «temp.length()> 0 & &», и он по-прежнему оценивает значение false. Он просто ненавидит «== true». Единственное, что я могу придумать, это isalpha() возвращает! = 0 и true == 1. Тогда вы можете получить isalpha() == 2! = 1. Но я понятия не имею, является ли C++ тем ... странно.

BTW, мне не нужно знать, что «== true» логически бессмысленно. Я знаю.

выход был

without true worked 

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

+1

Вы пробовали 'COUT << IsAlpha (Темп [0]) << ENDL;'? –

+0

«Я понятия не имею, что C++ - это ... странно». Консультирование справочного руководства даст вам представление. cplusplus.com говорит: «Значение, отличное от нуля (т. е.« истина »), если действительно * c * является буквенной буквой». Вот почему вы не должны использовать cplusplus.com: 'true' в C++ не означает то же самое, что и« true »в описании в стандарте C, из которого они скопировали. opengroup.org говорит: «Функция isalpha() должна возвращать ненулевое значение, если c - алфавитный символ», что довольно хорошо. –

+0

Кроме того, остерегайтесь путаницы между этой функцией isalpha от '' или '' и шаблоном функции 'std :: isalpha' в' '. Последний возвращает 'bool', поэтому, если вы звонили, тогда ваш код будет работать. –

ответ

9

Функция is * гарантируется только возвратом ненулевого значения, если true, НЕ обязательно 1. Типичная реализация основана на таблице, с одной записью в таблице для каждого символьного значения и набором битов, определяющим какой бит означает что. Есть * функция как раз и право битовая с табличным значением, и вернуть то, которое будет только значение 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).

+0

И ЛЮДИ ЧУДЕСА ПОЧЕМУ Я ЛЮБЛЮ C# ...../NERDRAGE Спасибо :) – Buttink

+0

@Buttink: теперь, когда вы упоминаете об этом, odd ... :-) –

+7

@Buttink: нравится C#, что привело вас в этот беспорядок - если бы не C#, вы были бы счастливы просто использовать целое число в условном выражении, которое работает, а не сравнивает его с единственное значение «истины», которое не связано с тем, что функции C не были предназначены для вас. Это нормально, если вы предпочитаете C#, но не стоит притворяться, что вы пишете C#, когда вы действительно пишете C++ ;-) –

2

isalpha не возвращает true, она возвращает ненулевое значение. Это весьма характерно для API, предназначенный для C.

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

0

Ну, документация предполагает, что она возвращает либо ноль или не- но не обязательно, просто false или true. Поэтому вам лучше проверить (isalpha (temp [0])! = 0).

+0

Или '!! isalpha (temp [0])'. –

+3

@mmyers: Или 'isalpha (temp [0])'! – UncleBens

+1

@UncleBens: * Тише, ты убьешь мой воздух превосходства. * –

0

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

+3

Если вы собираетесь сравнить значение Boolean на true (таким образом, создавая другое логическое значение), вы уверены, что один раз достаточно? Может быть, это действительно должно быть '(!! isalpha (ch) == true) == true', или, возможно, даже' (((((!! isalpha (ch) == true) == true) == true) = = true) == true'? Эй, смотрите, я придумал Lisp! :-) –

+3

Любое выражение с двойным! знаки должны умереть. Это не идеоматично, это уродливо, и это почти наверняка не то, что вы хотели сделать в любом случае. -1. –

+0

@Jerry: Я думаю, что истинный знаток булевых выражений начинается с '(!! isalpha (ch) == (!! true == !! true))' и берет его оттуда, когда удары настроения. –

Смежные вопросы