Я бы не сказал, что код в порядке на любом языке.
'a'
- это один символ. Это на самом деле небольшое целое число, имеющее в качестве значения значение данного символа в наборе символов машины (почти всегда ASCII). Так 'a'
имеет значение 97, как вы можете увидеть, запустив
char c = 'a';
printf("%d\n", c);
"a"
, с другой стороны, является строкой. Это массив символов, заканчивающийся нулевым символом. В C массивы почти всегда упоминаются указателями на их первый элемент, поэтому в этом случае строковая константа "a"
действует как указатель на массив из двух символов: 'a'
и завершающий '\0'
. Вы можете видеть, что, запустив
char *str = "a";
printf("%d %d\n", str[0], str[1]);
Это напечатает
97 0
Теперь мы не знаем, где в памяти компилятор выберет поставить нашу строку, поэтому мы не знаем, что значение указателя будет, но можно с уверенностью сказать, что оно будет никогда не будет равно 97. Таким образом, сравнение if(ch=="a")
всегда будет ложным.
Если вам нужно сравнить символ и строку, у вас есть два варианта. Вы можете сравнить характер первого символа строки:
if(c == str[0])
printf("they are equal\n");
else printf("confusion\n");
Или вы можете построить строку из символа, и сравните это. В C, это может выглядеть следующим образом:
char tmpstr[2];
tmpstr[0] = c;
tmpstr[1] = '\0';
if(strcmp(tmpstr, str) == 0)
printf("they are equal\n");
else printf("confusion\n");
Это ответ на C. Там есть другой, более мощный тип строки в C++, так что все будет по-другому на этом языке.
Включить предупреждения компилятора. – Olaf