0

在这样的 if 语句中:

    if(strcmp(str1,str2))

strcmp() 可以返回一个负值,如果是,if 语句是否认为它是 TRUE 或 FALSE。

4

4 回答 4

12

在 C++ 中,该if语句将任何非零值视为真。负值不为零,因此将被视为真。以下两个语句是等价的:

if (strcmp(str1, str2))

if (strcmp(str1, str2) != 0)
于 2013-09-01T23:31:20.053 回答
1

strcmp函数与 if 语句一起使用时会导致一些非常不可读的代码。以下语句说foo当且仅当不同于str1时才调用str2

if (strcmp(str1, str2)) foo();

有些人会争辩说这有点出乎意料且难以理解,但这是因为它strcmp并不真正意味着以这种方式使用,因为它不返回 a bool。如果您查看这个出色的参考资料,您会发现它返回一个整数值,用于指示字符串之间的关系。strcmp可以告诉您的不仅仅是两个字符串是否相同。根据参考strcmp返回:

  • 0 如果两个字符串相等
  • 如果不匹配的第一个字符的值str1大于 in ,则为正值str2
  • 如果不匹配的第一个字符的值str2大于 in ,则为负值str1

因为 if 语句会将任何非零整数值强制转换为布尔值trueif 语句if (strcmp(str1, str2)) foo()将始终解释true和执行foo除非str1str2相等(在这种情况下 if 语句将解释并且falsefoo不会被执行)。

将 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

您也可以使用strcmpif 语句对字符串进行排序,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);
于 2013-09-02T00:52:28.817 回答
0

当整数值转换为布尔值时,0 为假,任何其他值为真。

于 2013-09-01T23:33:04.540 回答
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))是为了检测str1str2- 这几乎总是不是你想要的。

当然,在 C++ 中,您可能根本不应该使用strcmp- 因为您std::string可以编写您想要的内容作为比较,例如if (str1 > str2)or if (str1 != str2),并且对于大多数人来说,它的含义是显而易见的,而无需进一步提问。

于 2013-09-01T23:47:41.107 回答