#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) > c
是true
还是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));