2014-09-17 5 views
1

Итак, я написал базовую программу, которая проверяет строчные гласные в строке и отображает, сколько ее найдено.islower() работает с оператором! = Operator, но не ==

Я использовал это в первый:

for (char ch : str) 
    { 
     if (islower(ch) == true && isVowel(ch) == true) //isVowel is a function that 
      strCount++;         //I made 
    } 

И моя программа не будет увеличивать счетчик, но когда я изменил его на это:

for (char ch : str) 
    { 
     if (islower(ch) != false && isVowel(ch) == true) 
      strCount++; 
    } 

Он начал работать сразу. Зачем? Не

if (islower(ch) != false) 

и

if (islower(ch) == true) 

сделать то же самое?

+2

Try и выйти из привычки сравнения явно с 'true' - как вы уже видели, это может быть опасно. Вы должны использовать только, например. 'if (condition)', а не 'if (condition == true)'. –

ответ

4

islower возвращает целое значение, отличное от нуля (то есть true), если действительно ch является строчной буквенной буквой. Ноль (т. Е. false) в противном случае.

Сравнивая как islower(ch) == true, было бы верно, если islower возвращен 1, что, как упомянуто выше, это не тот случай.

Следовательно, по праву islower(ch) == true не работает так, как вы ожидали.

LIVE DEMO

+0

Это имеет смысл. Что возвращает islower(), если оно «истинно»? – user2240033

+3

Следует, наверное, подчеркнуть, что вы просто не должны явно сравнивать с «истинным» - это избыточно и потенциально опасно. –

+0

@ user2240033 Возвращаемое значение не указано, когда 'islower' преуспевает. Это просто целое значение, отличное от 0. Таким образом, это зависит от реализации. – 101010

4

Цитируется cplusplus.com о возвращаемом значении islower():

значение, отличное от нуля (т.е. истинно), если на самом деле с является строчной буквой алфавитной. Ноль (т. Е. False) в противном случае.

Так, просто сделать if (islower(ch)) вместо if (islower(ch) == true)