解释代码

时间:2017-12-12 18:45:35

标签: c strlen unsigned-integer size-t

代码的输出是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 个答案:

答案 0 :(得分:3)

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

即使您从C移除未签名,strlen减法的结果也会产生一个远大于0的正数。这就是为什么你总是得到3。

答案 1 :(得分:2)

  

删除&#34; unsigned&#34;我的输出仍为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);
        ^^^