सी हमेशा एक तत्व जब A[i]
साथ एक सरणी से पढ़ने, कि है, जब अभिव्यक्ति A[i]
एक "rvalue" है प्रतियां। हालांकि, जब विचार लिखते हैं, सी 'lvalue "भाव है, जो अनिवार्य अभिव्यक्ति वाक्य रचना की एक सीमित सबसेट है कि एक काम के स्थल के रूप में प्रकट करने के लिए अनुमति दी जाती है कर रहे हैं की एक धारणा है:
X = Y
*X = Y
X[i] = Y
X.n = Y
इन मामलों में, "भाव" *X
, X[i]
, और X.n
वास्तव में करने के लिए मूल्यांकन नहीं मान-वे अभिव्यक्ति के रूप में एक ही वाक्य रचना है, सुविधा के लिए, लेकिन एक ही अर्थ विज्ञान। आप और अधिक की तरह कुछ के रूप में इन के बारे में सोच सकते हैं:
memcpy(&X, &Y, sizeof(Y));
memcpy(&*X, &Y, sizeof(Y));
memcpy(&X[i], &Y, sizeof(Y));
memcpy(&X.n, &Y, sizeof(Y));
या, वैकल्पिक रूप से, कई अलग काम ऑपरेटरों होने के रूप में सी के बारे में सोच:
_ = _ // direct assignment
*_ = _ // indirect assignment
_[_] = _ // special case of indirect assignment
_._ = _ // special case of indirect assignment
किसी भी तरह से, एक काम जैसे A[5] += 1
A
के छठे तत्व के मूल्य में वृद्धि होगी, जैसा कि आप उम्मीद करेंगे, जिसे आप इस तरह सत्यापित कर सकते हैं:
int A[1] = { 1 };
A[0] += 5;
printf("%d\n", A[0]); // 6
'एक [5]' सरणी तत्व सीधे dereferences, कोई अस्थायी शामिल प्रतियां। – user0042
'ए [5] + = 1' सरणी 'ए' के फिट शून्य-आधारित तत्व को बढ़ाता है। अगर ऐसा नहीं होता है, तो कंपाइलर में एक बग है। आप जो पूछ रहे हैं उसे अस्पष्ट करें। – EJP
'ए [5] + = 1' 'ए [5] = ए [5] + 1' जैसा ही है, एक अनुकूलन कंपाइलर कुछ प्रतियां, यदि कोई हो, तो संभवतः व्यक्त किया जा सकता है मशीन भाषा। – nos