c -条件为假,但即使如此,其打印大小为s


#include<stdio.h>
#include<string.h>
void printlen(char *s,char *t){
int c=0;
int len=((strlen(s)-strlen(t)>c)?strlen(s):strlen(t));
printf("%d",len);
}
void main(){
char *x="abc";
char *y="defgh";
printlen(x,y);
}

strlen(s)= 3,strlen(t)= 5,为什么strlen(s)-strlen(t)>c的求值为真?

strlen函数返回size_t类型的无符号值。

所以用unsigned 5减去unsigned 3得到一个非常大的unsigned数。这个数字大于0,所以条件为真,导致strlen(s)被求值并赋值给len

减法的结果应强制转换为int,以正确存储有符号的值。

int len=(((int)(strlen(s)-strlen(t))>c)?strlen(s):strlen(t));

更好的是,强制转换每个strlen的结果,以避免从unsigned到signed的超范围转换,这是实现定义的:

int len= ((int)strlen(s)-(int)strlen(t))>c)?strlen(s):strlen(t);
int len=((strlen(s)-(int)strlen(t)>c)?strlen(s):strlen(t));
printf("%d",len);

=:

int len;
if((strlen(s) - strlen(t) > c)
len = strlen(s);
else
len = strlen(t);
printf("%d",len);

首先,printf("%d",len);是无条件的。无论len(s) - strlen(t) > ctrue还是false,printf("%d",len);都会被执行。

第二,strlen返回size_t,这是unsigned long long的别名,所以(strlen(s) - strlen(t) > c)总是true

你应该将其类型转换为int

int len=(((int)strlen(s)-(int)strlen(t)>c)?strlen(s):strlen(t));

相关内容

  • 没有找到相关文章

最新更新