2010-03-25 2 views
5

문자열 temp는 내 디버거에서 "ZERO : \ t.WORD \ t1"과 같습니다. (내 파일의 첫 번째 줄)isalpha (<mychar>) == 참이면 거짓으로 평가됩니까?

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인지 확인하는 코드입니다. 첫 번째 if 문은 true로 평가되고 두 ​​번째 문은 false로 평가됩니다. 왜?!?!?! 나는 "temp.length()> 0 & &"이 없어도 이것을 시도했지만 여전히 false를 평가합니다. 그것은 단지 "== true"를 싫어합니다. 내가 생각할 수있는 유일한 점은 isalpha()가 반환된다는 것입니다! = 0 그리고 true == 1. 그런 다음 isalpha() == 2! = 1을 얻을 수 있습니다. 그러나 C++이 그런지 전혀 모르겠습니다. 기묘한.

BTW, "== true"가 논리적으로 무의미하다는 것을 알아야 할 필요가 없습니다. 알아.

출력은

without true worked 

우분투 9.10에 GNU GCC true을 반환하지 않습니다

+1

는'cout과 << isalpha에 (온도 [0]) << endl의를 시도,'? –

+0

"C++이 ... 이상하다고 생각하지 않습니다." 참조 설명서를 참조하면 아이디어를 얻을 수 있습니다. cplusplus.com은 "* c *가 알파벳 문자 인 경우"0과 다른 값 (즉, 'true')을 말합니다. 그래서 cplusplus.com을 사용하면 안됩니다 : C++에서'true'가 복사 된 C 표준의 설명에서 "true"와 같은 것을 의미하지는 않습니다. opengroup.org는 "isalpha() 함수는 c가 알파벳 문자 인 경우 0이 아닌 값을 반환해야합니다"라고 말합니다. –

+0

또한 ''또는 ''의 isalpha 함수와 ''의 함수 템플릿'std :: isalpha '를 혼동하지 않도록주의하십시오. 후자는'bool'을 반환하기 때문에 호출하면 호출 코드가 작동합니다. –

답변

9

is * 함수는 true 인 경우 반드시 1이 아닌 0이 아닌 값을 반환하도록 보장됩니다. 일반적인 구현은 테이블 기반이며 각 문자 값에 대해 테이블에 하나의 항목이 있습니다. 어느 비트가 무엇을 의미하는지. (가) 인 * 함수 단지 오른쪽 표의 값 비트 마스크, 및 단지 어느 유형 값 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_tableint __type_table[UINT_MAX+1];과 같이 정의되며 예 : __type_table['0'+1] == __digit__type_table['A'+1] == __upper과 같이 초기화됩니다.

'+1'부분은 테이블 시작 부분에 EOF (일반적으로 -1로 정의 됨) 자리를 남겨 두는 것입니다.

+0

나는 사람들이 좋아하는 이유가 무엇인지 # ...../NERDRAGE 감사합니다. – Buttink

+0

@Buttink : 이상한 ... :-) –

+7

@Buttink : C#을 좋아하는 것이이 혼란에 빠졌습니다. C#이 아니라면, 조건부로 정수를 사용하는 것이 행복 할 것입니다. C 함수가 당신을 위해 설계되지 않았기 때문에 하나의 "진리"값. C#을 선호하는 것은 괜찮지 만 C++을 쓸 때 C#을 쓰는 척하지는 않습니다. –

2

isalpha (이 어떤 중요한 경우)가 아닌 0을 반환을 사용하여 코드 블록으로 컴파일했다. 이 표현 isalpha(ch) == true에서 표현식 true이 값 int를 입력 승진 것을 참고

C.

을 위해 설계된 API에 대한 매우 일반적인 1.

0

음, 문서는 제로 또는 비 중 하나를 반환 제안 제로, 반드시 거짓 또는 사실 일 필요는 없습니다. 따라서 isalpha (temp [0])! = 0)를 확인하는 것이 좋습니다.

+0

또는'!! isalpha (임시 [0])'. –

+3

@mmyers : 또는'isalpha (임시 [0])! – UncleBens

+1

@UncleBens : * 자장, 내 우월감을 죽일거야. * –

0

하지 isalpha(ch) == true를 수행하지만, !!isalpha(ch) == true

+3

부울 값을 true와 비교하여 (따라서 다른 부울 값을 생성하는 경우) 일단 충분하면 확실합니까? 어쩌면'(!! isalpha (ch) == true) == true), 아니면 아마도'(((!! isalpha (ch) == true) == true) == true) = true) == true'? 이봐 요, 저는 Lisp을 발명했습니다! :-) –

+3

두 배의 표현식! 징후는 사라져야합니다. 그것은 이상한 것이 아니며 추한 것입니다. 그리고 어쨌든 당신이하고 싶지 않은 것은 거의 아닙니다. -1. –

+0

@Jerry : 부울 표현식의 진정한 감정가는'(!! isalpha (ch) == (!! true == !! true))'로 시작하고 기분이 터지면 거기에서 가져온다 고 생각합니다. –

관련 문제