क्यों बयान "2i;" संकलक त्रुटि का कारण नहीं है?


82

इसके बजाय 2*i, मैंने लापरवाही से लिखा 2i:

मुझे उम्मीद थी कि कंपाइलर त्रुटि को पकड़ लेगा। लेकिन ऐसा नहीं हुआ। तो 2iसी में एक वैध बयान है? यदि ऐसा है तो यह क्या करता है? हैरान!

मैंने gcc संस्करण 5.3.0 का उपयोग करके संकलित किया है और यहाँ असेंबली आउटपुट है:


वह कौन सा कंपाइलर है?
इहराब अल असिमी

मैं _Complexसंख्या के साथ काम नहीं करता । मानक और प्रदत्त लिंक में कुछ पढ़ने के बाद, मुझे लगता है कि @ iharob का उत्तर सही है।
इस साइट

@ ओलाफ पश्चिम एफएफटी में फास्टेट फूरियर ट्रांसफॉर्म _Complexप्रकार का उपयोग करता है । मुझे अपनी थीसिस के लिए डेटा प्रोसेसिंग सॉफ्टवेयर लिखते समय यह पता चला ( भौतिक विज्ञान वास्तव में, कंप्यूटर विज्ञान या समान नहीं ) - ( मुझे एक कम पास फिल्टर लागू करना था, इसलिए दृढ़ संकल्प तो फास्ट फूरियर ट्रांसफॉर्म, इसलिए एफएफटीवी )।
इरोब अल असिमी

@iharob: हम्म, क्या यह तेज़ से तेज़ है और यदि नहीं, तो क्या मुझे पश्चिम, लेकिन आप के पूर्व में रहते हुए तेज़ का उपयोग करने की अनुमति है? ;-) गंभीरता से: जानकारी के लिए धन्यवाद। जैसा कि दिखता है, C मानक C11 के साथ समान सरल संकेतन का समर्थन भी नहीं करता है।
इस साइट के लिए बहुत ही ईमानदार

".. यूरेका 'नहीं बल्कि' दैट फनी ... 'का एक बहुत अच्छा उदाहरण!
जोंगवेयर

जवाबों:


107

यह एक gcc एक्सटेंशन है , और 2iकाल्पनिक स्थिरांक है यहां छवि विवरण दर्ज करें। तो आप एक जटिल संख्या लिख ​​सकते हैं जैसे:


12
वाह, यह एक आश्चर्य के रूप में आया था! क्या आप मुझे बताएंगे कि जब मैंने complex.h हेडर फाइल को शामिल नहीं किया था तब भी क्यों काम किया था?
daltonfury42

4
@ daltonfury42 शीर्ष लेख _Complexप्रकार के लिए है, 2iएक स्थिरांक है ( जैसा कि gcc इसे समझता है )। के साथ संयुक्त std=c99या std=c11ध्वज जोड़ें -Wallऔर आपको एक चेतावनी दिखाई देगी। इसके अलावा, वास्तव में यह वापस नहीं आता है 0लेकिन चूंकि वापसी का प्रकार _Complexऔर मूल्य होना चाहिए 0 + 2i, आप इसके साथ निरीक्षण नहीं कर सकतेprintf() । तो शायद यह सिर्फ असली हिस्सा है 0!
हिरोब अल असिमी

12
@ daltonfury42: आपके पास नहीं है #include <float.h> फ्लोटिंग पॉइंटmath.h लिए समर्थन प्राप्त करने के (या ) ।
इस साइट के लिए बहुत ही ईमानदार

2
@ daltonfury42 यह सही है। हैडर फाइलें भाषा सिंटैक्स को नहीं बदलती हैं, वे बस चर, कार्य, प्रकार आदि जैसी चीजों की घोषणा करती हैं
बरमार

2
@ daltonfury42 हालांकि इस वाक्यविन्यास की मान्यता के लिए यह संभव हो सकता है कि इसे नियंत्रित किया जा सके #pragma, जो complex.hजारी कर सके। लेकिन उन्होंने ऐसा नहीं किया।
बमर

13

2igccएक जटिल पूर्णांक शाब्दिक के लिए एक विस्तार है, एक शुद्ध काल्पनिक संख्या का दो बार वर्गमूल है -1। इस एक्सटेंशन का समर्थन किया clangजाता है।

यह कुछ आश्चर्यजनक है कि आपका संकलन gcc 5.4.0पोस्ट किए गए असेंबली आउटपुट का उत्पादन करता है:

  • Http://gcc.godbolt.org/# पर संकलित करने पर मुझे gcc5.3.0 से संकलन त्रुटि मिलती है http://gcc.godbolt.org/#:: error: cannot convert '__complex__ int' to 'int' in return
  • फ़ंक्शन के लिए पोस्ट किया गया असेंबली कोड fooगलत है: यह वापस नहीं आता है 0। अपने पूर्ण भाग को लौटाने के 2iलिए जटिल पूर्णांक स्थिरांक को बदलना ।int0

इसके विपरीत, clang3.7 के साथ , यह एक चेतावनी के बिना संकलित करता है और इष्टतम कोड उत्पन्न करता है, लेकिन निश्चित रूप से आप क्या उम्मीद करते हैं:

इस वाक्य-विन्यास को किसी भी क्रम में अन्य प्रत्ययों के साथ जोड़ा जा सकता है। नीचे दिए गए कोड को संकलित करने से clang -Weverythingमुझे उचित चेतावनी मिलती है warning: imaginary constants are a GNU extension [-Wgnu-imaginary-constant]:

यह मेरे वातावरण में इस उत्पादन का उत्पादन करता है:

अपने सिंटैक्स रंग संपादक के साथ अंतिम प्रयास करें ;-)


खैर, यह वही है जो मुझे मिला जब मैंने अपने पीसी पर जीसीसी 5.3.0 का उपयोग आर्क लिनक्स चला रहा था। यदि आप रुचि रखते हैं तो यहाँ मेरा gcc विन्यास है।
daltonfury42
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.