एक कार्यान्वयन के लिए जो f0
और f1
को उसी बाइट में पैक करता है, नीचे दिया गया प्रोग्राम परिभाषित किया गया है?बिट-फ़ील्ड और अनुक्रम बिंदु
struct S0 {
unsigned f0:4;
signed f1:4;
} l_62;
int main (void) {
(l_62.f0 = 0) + (l_62.f1 = 0);
return 0;
}
मुझे सी 99 और सी 11 के जवाब में दिलचस्पी है यदि ऐसा लगता है कि यह अलग है। 2:
पिछले और अगले अनुक्रम बिंदु एक वस्तु एक अभिव्यक्ति के मूल्यांकन से अधिकतम एक बार अपने संग्रहीत मूल्य मोदी फाई एड होगा बीच
C99 में, मैंने पाया 6.5 था। [...]
यह मेरे लिए स्पष्ट नहीं है कि इस पैराग्राफ के ऊपर के कार्यक्रम पर क्या परिणाम हैं।
बड़ी संख्या में यादृच्छिक परीक्षणों के आधार पर, अधिकांश कंपाइलर कोड उत्पन्न करते हैं जहां दो असाइनमेंट हस्तक्षेप नहीं करते हैं।
मानकों के उन हिस्सों ने मुझे सिरदर्द दिया। मेरा वर्तमान पठन यह है कि इरादा यह है कि यह यूबी है (उदाहरण के लिए यह सी 11 में स्पष्ट है कि दो क्षेत्रों में दो फ़ील्ड को संशोधित करना एक कोर्स सिंक्रनाइज़ नहीं है), लेकिन 6.5 में भाषा दूसरे क्षेत्र की तरह बिट-फील्ड का उल्लेख करना भूल जाती है ऐसी जगहें जहां बिट-फ़ील्ड में विशेष हैंडलिंग होती है। – AProgrammer
@AProgrammer: उपर्युक्त कोड में स्पष्ट तार्किक अर्थ है (लिखने के साथ अनुक्रमिक रूप से होता है, क्रमशः क्रम में होता है) और ऐसा कोई कारण नहीं है कि एक कंपाइलर जिसका लेखक नहीं जा रहा है, उस कोड को उत्पन्न नहीं करना चाहिए जो उस व्यवहार को उत्पन्न करता है सिंगल-थ्रेड केस में। क्या आप किसी भी व्यावहारिक कारण का सुझाव दे सकते हैं कि क्यों मानक के लेखक इसका उद्देश्य यूबी बन सकते हैं? – supercat