在这样的if语句中:
if(strcmp(str1,str2))
strcmp()可以返回负值,如果是,则if语句会将其视为TRUE或FALSE。
答案 0 :(得分:12)
在C ++中,if
语句将任何非零值视为true。负值不为零,因此它将被视为真。以下两个陈述是等效的:
if (strcmp(str1, str2))
if (strcmp(str1, str2) != 0)
答案 1 :(得分:1)
与if语句一起使用时,strcmp
函数可能会导致一些非常难以理解的代码。当且仅当foo
与<{em>不同而不是str1
时,以下声明才会致电str2
。
if (strcmp(str1, str2)) foo();
有些人会认为这有些出乎意料且难以理解,但这是因为strcmp
并非真正意味着以这种方式使用,因为它不会返回bool
。如果你查看这个伟大的reference,你会发现它返回一个整数值,用于表示字符串之间的关系。 strcmp
可以告诉你的不仅仅是两个字符串是否相同。根据参考strcmp
返回:
str1
中的值大于str2
str2
中的值大于str1
因为if语句会将任何非零整数值强制转换为布尔值true
,所以if语句if (strcmp(str1, str2)) foo()
将始终解释true
并执行foo
,<当str1
和str2
相等时,em>除之外(在这种情况下,if语句将解释false
,而foo将不执行)。
将strcmp与if语句一起使用的更常见方法是将对strcmp的调用与if语句中的二进制比较结合起来,对整数值进行测试:
if (strcmp(str1, str2) == 0) foo(); // foo executed iff str1 and str2 are equal
if (strcmp(str1, str2) != 0) foo(); // foo executed iff str1 and str2 are not equal
你也可以使用strcmp
和if语句对字符串进行排序,strcmp是理想的,因为它根据字符串的第一个不匹配字符返回。您可以使用类似以下内容(未经测试的代码):
bool swapped = false;
do {
for (i = 1; i < numStrings; i++) {
if (strcmp(str[i-1], str[i]) > 0) {
swap(i-1, i);
swapped = true;
}
}
} while (swapped);
答案 2 :(得分:0)
当整数值转换为布尔值时,0为false,任何其他值为true。
答案 3 :(得分:0)
C将任何非零值转换为true
,只有零为false
。
请注意,if(strcmp(str1, str2))
几乎总是“错误”。你要么想要一个:
if (strcmp(str1, str2) == 0)
检测两个字符串相等if (strcmp(str1, str2) > 0)
检测到str1 > str2
if (strcmp(str1, str2) < 0)
检测到str1 < str2
if(strcmp(str1, str2))
的唯一原因是检测到str1
与str2
不同 - 这几乎总是不是您想要的。
而且,在C ++中,您可能根本不应该使用strcmp
- 因为您有std::string
,您可以将您想要的内容作为比较,例如if (str1 > str2)
或if (str1 != str2)
,对于大多数人来说,没有进一步的问题,这意味着什么。