'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" ) ;

что привело бы к ошибке компилятора