'a' == 'b'. Это хороший способ сделать?
Что произойдет, если я сравню два символа следующим образом:
if ('a' == 'b')
doSomething();
Мне очень интересно узнать, что делает язык (и компилятор), когда он находит такое сравнение. И, конечно, если это правильный способ сделать что-то или мне нужно использовать что-то вроде strcmp()
.
ИЗМЕНИТЬ
Подождите.
Поскольку кто-то не понял, что я действительно имею в виду, я решил объяснить по-другому.
char x, y;
cout << "Put a character: ";
cin >> x;
cout << "Put another character: ";
cin >> y;
if (x == y)
doSomething();
Конечно, в скобках if
вы можете заменить ==
любым другим оператором сравнения.
Что я действительно хочу знать, так это: как персонаж рассматривается в C/С++? Когда компилятор сравнивает два символа, как он знает, что "a" отличается от "b"? Это относится к таблице ASCII?
Ответы
Ответ 1
В C и С++ одиночные символьные константы (и char
variables) являются целыми значениями (в математическом смысле, а не в значении int
). Компилятор сравнивает их как целые числа при использовании ==
. Вы также можете использовать другие операторы сравнения целого числа (<
, <=
и т.д.). Вы также можете добавить и вычесть их. (Например, общая идиома для изменения символа цифры в его числовое значение c - '0'
.)
Ответ 2
вы можете абсолютно безопасно сравнивать фундаментальные типы с помощью оператора сравнения ==
Ответ 3
Для одиночного chars
эта форма верна. Если оба операнда известны во время компиляции, как в вашем примере, тогда условие может (и почти наверняка будет) оцениваться во время компиляции и не приводить к какому-либо коду.
Обратите внимание, что a char
('a'
) отличается от односимвольной строки ("a"
). Для последнего сравнение имеет другое значение: оно сравнивало бы указатели, а не символы.
Ответ 4
Ваш процессор будет вычитать оба операнда, и если он равен нулю, бит состояния нуля установлен, ваши значения совпадают.
Например: на ручных машинах у вас есть бит nzcv (отрицательный, ноль, перенос, переполнение), которые сообщают вам, что произошло.
Ответ 5
Ничего не произойдет, поскольку a
не равно b
.
Если вы сомневаетесь в том, что это правильный путь, тогда ответ да.
Ответ 6
Сначала 'a' и 'b' не являются строками, они являются символами. Нюанс важен из-за его последствий.
Вы можете сравнивать символы с символами точно так же, как вы можете сравнивать целые числа с целыми числами и плавать с поплавками. Обычно это не делается, потому что результат всегда будет таким же. т.е. 'a' == 'b'
всегда будет ложным.
Если вы сравниваете строки, вы должны использовать что-то вроде strcmp()
.
Ответ 7
Компилятор просто вставляет инструкцию для сравнения двух байтов для равенства - очень эффективную операцию. Конечно, в вашем случае 'a' == 'b' эквивалентен константе false
.
Ответ 8
Компилятор будет сравнивать числовые коды ASCII. Итак, "а" никогда не равен "б". Но,
'a' < 'b'
оценивает значение true, поскольку перед таблицей ASCII появляется символ 'a'.
Ответ 9
Конечно, вы хотите использовать переменные типа
char myChr = 'a' ;
if( myChr == 'b' ) puts( "It b" ) ;
Теперь вы можете начать думать о "условиях Йода" , где вы бы сделали
if( 'b' == myChr ) puts( "It a b" ) ;
чтобы в случае, если вы случайно набрали один знак равенства во втором примере:
if( 'b' = myChr ) puts( "It a b" ) ;
что привело бы к ошибке компилятора