如果声明带负值

时间:2013-09-01 23:30:45

标签: c++ strcmp

在这样的if语句中:

    if(strcmp(str1,str2))

strcmp()可以返回负值,如果是,则if语句会将其视为TRUE或FALSE。

4 个答案:

答案 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返回:

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

因为if语句会将任何非零整数值强制转换为布尔值true,所以if语句if (strcmp(str1, str2)) foo()将始终解释true并执行foo,<当str1str2相等时,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))的唯一原因是检测到str1str2不同 - 这几乎总是不是您想要的。

而且,在C ++中,您可能根本不应该使用strcmp - 因为您有std::string,您可以将您想要的内容作为比较,例如if (str1 > str2)if (str1 != str2),对于大多数人来说,没有进一步的问题,这意味着什么。