Странное поведение w / strlen () в логическом выражении

Сегодня я пытался отладить приложение и обнаружил странное поведение логического выражения, содержащего 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), но фактически он зацикливается бесконечно.

1

Решение

Сохранение результата strlen () в переменной работает.

Ваша переменная имеет тип, отличный от того, что strlen() возвращается. Это неявное преобразование из size_t в int это заставляет это работать.

Неработающая версия обычно оценивает 9 - strlen(test) как (size_t)9 - strlen(test)очень большое число без знака, а не как 9 - (int)strlen(test)отрицательное число со знаком.

9

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector