在此C代码中如何完成转换


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

当我编译它时,它给出了 3 ,但是,我不明白转换是如何进行的:(strlen(s) - strlen(t))> c)

这是非常差的代码 (strlen(s) - strlen(t))始终> = 0,因为它是无符号的数学。strlen()返回的类型是size_t,一些无符号类型。因此,除非值相等,否则差异始终是由于未签名的数学包裹而引起的。

然后int len = strlen(s);即使s的长度与t不同。

使用类似代码的更好方法就是添加。

// ((strlen(s) - strlen(t)) > c) 
(strlen(s) > (c + strlen(t)) 

注意:在具有SIZE_MAX <= INT_MAX的稀有平台上,差异可以为负,因为然后使用签名 type int进行数学。然而,与c的比较是unsigned,而当时发生的是unsigned,导致负差为"包裹"的负差,大于0。@paul Hankin

最新更新