निम्नलिखित कार्यक्रम में:मूल्यांकन आदेश
#include <iostream>
struct I {
int i;
I(){i=2;}
I(int _i){i=_i;}
};
int a[3] = {a[2] = 1};
int aa[3][3] = {aa[2][2] = 1};
I A[3] = {A[2].i = 1};
I AA[3][3] = {AA[2][2].i = 1};
int main(int argc, char **argv) {
for (int b : a) std::cout << b << ' ';
std::cout << '\n';
for (auto &bb : aa) for (auto &b : bb) std::cout << b << ' ';
std::cout << '\n';
for (auto &B : A) std::cout << B.i << ' ';
std::cout << '\n';
for (auto &BB : AA) for (auto &B : BB) std::cout << B.i << ' ';
std::cout << '\n';
return 0;
}
उत्पादन
1 0 0
1 0 0 0 0 0 0 0 1
1 2 2
1 2 2 2 2 2 2 2 2
http://ideone.com/1ueWdK से clang3.7
साथ
है, लेकिन परिणाम है:
0 0 1
1 0 0 0 0 0 0 0 1
1 2 2
1 2 2 2 2 2 2 2 2
http://rextester.com/l/cpp_online_compiler_clang पर भी क्लैंग 3.7 के साथ।
अपने स्वयं के उबंटू पर, जीसीसी 6.2 int aa[3][3] = {aa[2][2] = 1}
पर एक आंतरिक कंपाइलर त्रुटि प्रदान करता है।
मुझे लगता है कि यह अपरिभाषित व्यवहार है, लेकिन मानक में एक निश्चित विवरण नहीं मिल रहा है।
सवाल यह है:
चाहे प्रारंभकर्ता सूची (जैसे a[2] = 1
) और सरणी की वास्तविक तत्व के प्रारंभ में काम पर दुष्प्रभाव के मूल्यांकन के क्रम (जैसे a[2]
) मानक में परिभाषित?
इसे स्पष्ट रूप से परिभाषित या अपरिभाषित कहा गया है? या यह अपरिभाषित हो जाता है क्योंकि यह स्पष्ट रूप से परिभाषित नहीं है?
या क्या निर्माण ने मूल्यांकन आदेश से अलग अन्य कारणों से व्यवहार को परिभाषित या अपरिभाषित किया है?
मेरी आंखें खून बह रही हैं ... यदि यह कोई उत्थान नहीं है, तो मुझे नहीं पता कि क्या होगा ... –
[संकलित नहीं करता] (http://ideone.com/ZT1N3K)। इसके अलावा आंतरिक कंपाइलर त्रुटियों का परिणाम हो सकता है यदि आपका कोड इतना गड़बड़ हो गया है कि कंपाइलर का पार्सर उड़ाता है। – PaulMcKenzie
जीसीसी 4.9 और क्लैंग में संकलित ... gcc 5+ में एक बग है –