'a' == 'b'. Это хороший способ сделать? - PullRequest
10 голосов
/ 30 ноября 2011

Что произойдет, если я сравню два символа следующим образом:

if ('a' == 'b')
    doSomething();

Мне действительно любопытно узнать, что делает язык (и компилятор), когда находит такое сравнение. И, конечно, если это правильный способ сделать что-то, или я должен использовать что-то вроде strcmp().

EDIT Подожди, подожди.
Поскольку кто-то не понял, что я имею в виду, я решил объяснить по-другому.

char x, y;
cout << "Put a character: ";
cin >> x;
cout << "Put another character: ";
cin >> y;

if (x == y)
    doSomething();

Конечно, в скобках if вы можете заменить == любым другим оператором сравнения.
Что я действительно хочу знать, так это то, как персонаж рассматривается в C / C ++? Когда компилятор сравнивает два символа, как он узнает, что «a» отличается от «b»? Это относится к таблице ASCII?

Ответы [ 9 ]

20 голосов
/ 30 ноября 2011

Вы можете абсолютно безопасно сравнивать основные типы с помощью оператора сравнения ==

13 голосов
/ 30 ноября 2011

В C и C ++ односимвольные константы (и char переменные) являются целочисленными значениями (в математическом смысле, а не в смысле int значений). Компилятор сравнивает их как целые числа, когда вы используете ==. Вы также можете использовать другие операторы сравнения целых чисел (<, <= и т. Д.). Вы также можете добавлять и вычитать их. (Например, общая идиома для преобразования цифрового символа в его числовое значение: c - '0'.)

5 голосов
/ 30 ноября 2011

Ваш процессор вычел бы оба операнда, и если он равен нулю, бит нулевого условия установлен, ваши значения были одинаковы.

Например: на машинах охраны у вас есть nzcv (минус, ноль, перенос, переполнение)) биты, которые говорят вам, что случилось.

5 голосов
/ 30 ноября 2011

Для одного chars эта форма верна.Если оба операнда известны во время компиляции, как в вашем примере, тогда условие может (и почти наверняка) будет оценено во время компиляции и не приведет к какому-либо коду.*) отличается от односимвольной строки ("a").Для последнего сравнение имеет другое значение: оно будет сравнивать указатели , а не символы.

1 голос
/ 30 ноября 2011

Компилятор просто вставляет инструкцию для сравнения двух байтов на равенство - очень эффективная операция. Конечно, в вашем случае 'a' == 'b' эквивалентно константе false.

1 голос
/ 30 ноября 2011

Первые «a» и «b» - это не строки, а символы. Нюанс важен из-за его последствий.

Вы можете точно сравнить символы с символами точно так же, как вы можете сравнить целые числа с целыми числами и с плавающей запятой. Обычно это не делается, потому что результат всегда будет одинаковым. то есть 'a' == 'b' всегда будет ложным.

Однако, если вы сравниваете строки, вам придется использовать что-то вроде strcmp().

1 голос
/ 30 ноября 2011

Ничего не произойдет, поскольку a не равно b.

Если ваш вопрос только о том, что это правильный путь, тогда ответ - да.

0 голосов
/ 30 ноября 2011

Конечно, вы хотите использовать такие переменные, как

char myChr = 'a' ;
if( myChr == 'b' ) puts( "It's b" ) ;

Теперь вы можете начать думать о "Условия Йода" , где вы бы сделали

if( 'b' == myChr )  puts( "It's a b" ) ;

, так что если вы случайно набрали один знак равенства во 2-м примере:

if( 'b' = myChr ) puts( "It's a b" ) ;

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

0 голосов
/ 30 ноября 2011

Компилятор будет сравнивать числовые коды ASCII.Таким образом, «а» никогда не равно «б».Но 'a' < 'b' оценивается как истина, поскольку в таблице ASCII перед буквой «а» стоит «b».

...