2011-01-18 14 views
7

मैं हाल ही में इस निर्माण में आया: int (m); जो कि समतुल्य लगता है: int m;सी ++ परिवर्तनीय गिरावट वाक्यविन्यास

विचित्र रूप से, मैंने कभी इस विशेष मुहावरे को कभी नहीं देखा है। क्या कोई मुझे संदर्भ में इंगित कर सकता है जहां मैं इस पर spec पढ़ सकता हूं, या बस सीधे समझा सकता हूं? क्या यह सीधे सी में भी काम करता है?

धन्यवाद, ConfusedDeveloper

+3

हालांकि यह एक पूर्णांक घोषित करने के लिए पूरी तरह से कानूनी वाक्यविन्यास है, क्योंकि आपके साथी डेवलपर्स के लिए इसे 'int m' में बदल दिया गया है। –

उत्तर

11

यह एक "मुहावरा" नहीं है। यह केवल कोष्ठक की एक अनावश्यक जोड़ी है। व्याकरणिक रूप से, वे वहां हो सकते हैं, लेकिन वे कोई उद्देश्य नहीं देते हैं।

कभी कभी समान प्रतीत होता है ज़रूरत से ज़्यादा कोष्ठक, सी ++ घोषणाओं में अस्पष्टता को हल करने के लिए इस्तेमाल किया जा सकता है की तरह

int a(int()); 

, जिसमें यह घोषणा एक समारोह

int a((int())); 

जो

int a = int(); 
के बराबर है में बदल सकता है

और एक चर परिभाषित करता है। लेकिन यह आपके मामले में बिल्कुल ठीक नहीं है।

+2

माइनर नाइटपिक: यह हमेशा अनावश्यक नहीं है। उदाहरण के लिए, आप 'cout << int (n)' लिख सकते हैं, लेकिन 'cout << int n' नहीं। – suszterpatt

+0

धन्यवाद, यह सहायक है। बीटीडब्ल्यू, मुहावरे की परिभाषा: एक अभिव्यक्ति द्वारा स्वीकृत एक अभिव्यक्ति जो किसी भाषा के लिए विशिष्ट है। एक उचित वर्णन लगता है। – ConfusedDeveloper

+7

@suszterpatt: प्रश्न विशेष रूप से घोषणाओं के बारे में था। आपके उदाहरण में कोई भी घोषणा शामिल नहीं है। आपका उदाहरण अभिव्यक्तियों में '()' के बारे में है, जो एक पूरी तरह से अलग कहानी है। – AnT

1

इसे कास्ट करने के लिए भी उपयोग किया जाता है। पसंद है,

double m= 10.0; 
int n= int(m); 
+0

प्रश्न घोषणाओं के बारे में है, और यह बिल्कुल एक घोषणा नहीं है, केवल कुछ ऐसा दिखता है। – aschepler

+2

@aschepler: हां। चूंकि यह समान दिखता है, इसलिए मैं इसे पोस्ट करता हूं। बस उसे बताना चाहता था कि यह भी इसका उपयोग कैसे किया जाता है। :-) – Nawaz

1

अन्य उत्तरों के अलावा, कभी-कभी घोषणाकर्ता को भी संश्लेषित किया जाना चाहिए।
उदाहरण के लिए:

struct A {}; 

struct B { A a; }; 

namespace N { 
    struct B { int a; }; 

    void f() 
    { 
    A (::B::*p) = &::B::a; // this() cannot be omitted 
    } 
} 

तो () उपरोक्त कोड में छोड़ दिया जाता है, संकलक एक लगातार नेस्टेड नाम विनिर्देशक A::BA और ::B के बजाय पहचानता है, और एक त्रुटि जारी करेगा।
यह संश्लेषण आवश्यक है, लेकिन कभी-कभी एक भ्रामक स्थिति की ओर जाता है।

struct A { 
    int m; 
    A() {} 
    A(int) {} // this isn't called 
}; 

int i; 

int main() 
{ 
    A(i); // this is a declaration 
    i.m = 1; // ok 
} 

उपरोक्त कोड में, A(i) एक वस्तु i, के बजाय एक int तर्क i के साथ एक निर्माता कॉल अभिव्यक्ति की घोषणा (और यह भी इस मामले में एक परिभाषा) है।

उम्मीद है कि इससे मदद मिलती है।

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