2010-11-28 15 views
8

निम्न कोड में:और ऑपरेटर समारोह सूचक काम में वैकल्पिक

/* mylog.c */ 
#include <stdio.h> 
#include <stdlib.h> /* for atoi(3) */ 

int mylog10(int n) 
{ 
    int log = 0; 
    while (n > 0) 
    { 
     log++; 
     n /= 10; 
    } 
    return log; 
} 

int mylog2(int n) 
{ 
    int log = 0; 
    while (n > 0) 
    { 
     log++; 
     n >>= 1; 
    } 
    return log; 
} 

int main(int argc, const char* argv[]) 
{ 
    int (*logfunc)(int); /* function pointer */ 
    int n = 0, log; 

    if (argc > 1) 
    { 
     n = atoi(argv[1]); 
    } 

    logfunc = &mylog10; /* is unary '&' operator needed? */ 

    log = logfunc(n); 
    printf("%d\n", log); 
    return 0; 
} 
लाइन में

logfunc = &mylog10; 

मैंने देखा है एकल & ऑपरेटर (का पता) वैकल्पिक है कि, और कार्यक्रम संकलित करता है और इसके साथ या इसके बिना (जीसीसी 4.2.4 के साथ लिनक्स में) उसी तरह चलता है। क्यूं कर? क्या यह एक कंपाइलर-विशिष्ट मुद्दा है, या शायद दो अलग-अलग भाषा मानकों को संकलक द्वारा स्वीकार किया जा रहा है? धन्यवाद।

+0

बीटीडब्ल्यू- क्या इसका मतलब यह है कि फ़ंक्शन पॉइंटर "उसी तरह व्यवहार करता है" फ़ंक्शन के संदर्भ के रूप में व्यवहार करेगा? – Kos

+0

@ कोस: यह स्रोत-कोड स्तर पर वैसे ही व्यवहार कर सकता है, हालांकि समानता पूरी तरह से सतही है: अंतर्निहित सार भाषा यांत्रिकी अलग है। फिर भी, यदि आप गहराई से खोदते हैं और मशीन-स्तरीय यांत्रिकी को देखते हैं, तो आप देखेंगे कि वे वही दिखाई देते हैं। – AnT

उत्तर

13

ऑपरेटर & वास्तव में वैकल्पिक है जब आपके संदर्भ में किसी फ़ंक्शन का पता लेना (इसे किसी असाइन करना)। यह संकलक-विशिष्ट नहीं है, यह भाषा की औपचारिक परिभाषा से पालन करता है।

सममित रूप से, ऑपरेटर * एक सूचक के माध्यम से फ़ंक्शन का आह्वान करते समय वैकल्पिक है। आपके उदाहरण में, आप फ़ंक्शन को (*logfunc)(n) या logfunc(n) के रूप में आमंत्रित कर सकते हैं। आपने उत्तरार्द्ध का इस्तेमाल किया, लेकिन पूर्व भी काम करेगा।

14

आप सही हैं कि & वैकल्पिक है। क्रियाएं, जैसे सरणी, को पॉइंटर्स में स्वचालित रूप से परिवर्तित किया जा सकता है। यह न तो कंपाइलर-विशिष्ट है और न ही विभिन्न भाषा मानकों का परिणाम है। मानक, धारा 6.3.2.1, पैरा 4 से:

एक समारोह डेसिग्नेटर एक अभिव्यक्ति समारोह प्रकार किया है। सिवाय जब यह sizeof ऑपरेटर या एकल & ऑपरेटर, प्रकार के साथ "प्रकार लौटने समारोह" एक समारोह डेसिग्नेटर के संकार्य है एक अभिव्यक्ति टाइप है कि में बदल जाती है "सूचक प्रकार लौटने कार्य करने के लिए"।

+0

डाउनवॉटेड? क्यों .... –

+0

मुझे भी नीचे गिरा दिया गया था, मेरे पास एक मजबूत संदेह है कि ये प्रतिद्वंद्वी डाउनवोट थे ... यहां से मुझे एक मुआवजा है –

+0

@ अरमेन त्सूरुनियन: एक "प्रतिद्वंद्वी" आंकड़े उसे पर्याप्त डाउनवॉट नहीं दिखाते हैं अपराधी। जो मुझे स्पष्ट रूप से संदेह के तहत रखता है :) लेकिन मैंने ऐसा नहीं किया! कुछ ट्रोल के डाउनवॉट होना चाहिए। – AnT

7

सी ++ में जवाब देना। सी के लिए एक ही रखती है सी ++ मानक से

उद्धरण (4.3.1):

समारोह प्रकार टी का एक lvalue "टी करने के लिए सूचक" के प्रकार एक rvalue में बदला जा सकता नतीजा फ़ंक्शन के लिए सूचक है .00

सरणी के लिए समान है। (4.2.1)

एक lvalue या प्रकार के rvalue "सरणी ofN टी" या "अज्ञात टी के लिए बाध्य की सरणी" "टी करने के लिए सूचक" के प्रकार एक rvalue में बदला जा सकता परिणाम सरणी के पहले तत्व के लिए सूचक है।

लेकिन कृपया ध्यान दें कि ये रूपांतरण हैं और किसी भी तरह से कोई फ़ंक्शन एक फ़ंक्शन-पॉइंटर नहीं है या एक संकेतक है। HTH

+0

ओह ... मुझे लगता है कि सी purists में से एक मुझे downvoted ... –

5

मानक से (6.3.2.1/4):

एक समारोह डेसिग्नेटर एक अभिव्यक्ति समारोह प्रकार किया है।सिवाय जब यह sizeof ऑपरेटर के संकार्य या एकल & ऑपरेटर, 'प्रकार साथ' समारोह लौटने प्रकार '' एक अभिव्यक्ति प्रकार '' सूचक लौटने कार्य करने के लिए है कि में बदल जाती है एक समारोह डेसिग्नेटर है टाइप करें '

तो हाँ, & को छोड़कर वैसे भी काम करने के लिए एक सूचक उत्पन्न करता है।

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