मुझे लगता है कि आप इसे संकलित करते समय जीसीसी का उपयोग कर रहे हैं, मैंने इसे 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
स्रोत
2015-10-12 22:58:35
http://ideone.com/S3dYMQ अगर कोई भी खेलना चाहता है ... –