В, если заявление, как это:Если оператор с отрицательными значениями
if(strcmp(str1,str2))
зЬгстр() может возвращать отрицательное значение, и если он делает, делает, если заявление считают, что это ИСТИНА или ЛОЖЬ.
В, если заявление, как это:Если оператор с отрицательными значениями
if(strcmp(str1,str2))
зЬгстр() может возвращать отрицательное значение, и если он делает, делает, если заявление считают, что это ИСТИНА или ЛОЖЬ.
В C++ оператор if
рассматривает любое значение , отличное от, как значение true. Отрицательное значение не равно нулю, поэтому оно будет считаться истинным. Следующие два утверждения эквивалентны:
if (strcmp(str1, str2))
if (strcmp(str1, str2) != 0)
Когда целое значение преобразуется в логическое значение, 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
- это почти всегда не то, что вы хотите.
И с помощью coruse, на C++, вы, вероятно, не должны использовать strcmp
, так как у вас есть std::string
, что вы можете просто написать то, что хотите в качестве сравнения, например. if (str1 > str2)
или if (str1 != str2)
, и для большинства людей сразу становится очевидным, что это означает без дальнейших вопросов.
Функция strcmp
при использовании с оператором if может привести к очень нечитаемому коду. В следующем заявлении говорится позвонить по телефону foo
тогда и только тогда, когда str1
- другой, а не str2
.
if (strcmp(str1, str2)) foo();
Некоторые утверждают, что это несколько неожиданно и нечитаемым, но это связано с тем, что strcmp
на самом деле не означает, чтобы использовать этот способ, поскольку он не возвращает bool
. Если вы проверите этот замечательный reference, вы увидите, что он возвращает целое значение, которое предназначено для указания связи между строками. strcmp
может рассказать вам гораздо больше, чем просто то, являются ли две строки одинаковыми.По ссылке strcmp
возвращается:
str1
, чем в str2
str2
, чем в str1
Потому что если заявление будет принуждать любое ненулевое целое значение в булево значение true
, если заявление if (strcmp(str1, str2)) foo()
всегда будет интерпретировать true
и выполнить foo
, кроме когда str1
и str2
равны (в этом случае, если оператор будет интерпретировать false
и Foo будет не быть выполнен).
Более распространенный способ использования зЬгстр с, если заявление является объединить вызов STRCMP с двоичного сравнения внутри, если заявление, тестирование на целочисленное значение: strcmp
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
Вы можете также использовать с оператор if для сортировки строк, strcmp идеально подходит для этого, потому что он возвращается на основе первого символа unmatching строки. Вы можете использовать его с чем-то вроде следующего (непроверенный код):
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);
Использование strcmp(), чтобы увидеть, являются ли две строки разными, является совершенно правильной и распространенной задачей. (хотя при использовании C++, а не C, использование std :: string было бы предпочтительным) –
@JeremyFriesner: Конечно, это допустимая комбинация. Но я обнаружил, что совершил ошибку «забыв» «== 0», и я видел здесь много вопросов (и других мест), где возникает вопрос: «Почему не работает' strcmp'? " основанный на некотором отношении к нулю. –