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