2012-06-29 26 views
12

संभव डुप्लिकेट:
In C++ why can't I write a for() loop like this: for(int i = 1, double i2 = 0;
Why is it so 'hard' to write a for-loop in C++ with 2 loop variables?सी ++ लूप के लिए एकाधिक प्रारंभकर्ताओं का समर्थन क्यों नहीं करता है?

#include <iostream> 
using namespace std; 

int main() 
{ 
    for (int i = 0, double j = 3.0; i < 10; i++, j+=0.1) 
     cout << i << j << endl; 
    return 0; 
} 

संकलन नहीं है, क्योंकि वहाँ के लिए लूप प्रारंभकर्ता ब्लॉक में दो घोषणा कर रहे हैं।

लेकिन क्यों?

+3

इस तरह की भाषा की वाक्य रचना है :) नहीं है तकनीकी कुछ भी नहीं है कि रोका भाषा के डिजाइनर जो आप उम्मीद करते हैं उस वाक्य में फिसलने से, लेकिन एक कारण या दूसरे के लिए उन्होंने अभी नहीं किया :( – dasblinkenlight

+2

मेरे पास समाधान है, और यह सुंदर है: http://ideone.com/DqiGm –

+1

@ बेंजामिन लिंडले: मुझे लगता है कि बदसूरत है: पी। मेरा जवाब देखें – Nawaz

उत्तर

15

सी ++ व्याकरण में, विभिन्न डेटा प्रकार ; (यदि कार्य नहीं करते हैं) से अलग होते हैं। for लूप में, ; एक बार पाया जाता है कि अर्थ बदल गया है। यानी

for (<initializations>; <condition>; <next operation>) 

अन्य कारण संभवतः पहले से ही जटिल व्याकरण में जटिलता से बचने के लिए संभव है, इस सुविधा की अनुमति नहीं है।

आप for पाश दायरे में चर घोषित करने के लिए चाहते हैं, तो आप हमेशा उस स्थिति अनुकरण कर सकते हैं:

int main() 
{ 
    { 
    double j = 3.0; 
    for (int i = 0; i < 10; i++, j+=0.1) 
     cout << i << j << endl; 
    } 
    return 0; 
} 
8

क्योंकि वाक्य रचना पहले ही ले लिया गया था। एक परिवर्तनीय घोषणा/परिभाषा में, अल्पविराम से अलग होने से एक ही प्रकार के नए चर शामिल होते हैं, न कि विभिन्न प्रकारों के। यही कारण है कि वाक्य रचना for छोरों में उपलब्ध है:

for (std::vector<int>::const_iterator it = v.begin(), end = v.end(); 
     it != end; ++it) { 
    // do something here 
} 
+0

यदि कोई लिखता है, 'int i, d;' तो यह समझा जाता है कि चर समान प्रकार (लूप के अंदर या बाहर) होना चाहिए। लेकिन, मुझे लगता है कि पूछताछ बहस कर रही है कि क्यों कुछ और जटिलता जोड़कर, मैं int, डबल डी; 'सी ++ व्याकरण द्वारा अनुमति नहीं है। – iammilind

+0

@iammilind: लूप के लिए पहला ब्लॉक एक परिवर्तनीय घोषणा है।उस संदर्भ में, अल्पविराम में पहले से ही एक अर्थ और सटीक अर्थशास्त्र है जो सभी अन्य परिवर्तनीय घोषणाओं के अनुरूप हैं। निस्संदेह आप सभी निर्माण विशेष मामले कर सकते हैं, इसे एक * फॉर-लूप-घोषणा-सूची * पर कॉल करें और घोषणा के लिए उपलब्ध वही अवधारणाओं को पूरी तरह से परिभाषित करें। परिणाम नियमों का एक और जटिल सेट होगा जिसमें उनके (तर्कसंगत रूप से कम उपयोग के मामले) का समर्थन करने के लिए मुझे किसी भी वास्तविक वास्तविक मूल्य के लिए पहले से ही जटिल प्रकार के पुनरावृत्ति को फिर से टाइप करना होगा (यह किसी भी नए निर्माण –

+2

को सक्षम नहीं करता है .. यदि आपको विभिन्न प्रकार के परिभाषित विभिन्न प्रकारों की आवश्यकता होती है तो सरल कामकाज होते हैं। स्टार्टर्स के लिए, जैसा कि आपने प्रस्तावित किया है, आप लूप को एक दायरे में संलग्न कर सकते हैं और उस दायरे में अन्य सभी चर घोषित कर सकते हैं। आप समग्र प्रकारों का उपयोग करके अतिरिक्त दायरे से भी बच सकते हैं , जैसे 'std :: pair': 'के लिए (जोड़ी पी (0, 0.0); पी। फर्स्ट <10; ++ पी। फर्स्ट, पी। सेकेंड + = 0.1)' ... या कई ऐसे चर के लिए tuples। –

38

आप int और double दोनों चाहते हैं प्रारंभ में, है, तो एक तरह से यह करने के लिए एक गुमनाम struct को परिभाषित करने के लिए है! हां, आप for लूप में struct को परिभाषित कर सकते हैं। यह सी के ++ एक कम ज्ञात सुविधा हो रहा है:

#include <iostream> 

int main() 
{ 
    for(struct {int i; double j;} v = {0, 3.0}; v.i < 10; v.i++, v.j+=0.1) 
     std::cout << v.i << "," << v.j << std::endl; 
} 

आउटपुट:

0,3 
1,3.1 
2,3.2 
3,3.3 
4,3.4 
5,3.5 
6,3.6 
7,3.7 
8,3.8 
9,3.9 

ऑनलाइन डेमो: http://ideone.com/6hvmq

+5

सुंदर समाधान के लिए +1, कभी इस बारे में सोचा नहीं। लेकिन मुझे लगता है कि, अनाम 'संरचना' g ++ एक्सटेंशन हैं। क्या इस तरह सभी कंप्यूटर्स में अनुमति है? – iammilind

+2

@iammilind: यह g ++ एक्सटेंशन नहीं है। यह मानक सी ++ है। – Nawaz

+0

मैं ' मैं आपकी दूसरी वाक्य से उलझन में हूँ। टी था यहां कभी संदेह है कि हम structs परिभाषित कर सकते हैं? ऐसा कुछ प्रतीत नहीं होता है जिसे विशेष प्रतिज्ञान की आवश्यकता होती है। "साथ ही" क्या संदर्भित करता है? –