Завершается ли для l oop из-за переполнения типа unsigned int? - PullRequest
0 голосов
/ 11 января 2020

Я готовлюсь к экзамену C, и мне задали этот вопрос:

"Учитывая этот код, он заканчивается? Если да, то почему?"

 int main() {
   unsigned int i;
   for (i=1; i>0; i++);
   return 0;
 }

Я думал, что он действительно завершается из-за природы unsigned int: в течение l oop i свободно переходит от 1 к максимальному значению (которое я считаю равным 2 ^ 32-1), затем l oop встречает исключение переполнения и возвращается к 0, первое значение для беззнакового целого. Это противоречит условию i> 0 в l oop и завершает его, возвращая «0» и завершая программу.

Верна ли моя гипотеза? У нас нет решения, данного профессором, поэтому, хотя оно и имеет смысл, оно может быть ужасно неправильным, поэтому мне нужна ваша помощь.

Ответы [ 2 ]

2 голосов
/ 11 января 2020

По сути, вы правы во всем, что говорите. Как только счетчик l oop пройдет мимо UINT_MAX (обычно 2 ^ 32-1), он обернется до 0, что приведет к завершению l oop из-за того, что условие l oop больше не выполняется.

Единственное, что неправильно в том, что вы говорите, это то, что вы использовали слово «исключение». Нет ничего плохого в том, что результат операции unsigned integer arithmeti c больше, чем UINT_MAX. В соответствии со C11 Standard - 6.2.5 Типы (p9) , результат четко определен. Он будет просто подвергаться по модулю UINT_MAX + 1, чтобы он соответствовал unsigned int.

Однако имейте в виду, что с знаковыми целыми числами переполнение вызывает неопределенное поведение . См. Следующий вопрос StackOverflow для получения дополнительной информации:

Почему поведение целочисленного переполнения без знака определяется, а переполнение целого числа без знака? .

0 голосов
/ 11 января 2020

Программа завершается, потому что счетчик i будет равен 0, когда достигнет UINT_MAX.

...