Я готовлюсь к экзамену C, и мне задали этот вопрос:
«Учитывая этот код, завершается ли он? Если да, то почему?»
int main() {
unsigned int i;
for (i=1; i>0; i++);
return 0;
}
Я думал, что он завершается из-за характера unsigned int
: в цикле for i
свободно переходит от 1 к максимальному значению (которое, как я полагаю, равно 2 ^ 32-1), затем цикл сталкивается с исключением переполнения и он возвращается к 0, первому значению беззнакового целого числа. Это противоречит условию цикла i>0 и завершает его, возвращая 0 и завершая программу.
Верна ли моя гипотеза? У нас нет решения, предложенного профессором, поэтому, хотя оно и имеет для меня смысл, оно может быть ужасно неверным, поэтому мне нужна ваша помощь.
unsigned int
нет исключений. В остальном работает так, как вы описали. Если бы переменная имела типint
, вы бы вызвали Undefined Behavior (не обязательно исключение) при добавлении1
максимального значения int. - person pmg   schedule 11.01.2020return 0
из функцииmain
). Сначала вам нужно уточнить, что вы подразумеваете под завершением, или, если вы сами не знаете, спросите своего учителя, что он или она имеет в виду под этим. - person Some programmer dude   schedule 11.01.2020for (i=UINT_MAX; i>0; i++);
i
уменьшается по модулюUINT_MAX
до нуля, и цикл завершается. Стандарт C11 — типы 6.2.5 (p9) ( второе предложение) - person David C. Rankin   schedule 11.01.2020:)
- person David C. Rankin   schedule 11.01.2020