Сегодня я пытался отладить приложение и обнаружил странное поведение логического выражения, содержащего strlen ().
Здесь следует простой код, который воспроизводит проблему.
char test[20] = "testTestTest"; //the length is 12
bool b = 0 < (9 - strlen(test)); //should be false (0 < -3) = false
в конце выполнения b равно true, но должно быть false.
Сохранение результата strlen () в переменной работает.
char test[20] = "testTestTest"; //the length is 12
int length = strlen(test); //save the length
bool b = 0 < (9 - length); //should be false (0 < -3) = false
в конце выполнения b ложно (как и должно быть).
В чем разница между двумя реализациями?
Почему первый не работает?
Исходный затронутый код был примерно таким:
char test[20] = "testTestTest"; //the length is 12
for(int i = 0; i < (9 - strlen(test)); i++){
//do something (in my case I do NOT edit the test string)
}
Предполагается, что цикл for никогда не выполняется (со строками> = 9), но фактически он зацикливается бесконечно.
Сохранение результата strlen () в переменной работает.
Ваша переменная имеет тип, отличный от того, что strlen()
возвращается. Это неявное преобразование из size_t
в int
это заставляет это работать.
Неработающая версия обычно оценивает 9 - strlen(test)
как (size_t)9 - strlen(test)
очень большое число без знака, а не как 9 - (int)strlen(test)
отрицательное число со знаком.
Других решений пока нет …