#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)中
答案 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