2011-12-23 13 views
9
int a = 1; 
int b = (1,2,3); 
cout << a+b << endl; // this prints 4 
  1. (1,2,3) (शायद सूची में से कुछ आदिम प्रकार,?) ग में संरचना के ++ किसी प्रकार का है
  2. क्यों b मूल्य 3 असाइन किया गया है? क्या संकलक सूची से अंतिम मूल्य लेता है?
+1

उस कोड के पीछे कोई तर्क नहीं है। यह एक शिक्षक है जो अल्पविराम ऑपरेटर की आपकी समझ का परीक्षण करने के लिए तैयार होगा। उपयुक्त होने पर [होमवर्क] का प्रयोग करें। –

+0

या एक टाइपो बग है। आईई (1,2,3) कोड के लेखक का इरादा नहीं है। – ddyer

+0

संभावित डुप्लिकेट [कॉमा ऑपरेटर \ ', \' सी में क्या करता है?] (Http: // stackoverflow।कॉम/प्रश्न/52550/व्हाट-डू-द-कॉमा-ऑपरेटर-डू-इन-सी) –

उत्तर

8

हां, यह बिल्कुल है: संकलक अंतिम मूल्य लेता है। यह अल्पविराम ऑपरेटर है, और यह अपने ऑपरेटरों को बाएं से दाएं का मूल्यांकन करता है और सबसे सही रिटर्न देता है। यह बाएं से दाएं भी हल करता है। कोई भी ऐसा कोड क्यों लिखता है, मुझे कोई जानकारी नहीं है :)

तो int b = (1, 2, 3)int b = 3 के बराबर है। यह किसी भी तरह की एक प्राचीन सूची नहीं है, और अल्पविराम ऑपरेटर , उदाहरण के लिए a += 5, b += 4, c += 3, d += 2, e += 1, f जैसे एक अभिव्यक्ति के संदर्भ में एकाधिक आदेशों का मूल्यांकन करने के लिए उपयोग किया जाता है।

+4

एक अच्छा उपयोग (प्रकार) के अंदर है (; ++ x, ++ y) –

+0

@ लोकी एस्टारी: हाँ। (मुझे अभी एहसास हुआ - "कोई भी इस तरह कोड क्यों लिखता है, मुझे नहीं पता" मैं '(1, 2, 3) 'का जिक्र कर रहा था, जो बेकार है। अल्पविराम ऑपरेटर अन्य मामलों में ठीक है')) – Ryan

+0

एकमात्र संभव (जरूरी नहीं है) कारण मैं सोच सकता हूं कि आप एक साथ संचालन का एक गुच्छा स्ट्रिंग करेंगे जहां आप प्रत्येक के परिणामों की परवाह नहीं करेंगे। [उदाहरण] (http://ideone.com/MuwxQ)। * संपादित करें: * और लोकी एक और होगा। – FakeRainBrigand

6

(1,2,3) अल्पविराम ऑपरेटर के दो उदाहरणों का उपयोग करके एक अभिव्यक्ति है। अल्पविराम ऑपरेटर अपने बाएं ऑपरेंड का मूल्यांकन करता है, फिर एक अनुक्रम बिंदु होता है और फिर यह अपने दाएं ऑपरेंड का मूल्यांकन करता है। अल्पविराम ऑपरेटर का मूल्य दाएं हाथ के संचालन के मूल्यांकन का नतीजा है, बाएं ऑपरेंड का मूल्यांकन करने का नतीजा त्याग दिया जाता है।

int b = (1,2,3); 

, इसलिए है, के बराबर: के रूप में वहाँ केवल कभी एक अल्पविराम ऑपरेटर का उपयोग करने के लिए एक बिंदु है

int b = 3; 

सबसे compilers अल्पविराम संकार्य का इतना उपयोग के बारे में चेतावनी देगा अगर बाएं हाथ अभिव्यक्ति कुछ दुष्प्रभाव है।

1

यह अल्पविराम ऑपरेटर है जो expr, expr रूप लेता है। पहली अभिव्यक्ति का मूल्यांकन किया जाता है और परिणाम त्याग दिया जाता है, दूसरी अभिव्यक्ति का मूल्यांकन किया जाता है और इसका परिणाम वापस कर दिया जाता है। दूसरी पंक्ति

((1, 2), 3) => 
(2, 3) => 
3 
4

अल्पविराम ऑपरेटर का उपयोग किया जाता है:

आपके मामले में है कि रेखा के रूप में मूल्यांकन किया जाता है। जैसे

a, b 

एक अभिव्यक्ति दोनों a मूल्यांकन करता है और b और b देता है।

इस मामले में, दूसरी पंक्ति की तरह पार्स किया गया है:

int b = ((1, 2), 3); 

तो (1, 2) (2 करने के लिए) का मूल्यांकन किया जाता है तो फेंक दिया, और अंतिम परिणाम बस 3.

-3

यह शायद करने के लिए प्रयोग किया जाता है बी = foo (1,2,3) हो लेकिन foo गलती से हटा दिया गया है। सी इस तरह के बकवास के बारे में शिकायत नहीं करता है "यह एक सुविधा है"।

+0

मुझे लगता है कि आप में से जो इस जवाब को कम कर रहे हैं, वे एक महत्वपूर्ण बिंदु खो रहे हैं। कोई भी इस कोड को नहीं लिखता है। यदि प्रश्नकर्ता इस कोड को समझने की कोशिश कर रहा है, तो उसे समझना चाहिए कि यह वास्तव में लेखक का इरादा नहीं है। – ddyer

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