Странное поведение для for loop и size_t - PullRequest
1 голос
/ 30 ноября 2010
 size_t size = sizeof(int);
 printf("%d\n", size);

 int i;
 for (i = 0; i < size; i++) {
    printf("%d ", i);
 }

Приведенный выше код (с использованием gcc) outptus

4

0 1 2 3

 size_t size = sizeof(int);
 printf("%d\n", size);

 int i;
 for (i = -1; i < size; i++) {
    printf("%d ", i);
 }

Этот код (я инициализирован в -1)выводит только 4 и ничего в цикле.

 size_t size = sizeof(int);
 printf("%d\n", size);

 int i;
 for (i = -1; i < (int) size; i++) {
    printf("%d ", i);
 }

Добавление преобразования приводит к тому, что код снова работает нормально.Вывод:

4

-1 0 1 2 3

Что не так во втором коде?Почему printf никуда не денется?

Ответы [ 2 ]

9 голосов
/ 30 ноября 2010
i < size

Если i подписано, а size не подписано, то i преобразуется в без знака перед выполнением сравнения. Это часть того, что называется обычными арифметическими преобразованиями.

Когда -1 преобразуется в тип без знака, результатом является максимально возможное значение, представляемое типом без знака, поэтому i < size имеет значение false, когда i равно -1 для любого значения size.

Когда вместо этого вы используете i < (int)size, оба операнда < имеют тип int, поэтому преобразование не требуется, и поскольку оба операнда подписаны, вы получите ожидаемый результат.

1 голос
/ 30 ноября 2010

size_t равно без знака .Когда вы приводите size к int, вы возвращаетесь к подписанному, и сравнение работает.

...