在这样的 if 语句中:
if(strcmp(str1,str2))
strcmp() 可以返回一个负值,如果是,if 语句是否认为它是 TRUE 或 FALSE。
在 C++ 中,该if
语句将任何非零值视为真。负值不为零,因此将被视为真。以下两个语句是等价的:
if (strcmp(str1, str2))
if (strcmp(str1, str2) != 0)
该strcmp
函数与 if 语句一起使用时会导致一些非常不可读的代码。以下语句说foo
当且仅当不同于str1
时才调用str2
。
if (strcmp(str1, str2)) foo();
有些人会争辩说这有点出乎意料且难以理解,但这是因为它strcmp
并不真正意味着以这种方式使用,因为它不返回 a bool
。如果您查看这个出色的参考资料,您会发现它返回一个整数值,用于指示字符串之间的关系。strcmp
可以告诉您的不仅仅是两个字符串是否相同。根据参考strcmp
返回:
str1
大于 in ,则为正值str2
str2
大于 in ,则为负值str1
因为 if 语句会将任何非零整数值强制转换为布尔值true
if 语句if (strcmp(str1, str2)) foo()
将始终解释true
和执行foo
,除非str1
和str2
相等(在这种情况下 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);
当整数值转换为布尔值时,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)
or if (str1 != str2)
,并且对于大多数人来说,它的含义是显而易见的,而无需进一步提问。