【问题标题】:Explaination for the code [duplicate]代码说明[重复]
【发布时间】:2017-12-12 18:45:35
【问题描述】:

代码的输出是 3?请解释一下。据我说应该是 5.删除“未签名”后,我仍然得到输出为 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);

}

【问题讨论】:

  • 你为什么不尝试打印strlen(x) - strlen(y)的值

标签: c strlen unsigned-integer size-t


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    删除“未签名”后,我的输出仍然为 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);
            ^^^
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-25
      • 2013-09-12
      • 2017-01-23
      • 2014-09-21
      • 2016-06-01
      • 2015-01-13
      • 2015-08-16
      • 2010-11-25
      相关资源
      最近更新 更多