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

时间:2017-03-07 03:53:24

标签: c string unsigned

#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("%d\n", len);
}

void main() {
    char *x = "abc";
    char *y = "defgh";
    printlength(x,y);
}

当我编译它时,它提供 3 ,但是,我不明白转换是如何发生的:(strlen(s) - strlen(t)) &GT; c)中

1 个答案:

答案 0 :(得分:4)

这是非常差的代码(strlen(s) - strlen(t)) 总是&gt; = 0,因为它是无符号数学。 strlen()返回的类型为size_t,有些是无符号类型。因此,除非值相等,否则由于无符号数学环绕,差值始终为正数。

即使int len = strlen(s);的长度与s不同,也会t

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

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

注意:在具有SIZE_MAX <= INT_MAX的罕见平台上,差异可能是负数,因为数学是使用签名类型int完成的。然而,与c的比较是unsigned,而不是unsigned,因为public class Driver { public static void main(String[ ] args) { Person[] persons = new Person[5]; persons[0] = new Person("John Smith"); persons[1] = new Person(); persons[2] = new TitledPerson("Rowan Bean", "Mr"); persons[3] = new TitledPerson("Phil McGraw", "Dr"); persons[4] = new TitledPerson("Hugo Strange", "Dr"); System.out.println("Person 3 and 4 are equal: " + persons[2].equals(persons[3])); System.out.println(); String search = "Dr"; int counter = 0; for(int i = 0; i < persons.length; i++) { System.out.println(persons[i]); if(persons[i] instanceof TitledPerson) { if(persons[i].equals(search)) { counter++; } } } System.out.println(); System.out.println("There are " + counter + " 'Dr' titles listed."); } } 会导致负面差异被包裹起来&#34;到一个非常大的数字,大于0. @Paul Hankin