2009-07-07 11 views
7

मेरे पास एक साधारण सवाल है कि मैं ज्यादातर अपनी जिज्ञासा के लिए प्रस्तुत कर रहा हूं।लूप स्थिति के लिए प्रदर्शन अंतर?

कोड की इन दो पंक्तियों के बीच अंतर क्या हैं? (सी ++ में)

for(int i = 0; i < N, N > 0; i++) 

for(int i = 0; i < N && N > 0; i++) 

की स्थिति का चयन पूरी तरह से मनमाना है, मैं तो बस के बीच मतभेद में दिलचस्पी रखता हूँ, और & &।

मैं किसी भी माध्यम से कोडिंग करने वाला शुरुआत नहीं कर रहा हूं, लेकिन मैंने कभी भी अल्पविराम ऑपरेटर से परेशान नहीं किया है।

क्या प्रदर्शन/व्यवहार अंतर हैं या यह पूरी तरह से सौंदर्यशास्त्र है?

एक आखिरी नोट, मुझे पता है कि एक सशर्त ऑपरेटर की तुलना में तलना करने के लिए बड़ी प्रदर्शन मछली है, लेकिन मैं सिर्फ उत्सुक हूं। मुझे लिप्त करो।

अपने उत्तरों के लिए धन्यवाद।

यह कोड बताता है कि इस प्रश्न ने मुझे बताए गए तरीके से अल्पविराम ऑपरेटर का दुरुपयोग किया था। मुझे आश्चर्य हुआ कि अंतर क्या था और यह & & ऑपरेटर क्यों नहीं था, लेकिन यह गलत तरीके से लिखा गया था। मैंने नहीं सोचा था कि इसमें कुछ भी गलत था क्योंकि यह ठीक काम करता था। मुझे बाहर करने के लिए धन्यवाद।

+0

आप प्रदर्शन के बारे में चिंतित क्यों हैं? इस प्रश्न का उत्तर पाने में समय लगता है कि 9 नैनोसेकंड जिन्हें आप एक या दूसरे नोटेशन का उपयोग करके सहेज चुके होंगे, पहले ही खो जाएंगे। "समयपूर्व अनुकूलन सभी बुराइयों की जड़ है ..." – Juliet

+17

उसने यह नहीं कहा कि वह चिंतित था - बस उत्सुक है। मैं वास्तव में चाहता हूं कि हर बार जब कोई "सिर्फ जानना चाहता है" लोगों को "समयपूर्व अनुकूलन" झंडा लहराएगा। जिज्ञासा एक * अच्छी बात * है। –

+5

मुझे आश्चर्य है कि अगर एसओ ने एक फ़िल्टर लागू किया है तो हर बार कितना समय बचाया जाएगा, हर बार जब कोई प्रश्न में "प्रदर्शन" या "तेज़" शब्दों का उल्लेख करता है, तो बस एक टिप्पणी ऑटो-पोस्ट करता है, "आपको इसके बारे में सोचने की अनुमति नहीं है कि, नागरिक, अब काम पर वापस आते हैं ";-) –

उत्तर

10

हालांकि यह यह कैसा दिखता,

for(int i = 0; i < N, N > 0; i++) 

और

for(int i = 0; i < N && N > 0; i++) 

बराबर नहीं हैं।

यहां सबूत है।

int main(int argc, char* argv[]) 
{ 
    int N = 10; 
    int i = 5; 

    int val = (N, i); 
    cout << val << endl; 
} 

परिणाम:

5 

जिसका मतलब है कि यह निर्धारित करते हुए जब पाश बाहर निकल जाएगा यह N > 0 का प्रयोग करेंगे। यदि N = 10, इसका मतलब है कि यह हमेशा सत्य होगा और लूप कभी बाहर नहीं निकलेगा।

इसे चलाएं और सबूत देखें।

int main(int argc, char* argv[]) 
{ 
    int N = 10; 
    int i = 5; 

    for(int i = 0; i < N, N > 0; i++){ 
    cout << val << endl; 
    } 
} 

bash-2.05$ ./a.out     
0         
1         
2         
3         
4         
5         
6         
7         
8         
9         
10         
11         
... 
142 
143 
144 
145 
146 
147 
148 
^C 

तो एन एक निरंतर या चर कि पाश अंदर परिवर्तन नहीं करता है तो आप बस इसे एक बार जाँच पहले, अर्थात द्वारा N > 0 चेक निकालने के कर सकता है

if (N > 0){ 
    for (int i = 0; i < N; i++) 
    ... 
} 
+0

मुझे नहीं पता कि किसी ने इसे क्यों वोट नहीं दिया। जब मैं एक व्याख्या के लिए पूछता हूं तो मुझे एक अच्छी तरह से सोचा और विस्तृत जवाब पसंद है। धन्यवाद – CodeFusionMobile

+3

मैं इसे वोट नहीं दूंगा क्योंकि यह स्पष्ट रूप से अंतर नहीं बताता है, और मानक या किसी भी दस्तावेज़ीकरण को देखने के बजाय प्रयोग द्वारा अर्थ निर्धारित करने का प्रयास करता है। –

+0

मुझे व्यक्तिगत रूप से उदाहरण और प्रयोग पसंद हैं। RichieHindle का जवाब छोटा और सटीक था, लेकिन बहुत वर्णनात्मक नहीं था और न ही यह मेरे प्रश्न का उत्तर दिया कि वास्तविक अंतर क्या है। यहां तक ​​कि अगर इस जवाब ने समस्या के पीछे कारण का विस्तार नहीं किया है, तो भी वास्तव में इस सवाल का जवाब दिया गया था। – CodeFusionMobile

33

इस तरह के कॉमा का उपयोग करके पहली स्थिति को त्याग देगा।

अल्पविराम ऑपरेटर का अर्थ है "इस आदेश में इन बयानों को चलाएं, और अंतिम के मूल्य को लें"।

+0

इसमें पूरी तरह से इसे अनदेखा करता है और चेक नहीं करता है? – Victor

+2

"i < N, N > 0'" का मान "' N> 0' "के मान के समान है। – ephemient

+1

@ विक्टर: यह तुलना करता है I और N, परिणाम को छोड़ देता है, फिर एन और 0 की तुलना करता है और यह तय करने के लिए परिणाम का उपयोग करता है कि लूप जारी रखना है या नहीं। अनुकूलित कोड में, यह शायद I और N – RichieHindle

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