代码说明

Explaination for the code

代码的输出是 3?请explain.According对我来说应该是 5.After 删除 "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);

}

因为 size_tC 中未签名。因此,负数的比较会产生正数。 (有符号数的符号扩展位在无符号情况下会产生很大的值)。然后将该值与 0 进行比较 - 为真则进入第一个条件。输出 3.

即使您从 C 中删除无符号数,strlen 减法的结果也会产生比 0 大得多的正数。这就是为什么您总是得到 3。

After removing "unsigned" still i got the output as 3.

变量c是声明为unsigned还是signed

并不重要
unsigned int c=0;

问题在于标准函数 strlen returns 类型 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);
        ^^^