void main() {
if("a" == "a")
printf("Yes, equal");
else
printf("No, not equal");
}
आउटपुट क्यों है No, not equal
?
void main() {
if("a" == "a")
printf("Yes, equal");
else
printf("No, not equal");
}
आउटपुट क्यों है No, not equal
?
जवाबों:
आप जो तुलना कर रहे हैं वह अलग-अलग तारों के लिए दो मेमोरी पते हैं, जो विभिन्न स्थानों में संग्रहीत हैं। ऐसा करना अनिवार्य रूप से इस तरह दिखता है:
if(0x00403064 == 0x002D316A) // Two memory locations
{
printf("Yes, equal");
}
दो स्ट्रिंग मानों की तुलना करने के लिए निम्न कोड का उपयोग करें:
#include <string.h>
...
if(strcmp("a", "a") == 0)
{
// Equal
}
इसके अतिरिक्त, "a" == "a"
आपके कंपाइलर के आधार पर वास्तव में सही वापसी हो सकती है, जो अंतरिक्ष को बचाने के लिए संकलन समय में बराबर तारों को जोड़ सकती है।
जब आप दो चरित्र मानों (जो संकेत नहीं हैं) की तुलना कर रहे हैं, तो यह एक संख्यात्मक तुलना है। उदाहरण के लिए:
'a' == 'a' // always true
-fmerge-constants
और -fno-merge-constants
स्ट्रिंग / फ़्लोटिंग-पॉइंट-निरंतर स्थिरांक को अनुवाद इकाइयों में सक्षम / अक्षम करने के लिए, हालाँकि कुछ GCC पर ऐसा लगता है कि निरंतर विलय हमेशा उस विकल्प की परवाह किए बिना सक्षम होता है।
int
प्रकार है। :-) इसके अलावा, संकेत संख्यात्मक मान नहीं है।
int
संख्यात्मक भी है, है ना? लेकिन मुझे लगा कि बाइट्स बाइट थे। इंट 4 बाइट्स है। संकेत स्वयं पूर्णांक भी हैं। उनमें डेटा के एक समूह का पता होता है (डेटा जो वास्तव में संख्यात्मक नहीं होता है)।
'a' == 'A' // not true
... MySQL अलग करने के लिए भीख माँगती है।
मुझे पार्टी में थोड़ी देर हो गई है, लेकिन मैं वैसे भी जवाब देने जा रहा हूं; तकनीकी रूप से एक ही बिट्स, लेकिन थोड़ा अलग नजरिए से (नीचे सी पार्लेंस):
सी में, अभिव्यक्ति "a"
एक स्ट्रिंग शाब्दिक दर्शाती है , जो एक स्थिर अनाम सरणी है const char
, जिसमें दो की लंबाई होती है - सरणी में वर्ण होते हैं 'a'
और '\0'
- समाप्त करने वाला अशक्त वर्ण स्ट्रिंग के अंत को दर्शाता है ।
हालाँकि, C में, उसी तरह से आप एरर्स को वैल्यू द्वारा फंक्शन्स में पास नहीं कर सकते हैं - या उन्हें वैल्यू असाइन कर सकते हैं ( इनिशियलाइज़ेशन के बाद ) - ==
एरेज़ के लिए कोई ओवरलोड ऑपरेटर नहीं है, इसलिए सीधे उनकी तुलना करना संभव नहीं है। विचार करें
int a1[] = {1, 2, 3};
int a2[] = {3, 4, 5};
a1 == a2 // is this meaningful? Yes and no; it *does* compare the arrays for
// "identity", but not for their values. In this case the result
// is always false, because the arrays (a1 and a2) are distinct objects
यदि ==
सरणियों की तुलना नहीं कर रहा है, तो यह वास्तव में क्या करता है, फिर? C में, लगभग सभी संदर्भों में - इसमें एक - सरणियों का संकेत बिंदुओं में क्षय होता है (जो कि सरणी के पहले तत्व को इंगित करता है) - और समानता के लिए बिंदुओं की तुलना वह करता है जिसकी आप अपेक्षा करते हैं। इतना प्रभावी, जब यह कर रहा है
"a" == "a"
आप वास्तव में दो अनाम सरणियों में पहले वर्णों के पतों की तुलना कर रहे हैं । सी मानक के अनुसार, तुलना या तो सही या गलत हो सकती है (यानी 1 या 0) - "a"
एस वास्तव में एक ही सरणी या दो पूरी तरह से असंबंधित सरणियों को निरूपित कर सकता है। तकनीकी शब्दों में, परिणामी मूल्य अनिर्दिष्ट है , जिसका अर्थ है कि तुलना की अनुमति है (अर्थात यह अपरिभाषित व्यवहार या वाक्यविन्यास त्रुटि नहीं है), लेकिन या तो मान मान्य है और वास्तव में क्या होगा, इसे लागू करने के लिए (आपके संकलक) की आवश्यकता नहीं है।
जैसा कि दूसरों ने बताया है, "सी स्ट्रिंग्स" (यानी एक अशक्त चरित्र के साथ समाप्त होने वाले तार) की तुलना करने के लिए आप strcmp
मानक हेडर फ़ाइल में पाए गए सुविधा फ़ंक्शन का उपयोग करते हैं string.h
। फ़ंक्शन में 0
समान स्ट्रिंग्स के लिए वापसी मान है ; यह स्पष्ट रूप 0
से ऑपरेटर `का उपयोग करने के बजाय वापसी मूल्य की तुलना करने के लिए अच्छा अभ्यास माना जाता है ! ie, यानी
strcmp(str1, str2) == 0 // instead of !strcmp(str1, str2)
C99 के अनुसार (धारा 6.4.5 / 6)
स्ट्रिंग लिटरल
यह अनिर्दिष्ट है कि क्या ये सरणियाँ विशिष्ट हैं बशर्ते कि उनके तत्वों में उचित मूल्य हों ।
तो इस मामले में यह अनिर्दिष्ट है कि क्या दोनों "a"
अलग हैं। एक अनुकूलित संकलक "a"
रीड-ओनली लोकेशन में एकल रख सकता है और दोनों संदर्भों को संदर्भित कर सकता है।
यहां gcc पर आउटपुट देखें
क्योंकि वे 2 अलग हैं const char*
, संकेत, कोई वास्तविक मूल्य नहीं है। आप ऐसा कुछ कह रहे हैं, 0x019181217 == 0x0089178216
जो निश्चित रूप से नहीं लौटाता है
के strcmp()
बजाय का उपयोग करें==
सीधे शब्दों में कहें, सी में कोई अंतर्निहित स्ट्रिंग तुलना ऑपरेटर नहीं है। यह इस तरह तार की तुलना नहीं कर सकता है।
इसके बजाय, स्ट्रिंग की तुलना मानक लाइब्रेरी रूटीन जैसे स्ट्रैम्प () या स्ट्रिंग में प्रत्येक वर्ण के माध्यम से लूप में कोड लिखकर की जाती है।
सी में, दोहरे उद्धरण चिह्नों में एक स्ट्रिंग स्ट्रिंग के लिए एक सूचक लौटाता है। आपका उदाहरण पॉइंटर्स की तुलना कर रहा है, और स्पष्ट रूप से आपके दो संस्करण स्ट्रिंग अलग-अलग पते पर मौजूद हैं।
लेकिन यह स्ट्रिंग्स की खुद से तुलना नहीं कर रहा है, जैसा कि आप उम्मीद करते हैं।
संकेत दिए गए।
पहला "a"
एक अशक्त-समाप्त ASCII स्ट्रिंग का सूचक है।
दूसरा "a"
एक और अशक्त-टर्म ASCII स्ट्रिंग का सूचक है।
यदि आप 32-बिट संकलक का उपयोग कर रहे हैं, तो मुझे उम्मीद है "a"=="a"-4
। मैंने अभी इसे tcc / Win32 के साथ आज़माया है, और मुझे मिलता है "a"=="a"-2
। ओह अच्छा...
strcmp
एक समय में कई बाइट्स चलाने की अनुमति दे सकता है। कुछ संकलक ऐसा करते हैं, कुछ नहीं करते हैं, कुछ केवल कुछ न्यूनतम की तुलना में लंबे समय तक तार के लिए करते हैं ...
यह प्रश्न सभी शुरुआती लोगों के लिए स्पष्टीकरण का बहुत अच्छा निशान स्थापित करता है ....
मुझे भी इसमें योगदान करने दें .....
जैसा कि ऊपर सभी को बताया गया है कि आपको ऐसा आउटपुट क्यों मिल रहा है।
अब अगर आप अपना प्रोग चाहते हैं। फिर "हाँ बराबर" मुद्रित करने के लिए
या तो उपयोग करें
if(strcmp("a", "a") == 0)
{
}
या
स्ट्रिंग्स के रूप में "a" का उपयोग न करें, उन्हें वर्णों के रूप में उपयोग करें ...।
if('a'=='a')
{
printf ("yes Equal");
}
C अक्षरों में 1 बाइट लघु पूर्णांक हैं ......।
'a'
वास्तव में पूर्णांक हैं।
कुछ संकलक में 'मर्ज स्ट्रिंग्स' विकल्प होता है, जिसका उपयोग करके आप सभी निरंतर स्ट्रिंग्स को एक ही पते के लिए बाध्य कर सकते हैं। यदि आप इसका उपयोग करेंगे, "a" == "a"
तो होगा true
।
यदि चरित्र के बीच तुलना हमेशा एकल उद्धरण में होती है, जैसे
if('a' == 'a')
और C स्ट्रिंग तुलना का समर्थन नहीं कर सकता "abc" == "abc"
के साथ किया है strcmp("abc","abc")
यह आदमी चर का उपयोग नहीं करता है। इसके बजाय, वह अस्थायी रूप से पाठ सरणियों का उपयोग करता है: a
और a
। कारण क्यों
void main()
{
if("a" == "a")
printf("Yes, equal");
else
printf("No, not equal");
}
बेशक काम नहीं करता है, यह है कि आप चर की तुलना नहीं करते हैं।
यदि आप चर बनाएंगे जैसे:
char * text = "a";
char * text2 = "a";
तो आप के text
साथ तुलना कर सकते हैं text2
, और यह सच होना चाहिए
हो सकता है कि आप उपयोग करना न भूलें {
और }
=)
void main() {
if("a" == "a")
{
printf("Yes, equal");
}
else
{
printf("No, not equal");
}
}
void main
??? इव ...