ПРИМЕР Пример неопределенного поведения - это поведение при переполнении целых чисел. C11dr §3.4.3 3Когда значение `int` at max и проверено с помощью postfix ++, является ли код корректным?
int
переполнение не определено поведение, но это применимо к следующему, который существует цикл, и не использует побочный эффект теперь вне сферы i
? В частности, делает ли это Postfix increment spec help?
... Вычисление значения результата секвенируется перед побочным эффектом , обновляющим сохраненное значение операнда. ... §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
Конечно код может быть переписан, чтобы избежать этого затруднительного положения с ниже. Тем не менее, ища подтверждения относительно вышеизложенного. (Я думаю, что это UB.) Аналогичная проблема существует с 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
Я мог бы смутить, но я не думаю, что 'i' когда-либо переполняется в любом случае, не останавливается, когда он равен INT_MAX – Vality
@Vality Да, execuatble остановился, когда' i ++ 'возвратил' INT_MAX', как показано в выход образца. Вопрос в том, хорошо ли это поведение. – chux