Страницы

Поиск по вопросам

суббота, 21 декабря 2019 г.

Не понимаю почему for выполняется

#c #типы


Не думал что задам такой вопрос но при переделывании кода с Pascal в C получилась
странность.
Pascal:

for j := 1 to Length(tmp)-1 do begin


и C

for(j = 1; j <= strlen(tmp)-1; j ++) {


Это оказывается разные вещи при Length(tmp)=0... 
    


Ответы

Ответ 1



Оказывается в отладчике и в реальности вещи ведут себя по-разному. Ломал голову понял , в реальности: (strlen(tmp) - 1) не -1 )) Т.к strlen возвращает size_t (implementation этого типа я не нашёл) а это unsigned то C почему-то работает с (strlen(tmp) - 1) как с unsigned и соотв-но результатом будет макс_ПОЛОЖИТЕЛЬНОЕ_значение_size_t - 1 ... А отладчик считал что (strlen(tmp) - 1) типа signed и отображал -1 как результат и более того в отладчике j <= (strlen(tmp) - 1) == 0 а в реальности j <= (strlen(tmp) - 1) == 1 по указанной причине... Вот так вот "весело" программировать на C) Исправляется это кстати так: for(j = 1; j <= (signed)(strlen(tmp) - 1); j ++)

Ответ 2



Опередили)) #include int main(void) { size_t i = 0; int j = 1; if (j < i - 1) printf("OK\n"); else printf("NO\n"); return 0; } Печатает ОК. Аккуратнее с signed и unsigned типами, у меня компилятор выдает ворнинг на сравнение

Комментариев нет:

Отправить комментарий