2010-04-22 13 views
155

क्या सी ++ में लूप के प्रारंभिक निकाय में विभिन्न प्रकार के दो चर घोषित करना संभव है?क्या लूप के लिए विभिन्न प्रकार के दो चर घोषित करना संभव है?

उदाहरण के लिए:

for(int i=0,j=0 ... 

दो पूर्णांकों परिभाषित करता है। क्या मैं प्रारंभिक निकाय में int और char परिभाषित कर सकता हूं? यह कैसे किया जाएगा?

+3

यह जी में ++ संभव है: हालांकि दो से अधिक प्रकार को यह सामान्यीकरण करने के लिए कोई मानक तरीका नहीं है , जे = 0.0; ... ', लेकिन यह संभावना जी ++ - 4.5 में सी ++ 0x ग्रंथों के साथ मेल खाने के लिए हटा दी गई थी। – rafak

+0

संभावित डुप्लिकेट [क्या मैं लूप के प्रारंभ में विभिन्न प्रकार के चर घोषित कर सकता हूं?] (http://stackoverflow.com/questions/8644707/can-i-declare-variables-of- अलग-types-in-the-initialization-of-a-for-loop) –

+2

वास्तव में अन्य प्रश्न को बंद किया जाना चाहिए इसका एक डुप्लिकेट, क्योंकि इसमें बेहतर उत्तर हैं। –

उत्तर

160

संभव नहीं है, लेकिन आप कर सकते हैं:

float f; 
int i; 
for (i = 0,f = 0.0; i < 5; i++) 
{ 
    //... 
} 

या, स्पष्ट रूप से f और i अतिरिक्त कोष्ठक का उपयोग कर के दायरे को सीमित:

{ 
    float f; 
    int i; 
    for (i = 0,f = 0.0; i < 5; i++) 
    { 
     //... 
    } 
} 
+0

आह। यह एक अच्छा समाधान जैसा प्रतीत होता है। मैं इसे देख लूंगा। –

+0

मुझे पता है कि यह एक बहुत पुराना सवाल है, लेकिन क्या आप समझा सकते हैं कि क्यों कुछ अपने दूसरे उदाहरण में, इसके आस-पास के अतिरिक्त ब्रैकेट के साथ ऐसा करेंगे? – ford

+8

@fizzisist स्पष्ट रूप से एफ के दायरे को सीमित करने के लिए और मैं केवल कोड के उन हिस्सों तक सीमित करता हूं जहां उनका उपयोग किया जाता है। –

13

आप प्रारंभ में कई प्रकार के की घोषणा नहीं कर सकते हैं , लेकिन आप कई प्रकार के ईजी को असाइन कर सकते हैं

{ 
    int i; 
    char x; 
    for(i = 0, x = 'p'; ...){ 
     ... 
    } 
} 

बस उन्हें अपने दायरे में घोषित करें।

214

नहीं - लेकिन तकनीकी रूप से वहाँ एक काम के आसपास (है कि मैं वास्तव में उसका प्रयोग करेंगे जब तक करने के लिए मजबूर) है:

for(struct { int a; char b; } s = { 0, 'a' } ; s.a < 5 ; ++s.a) 
{ 
    std::cout << s.a << " " << s.b << std::endl; 
} 
+49

upvoting। –

+1

यह वीएस 2008 पर संकलित नहीं है, लेकिन ऑनलाइन Comau पर करता है ;-) – JRL

+6

@JRL: ओह, न तो VS2005 करता है। फिर भी मुझे लगता है कि वीसी ++ में एक और गैर अनुपालन सुविधा। –

1

देखें "Is there a way to define variables of two types in for loop?" छोरों के लिए कई घोंसले से जुड़े एक और तरीका है के लिए। जॉर्ज की "स्ट्रक्चर ट्रिक" पर दूसरी तरफ का लाभ यह है कि यह (1) आपको स्थैतिक और गैर स्थैतिक स्थानीय चर का मिश्रण करने की अनुमति देता है और (2) यह आपको गैर-प्रतिलिपि करने योग्य चर रखने की अनुमति देता है। नकारात्मकता यह है कि यह बहुत कम पठनीय है और कम कुशल हो सकता है।

-1

किसी मैक्रो को परिभाषित करें:

#define FOR(typeX,x,valueX, typeY,y,valueY, condition, increments) typeX x; typeY y; for(x=valueX,y=valueY;condition;increments) 

FOR(int,i,0, int,f,0.0, i < 5, i++) 
{ 
    //... 
} 

बस इतना याद रखें कि आपका वेरिएबल स्कोप पाश के लिए इस तरह के भीतर या तो नहीं होगा।

+0

आप '{' और '}' का उपयोग करके एक अलग दायरे में मैक्रो में कोड को लपेटकर उस सीमा को आसानी से पार कर सकते हैं। –

+4

नहीं वह नहीं कर सका। उसका मैक्रो लूप बॉडी को लपेटता नहीं है। वह एक अतिरिक्त ओपनिंग ब्रैकेट जोड़ सकता था, लेकिन मैक्रो का उपयोग करते समय उसे "अतिरिक्त" समापन ब्रैकेट की आवश्यकता होगी। – John

53

सी ++ 17 के लिए आपको structured binding declaration का उपयोग करना चाहिए। वाक्यविन्यास जीसीसी -7 और क्लैंग-4.0 (clang live example) में समर्थित है। यह हमें तो जैसे एक टपल अनपैक करने के लिए अनुमति देता है:

for (auto [i, f] = std::tuple{1, 1.0}; i < N; ++i) { /* ... */ } 

के लिए सी ++ 14 आप के प्रकार के आधार पर std::get इसके साथ के रूप में सी ++ 11 (नीचे) भी ऐसा ही कर सकते हैं। तो नीचे दिए गए उदाहरण में std::get<0>(t) की बजाय, आपके पास std::get<int>(t) हो सकता है।


के लिए सी ++ 11 std::make_pair आप दो से अधिक वस्तुओं के लिए यह है, साथ ही std::make_tuple करने के लिए अनुमति देता है।

for (auto p = std::make_pair(5, std::string("Hello World")); p.first < 10; ++p.first) { 
    std::cout << p.second << std::endl; 
} 

std::make_pair एक std::pair में दो तर्क वापस आ जाएगी। तत्वों को .first और .second के साथ एक्सेस किया जा सकता है।

दो से अधिक वस्तुओं के लिए, आप का उपयोग करने के लिए एक std::tuple

for (auto t = std::make_tuple(0, std::string("Hello world"), std::vector<int>{}); 
     std::get<0>(t) < 10; 
     ++std::get<0>(t)) { 
    std::cout << std::get<1>(t) << std::endl; // cout Hello world 
    std::get<2>(t).push_back(std::get<0>(t)); // add counter value to the vector 
} 

std::make_tuple कि बहस के किसी भी संख्या (बेशक कुछ तकनीकी सीमाओं के साथ) के एक टपल का निर्माण करेगी एक variadic टेम्पलेट है की आवश्यकता होगी। तत्वों पाश निकायों के लिए std::get<INDEX>(tuple_object)

के भीतर के साथ सूचकांक द्वारा पहुँचा जा सकता तो आप आसानी से वस्तुओं उर्फ, आप अभी भी लूप हालत के लिए के लिए .first या std::get का उपयोग करें और अभिव्यक्ति

for (auto t = std::make_tuple(0, std::string("Hello world"), std::vector<int>{}); 
     std::get<0>(t) < 10; 
     ++std::get<0>(t)) { 
    auto& i = std::get<0>(t); 
    auto& s = std::get<1>(t); 
    auto& v = std::get<2>(t); 
    std::cout << s << std::endl; // cout Hello world 
    v.push_back(i); // add counter value to the vector 
} 

अद्यतन करने की आवश्यकता है, हालांकि

सी ++ 98 और सी ++ 03 के लिए आप स्पष्ट रूप से std::pair के प्रकारों का नाम दे सकते हैं। - 4.4 (`-std = C++ 0x`)` (ऑटो- मैं = 0 के रूप में

for (std::pair<int, std::string> p(5, "Hello World"); p.first < 10; ++p.first) { 
    std::cout << p.second << std::endl; 
} 
+1

यदि आप सी ++ 17 कर रहे हैं, तो आप 'make_' भी छोड़ सकते हैं और 'std :: pair (1, 1.0) लिख सकते हैं। –

+0

बालों वाली सी ++ 14 शैली ट्यूपल/जोड़ी व्यवसाय - सभी अच्छे (शायद, ऊपर से ऊपर), लेकिन विचित्र लग रहा है :) – mlvljr

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