Пояснение к коду
Выход для кода 3? Пожалуйста, объясните. По мне, это должно быть 5. После удаления "unsigned" все равно я получил вывод как 3.
#include<stdio.h>
#include<string.h>
void main(){
unsigned int c=0;
int len;
char x[20]="abc";
char y[20]="defgh";
if((strlen(x)-strlen(y))>c)
len=strlen(x);
else
len=strlen(y);
printf("%d",len);
}
2 ответа
Так как size_t
не подписан в C
, Таким образом, сравнение, являющееся отрицательным, дает положительное число. (знаковые расширенные биты числа со знаком дают большое значение в случае без знака). Затем это значение сравнивается с 0
- будучи верным, он входит в первое условие. Выходы 3.
Даже если вы удалите неподписанные из C
этот результат strlen
вычитание дает положительное число намного больше 0. Вот почему вы всегда получаете 3.
После удаления "unsigned" все еще я получил вывод как 3.
Неважно, является ли переменная c
объявляется неподписанным или подписанным
unsigned int c=0;
Проблема в том, что стандартная функция strlen
возвращает объект типа size_t
то есть по определению это тип без знака.
size_t strlen(const char *s);
Так что в этом выражении
strlen(x)-strlen(y)
результат интерпретируется как целое число без знака. Как strlen( x )
меньше чем strlen( y )
тогда вы получите очень большое значение без знака или, по крайней мере, ненулевое положительное значение.
Вместо этого вы могли бы написать
if( strlen(x) > strlen(y) )
len=strlen(x);
else
len=strlen(y);
И было бы правильнее объявить переменную len как имеющую тип size_t
,
size_t len;
//...
printf("%zu\n",len);
^^^