条件为假,但即便如此,它的打印尺寸为 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) > ctrue 还是 falseprintf("%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));