2010-03-25 11 views
5

स्ट्रिंग अस्थायी मेरे डीबगर से "ZERO: \ t.WORD \ t1" के बराबर है। (मेरे फ़ाइल की पहली पंक्ति)इस्लाफा (<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 है की जाँच करने के लिए अपने कोड है। पहला अगर कथन सत्य का मूल्यांकन करेगा और दूसरा झूठा होगा। क्यूं कर?!?!?! मैंने इसे "temp.length()> 0 & &" के बिना भी कोशिश की है "और यह अभी भी झूठी मूल्यांकन करता है। यह सिर्फ "== सच" से नफरत करता है। केवल एक चीज जिसे मैं सोच सकता हूं वह है कि isalpha() रिटर्न! = 0 और सच == 1. फिर, आप isalpha() == 2! = 1. प्राप्त कर सकते हैं, लेकिन, मुझे नहीं पता कि सी ++ क्या है ... अजीब।

बीटीडब्ल्यू, मुझे यह जानने की आवश्यकता नहीं है कि "== सत्य" तार्किक रूप से व्यर्थ है। मुझे पता है।

उत्पादन

without true worked 

उबंटू 9.10 पर जीएनयू जीसीसी

+1

आप की कोशिश की 'अदालत << isalpha (अस्थायी [0]) << endl है;'? –

+0

"मुझे नहीं पता कि सी ++ वह है ... अजीब"। एक संदर्भ मैनुअल से परामर्श आपको एक विचार देगा। cplusplus.com कहता है, "शून्य से अलग मूल्य (यानी, 'सत्य') यदि वास्तव में * सी * एक वर्णमाला पत्र है"। यही कारण है कि आपको cplusplus.com का उपयोग नहीं करना चाहिए: सी ++ में 'सत्य' का अर्थ सी मानक में वर्णित "सत्य" जैसा नहीं है, जिसकी उन्होंने प्रतिलिपि बनाई है। opengroup.org कहता है, "यदि Iscpha() फ़ंक्शन गैर-शून्य लौटाएगा यदि सी वर्णमाला वर्ण है", जो बेहतर है। –

+0

इसके अलावा, इस आइसल्फा फ़ंक्शन के बीच '' या '', और फ़ंक्शन टेम्पलेट 'std :: isalpha'' 'में फ़ंक्शन टेम्पलेट के बीच भ्रम से सावधान रहें। उत्तरार्द्ध 'बूल' देता है, इसलिए यदि आप उसे बुला रहे थे तो आपका कोड काम करेगा। –

उत्तर

9

यह * फ़ंक्शंस केवल एक गैर-शून्य मान वापस करने की गारंटी है, यदि आवश्यक हो, तो आवश्यक नहीं है 1. एक सामान्य कार्यान्वयन तालिका आधारित है, प्रत्येक वर्ण मान के लिए तालिका में एक प्रविष्टि के साथ, और परिभाषित बिट्स का एक सेट किस बिट का मतलब है। है * समारोह सिर्फ और तालिका मूल्य के साथ सही bitmask, और वापस आ जाएगी कि है, जो केवल जो भी प्रकार के लिए मूल्य 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

और लोगों को लगता है कि मुझे सी # ...../NERDRAGE धन्यवाद :) – Buttink

+0

@ बुट्टिंक: अब आप इसका जिक्र करते हैं, ऐसा लगता है अजीब ... :-) –

+7

@ बुट्टिंक: सी # पसंद करना आपको इस गड़बड़ी में मिला है - अगर यह सी # के लिए नहीं था तो आप इसे सशर्त में एक पूर्णांक का उपयोग करने में खुश होंगे, जो काम करता है, इसकी तुलना करने के बजाय एक "सच्चाई" मान, जो ऐसा नहीं करता क्योंकि सी कार्यों को आपके लिए ऐसा करने के लिए डिज़ाइन नहीं किया गया था। सी # पसंद करना ठीक है, लेकिन यह दिखाने के लिए ठीक नहीं है कि आप सी #+ लिख रहे हैं, जब आप वास्तव में सी ++ लिख रहे हैं ;-) –

2

isalpha (अगर यह किसी भी मायने रखती है) वापस नहीं करता है true, यह रिटर्न गैर शून्य का उपयोग कर CodeBlock साथ संकलित किया गया। यह सी

के लिए

नोट तैयार किया गया एपीआई के लिए बहुत आम है कि अभिव्यक्ति isalpha(ch) == true में, उपसूचक true मूल्य के साथ int टाइप करने के लिए प्रोत्साहित किया जाता है है 1.

0

खैर, प्रलेखन चलता है कि यह रिटर्न शून्य या गैर या तो शून्य, जरूरी नहीं कि झूठी या सच है। तो आप बेहतर जांच करेंगे (isalpha (temp [0])! = 0)।

+0

या '!! इस्लाफा (अस्थायी [0])'। –

+3

@mmyers: या 'isalpha (temp [0])'! – UncleBens

+1

@UncleBens: * हश, आप श्रेष्ठता की मेरी हवा को मार देंगे। * –

0

नहीं isalpha(ch) == true करते हैं, लेकिन !!isalpha(ch) == true

+3

यदि आप एक बूलियन मान की तुलना करने के लिए सही हैं (इस प्रकार एक और बूलियन मान का उत्पादन) क्या आप सुनिश्चित हैं कि एक बार पर्याप्त है? शायद यह वास्तव में होना चाहिए '(!! isalpha (ch) == सत्य) == सत्य', या शायद यहां तक ​​कि' (((((!! (isalpha (ch) == सत्य) == सत्य) == सत्य) = = सच) == सच'? अरे देखो, मैंने लिस्प का आविष्कार किया है! :-) –

+3

डबल के साथ कोई अभिव्यक्ति! संकेतों को मरने की जरूरत है। यह विचारधारा नहीं है, यह बदसूरत है, और यह लगभग निश्चित रूप से नहीं है कि आप वैसे भी करना चाहते हैं। -1। –

+0

@ जेरी: मुझे लगता है कि बुलियन अभिव्यक्तियों का सच्चा गुणक '(!! इस्लाफा (सी) == (!! सच == !! सच)) से शुरू होता है, और इसे मूड स्ट्राइक के रूप में वहां से ले जाता है। –

संबंधित मुद्दे