2015-10-12 10 views
8
char s1[] = "0"; 
char s2[] = "9"; 
printf("%d\n", strcmp(s1, s2)); // Prints -9 
printf("%d\n", strcmp("0", "9")); // Prints -1 

स्ट्रैम्प एक ही पैरामीटर प्राप्त करते समय अलग-अलग मान क्यों देता है?strcmp() एक ही स्ट्रिंग तुलना के लिए अलग-अलग मान लौटाते हैं

ये मान अभी भी कानूनी हैं क्योंकि strcmp के मैन पेज का कहना है कि strcmp का वापसी मूल्य 0 से कम, अधिक या बराबर हो सकता है, लेकिन मुझे समझ में नहीं आता कि वे इस उदाहरण में क्यों अलग हैं।

+2

http://ideone.com/S3dYMQ अगर कोई भी खेलना चाहता है ... –

उत्तर

4

मुझे लगता है कि आप इसे संकलित करते समय जीसीसी का उपयोग कर रहे हैं, मैंने इसे 4.8.4 पर करने की कोशिश की। यहां की चाल यह है कि जीसीसी कुछ मानक पुस्तकालय कार्यों (strcmp उनमें से एक होने के अर्थशास्त्र को समझता है)। आपके मामले में, कंपाइलर दूसरे strcmp कॉल को पूरी तरह खत्म कर देगा, क्योंकि यह जानता है कि strcmp दिए गए स्ट्रिंग स्थिरांक "0" और "9" नकारात्मक परिणाम होंगे, और कॉल करने के बजाए मानक संगत मान (-1) का उपयोग किया जाएगा। यह पहली कॉल के साथ ऐसा नहीं कर सकता है, क्योंकि s1 और s2 स्मृति में बदल दिया गया हो सकता है (एक बाधा, या एकाधिक धागे इत्यादि की कल्पना करें)।

आप इसे सत्यापित करने के लिए एक प्रयोग कर सकते हैं। सरणियों को const क्वालीफायर जोड़े जीसीसी जानते हैं कि वे नहीं बदला जा सकता जाने के लिए:

const char s1[] = "0"; 
const char s2[] = "9"; 
printf("%d\n", strcmp(s1, s2)); // Now this will print -1 as well 
printf("%d\n", strcmp("0", "9")); // Prints -1 

तुम भी कोडांतरक उत्पादन देख सकते हैं संकलक (-S ध्वज का उपयोग करें) के रूप में।

हालांकि जांच करने का सबसे अच्छा तरीका -fno-builtin का उपयोग करना है, जो इस अनुकूलन को अक्षम करता है। इस विकल्प के साथ, आपका मूल कोड दोनों मामलों में प्रिंट करेगा -9

3

अंतर strcmp के कार्यान्वयन के कारण है। जब तक यह (< 0, 0,> 0) के अनुरूप है, यह डेवलपर से कोई फर्क नहीं पड़ता। आप किसी और चीज पर भरोसा नहीं कर सकते हैं। आप सभी जानते हैं कि, स्रोत कोड यह निर्धारित कर सकता है कि यह नकारात्मक होना चाहिए, और यादृच्छिक रूप से आपको फेंकने के लिए ऋणात्मक संख्या उत्पन्न करना।

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