Пояснение к коду

Выход для кода 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);
        ^^^
Другие вопросы по тегам