2013-09-01 4 views

ответ

12

В C++ оператор if рассматривает любое значение , отличное от, как значение true. Отрицательное значение не равно нулю, поэтому оно будет считаться истинным. Следующие два утверждения эквивалентны:

if (strcmp(str1, str2)) 

if (strcmp(str1, str2) != 0) 
0

Когда целое значение преобразуется в логическое значение, 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), и для большинства людей сразу становится очевидным, что это означает без дальнейших вопросов.

+0

Использование strcmp(), чтобы увидеть, являются ли две строки разными, является совершенно правильной и распространенной задачей. (хотя при использовании C++, а не C, использование std :: string было бы предпочтительным) –

+0

@JeremyFriesner: Конечно, это допустимая комбинация. Но я обнаружил, что совершил ошибку «забыв» «== 0», и я видел здесь много вопросов (и других мест), где возникает вопрос: «Почему не работает' strcmp'? " основанный на некотором отношении к нулю. –

1

Функция strcmp при использовании с оператором if может привести к очень нечитаемому коду. В следующем заявлении говорится позвонить по телефону foo тогда и только тогда, когда str1 - другой, а не str2.

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

Некоторые утверждают, что это несколько неожиданно и нечитаемым, но это связано с тем, что strcmp на самом деле не означает, чтобы использовать этот способ, поскольку он не возвращает bool. Если вы проверите этот замечательный reference, вы увидите, что он возвращает целое значение, которое предназначено для указания связи между строками. strcmp может рассказать вам гораздо больше, чем просто то, являются ли две строки одинаковыми.По ссылке strcmp возвращается:

  • 0, если обе строки равны
  • Положительное значение, если первый символ, который не соответствует имеет большее значение в 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); 
Смежные вопросы