条件为假,但即便如此,它的打印尺寸为 s
condition is false but even then its printing size of 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
函数 returns 类型 size_t
的无符号值。
因此,从无符号数 5 中减去无符号数 3 会得到一个非常大的无符号数。此数字大于 0,因此条件为真,导致 strlen(s)
被评估并分配给 len
.
减法的结果应转换为 int
以正确存储带符号的值。
int len=(((int)(strlen(s)-strlen(t))>c)?strlen(s):strlen(t));
更好的是,转换每个 strlen
的结果以避免从无符号到有符号的超出范围的转换,这是实现定义的:
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
return 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));
#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
函数 returns 类型 size_t
的无符号值。
因此,从无符号数 5 中减去无符号数 3 会得到一个非常大的无符号数。此数字大于 0,因此条件为真,导致 strlen(s)
被评估并分配给 len
.
减法的结果应转换为 int
以正确存储带符号的值。
int len=(((int)(strlen(s)-strlen(t))>c)?strlen(s):strlen(t));
更好的是,转换每个 strlen
的结果以避免从无符号到有符号的超出范围的转换,这是实现定义的:
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
return 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));