代码的输出是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);
}
答案 0 :(得分:3)
因为size_t
中C
未签名。所以比较为负数会产生正数。 (签名数字的扩展位符号在无符号情况下产生一个大值)。然后将该值与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);
^^^