2013-08-09 15 views
10

मुझे यह मेरे कोड में मिला, मेरे हिस्से पर एक टाइपो था, लेकिन यह अभी भी संकलित है। किसी को पता है क्यों? मुझे कोई जानकारी नहीं है।स्ट्रिंग concatenation, यह संकलन क्यों करता है?

#include <string> 
#include <iostream> 

int main() 
{ 
    std::string x; 
    std::string b = "Bryan"; 
    x += '|' + b, x; 
    std::cout << x << std::endl; 
} 
+0

बहुत बढ़िया मदद दोस्तों, धन्यवाद बहुत मेरे लिए यह ऊपर समाशोधन –

+4

साइड नोट के लिए:

ही, यदि आप पर चेतावनी के साथ अपने कोड संकलन, आप की संभावना एक चेतावनी इस के समान प्राप्त होगा आप संकलन हैं चेतावनियों के साथ 'g ++ -Wall' चेतावनी उत्पन्न करता है: अल्पविराम ऑपरेटर के दाएं ऑपरेंड का कोई प्रभाव नहीं पड़ता है [-उन्यूज्ड-वैल्यू] ' – FDinoff

+1

यदि आपने चेतावनियां सक्षम की हैं, तो आपको एक कंपाइलर चेतावनी मिलनी चाहिए। संकलक यह बता सकता है कि 'x' कुछ भी नहीं करता है, जिसका अर्थ है कि यह शायद एक गलती है। –

उत्तर

21
x += '|' + b, x; 

यहाँ , मूल रूप से एक ऑपरेटर जिसका बाईं संकार्य पहले मूल्यांकन किया जाता है, सही संकार्य के बाद है। यह इतना आसान है।

के बाद से += और + की पूर्वता , ऑपरेटर तुलना में अधिक है, यह इस के बराबर हो जाता है:

(x += '|' + b) , x; 
यहाँ

:

left operand => (x += '|' + b) 
right operand => x 

एक और उदाहरण का प्रयास करें:

int f() { ... } 
int g() { ... } 

f(), g(); 

यहां f() विल मुझे पहले g() द्वारा बुलाया जाना चाहिए।

उम्मीद है कि मदद करता है।

+0

'= =' '' 'से अलग तरीके से क्यों व्यवहार किया जाता है? – mohit

+0

@ मोहित: मुझे नहीं पता कि आपका क्या मतलब है "अलग-अलग"। फिर भी मुझे लगता है कि आप यह जानना चाहते हैं: '+ =' और '=' की वही प्राथमिकता है। यह सिर्फ इतना है कि, 'दोनों की तुलना में कम प्राथमिकता है! – Nawaz

+0

समझ गया। मैं गलत इंप्रेशन के तहत था कि 'ए = 4, 5;' '''' ''' सेट करेगा। धन्यवाद। – mohit

2
x += '|' + b, x; 

यह एक अल्पविराम ऑपरेटर है, जिसमें सबसे कम प्राथमिकता है। इसमें दो ऑपरेंड होते हैं, उनका मूल्यांकन बाएं से दाएं होता है। इस उदाहरण में इसके दोनों ऑपरेशंस पूरी तरह से कानूनी हैं:

ध्यान दें कि अल्पविराम ऑपरेटर के पास सही ऑपरेंड का मूल्य है, लेकिन यह आमतौर पर बेकार है, जैसा कि इस उदाहरण में है। तो यह के साथ एक ही है:

x += '|' + b; 
x; // no effect 
2
x += '|' + b, x; 

यह क्योंकि , ऑपरेटर से पहले अभिव्यक्ति प्रभाव लेता है। उदाहरण के लिए -

std::string y("Hello"); 
x += '|' + b, y; 

ऊपर अभी भी अपने कार्यक्रम में परिणाम |Bryan देना होगा।

3
x += '|' + b, x; 

यह संकलित क्योंकि अल्पविराम यहाँ एक ऑपरेटर (एक विभाजक के बजाय) के रूप में काम कर रहा है जहां दायां संकार्य कोई प्रभाव नहीं है।

Wikipedia से:

C और C++ प्रोग्रामिंग भाषाओं, अल्पविराम ऑपरेटर में (टोकन के प्रतिनिधित्व वाले,) एक द्विआधारी ऑपरेटर की कि उसकी पहली संकार्य मूल्यांकन करता है और परिणाम को छोड़ देता है, और फिर दूसरे का मूल्यांकन करता है ऑपरेंड और इस मान (और प्रकार) देता है।

...

अल्पविराम ऑपरेटर किसी भी सी ऑपरेटर के निम्नतम पूर्वता है ...

x += '|' + b, x; में, ऑपरेटर +=, तुलना में एक उच्च पूर्वता है और ऑपरेटर ++= तुलना में एक उच्च पूर्वता है, जिसका अर्थ है कि यह (x += ('|' + b)), x के बराबर है;

warning: right-hand operand of comma has no effect 
संबंधित मुद्दे