उदाहरण अपरिभाषित व्यवहार का एक उदाहरण पूर्णांक अतिप्रवाह पर व्यवहार है। C11dr §3.4.3 3जब अधिकतम मूल्य पर 'int` और पोस्टफिक्स ++ के साथ परीक्षण किया गया है, तो कोड अच्छी तरह परिभाषित है?
int
अतिप्रवाह अपरिभाषित व्यवहार है, लेकिन उस जिसके बाद पाश मौजूद है पर लागू होता है, और बाहर के दायरे i
अब के पक्ष प्रभाव का उपयोग नहीं करता? विशेष रूप से, क्या यह पोस्टफिक्स वृद्धि spec सहायता करता है?
... परिणाम की मान गणना के साइड इफेक्ट से पहले अनुक्रमित होती है जो ऑपरेंड के संग्रहीत मूल्य को अद्यतन करती है। ... §6.5.2.4 2
साथ बिना चेतावनी के संकलित अच्छी तरह से सक्षम C11
#include <limits.h>
#include <stdio.h>
int main(void) {
// Specified behavior when `i` has the value `INT_MAX`?
for (int i = INT_MAX - 2; i++ < INT_MAX;) {
printf("%d\n", i);
}
puts("Done");
return 0;
}
नमूना उत्पादन
2147483646
2147483647
Done
बेशक कोड इस उलझन से बचने के लिए फिर से लिखा जा सकता है नीचे के साथ। फिर भी, उपरोक्त से संबंधित पुष्टि की तलाश में। (मुझे लगता है कि यह यूबी है।) एक समान समस्या INT_MIN
और i--
के साथ मौजूद है।
for (int i = INT_MAX - 2; i < INT_MAX;) {
i++;
printf("%d\n", i);
}
GNU C11 (GCC) version 5.3.0 (i686-pc-cygwin)
compiled by GNU C version 5.3.0, GMP version 6.1.0, MPFR version 3.1.4, MPC version 1.0.3
'-std=c11' '-O0' '-g3' '-Wpedantic' '-Wall' '-Wextra' '-Wconversion' '-c' '-fmessage-length=0' '-v' '-MMD' '-MP' '-MF' xx.o' '-o' 'xx.o' '-mtune=generic' '-march=i686'
/usr/lib/gcc/i686-pc-cygwin/5.3.0/cc1.exe -quiet -v -MMD xx.d -MF xx.d -MP -MT xx.o -dD -Dunix -idirafter ... xx.c
मुझे भ्रमित किया जा सकता है, लेकिन मुझे नहीं लगता कि मैं वास्तव में किसी भी मामले में ओवरफ्लो करता हूं, यह तब नहीं रुकता है जब यह INT_MAX – Vality
@ वैलिटी हां के बराबर होता है, जैसा कि दिखाया गया है कि 'i ++ 'लौटाए गए INT_MAX' में निष्पादित किया गया था नमूना उत्पादन। सवाल यह है कि अगर यह अच्छी तरह से परिभाषित व्यवहार है। – chux