LINUX.ORG.RU

f ( 'a' == (short)('a')). Что во что будет преобразовываться?


0

1
short *string = new short[1024]; // some string
if ( 'H' == *string ) { }

В ходе операции сравнения, short будет преобразовано в char или наоборот?

Вопрос тревожит потому, что если string содержит юникод (в какой-то кодировке двухбайтовой, например как просто числа, повторяющие таблицу UNICODE), то может получиться так, что преобразование какого-то двухбайтового символа в однобайтовый (есть сомнение, что компилятор будет генерить код, который будет заниматься таким бредом, т.к. этот бред кроме как отсечением старшего байта не сделать) может обеспечить выполнение условия, когда оно по логике ложно.

Склоняюсь к тому, что меньший размер будет преобразовываться к большему. Смущает порядок операндов оператора ==, где первым у меня стоит меньший.

★☆

Последнее исправление: kiverattes (всего исправлений: 1)

Мне почему-то кажется, что он тебе про несовместимость типов ошибочку покажет. Хотя я на плюсах давно не писал уже.

И вообще мне кажется, что это твой код не взлетит ни в одной строчке.

Zhbert ★★★★★
()

Если компилятор не ругнулся на possible loss of data, значит всё норм, да и быть в твоем случае неявной конверсии до из узкого до более широкого типа.

'H' == *string

Пиши string[0], не вые-йся

yoghurt ★★★★★
()
if ( L'H' == *string ) { }
[[/code]]
Не?
anonymous
()

Если string содержит юникод, то тебе нужен wchar_t. Если кодировка неизвестна заранее - придётся юзать сторонние библиотке, тот же Glib или Qt.

И анон выше правильно привёл пример unicode-константы L'H' (но для wchar_t).

schizoid ★★★
()

1. Кодировку нужно определять заранее.
2. Для однобайтовых кодировок используй char
3. Для двубайтовых wchar_t
4. Компилятор ничего не знает о преобразованиях символов. Либо пиши свой велосипед для определения кодировки, либо используй библтотеки
Тут этот вопрос неплохо раскрыт: http://www.rsdn.ru/forum/cpp/3569501.1.aspx

gear ★★★
()
Ответ на: комментарий от gear

2. Для однобайтовых и мультибайтовых (e.g. UTF-8) кодировок используй char 3. Для четырехбайтовых (UNICODE) wchar_t 4. man wchar.h

FIXED

anonymous
()
Ответ на: комментарий от anonymous

wchat_t не кросс-платформенный, может быть 2-х байтовым и даже 1-байтовым (про него так сказано в стандарте).

kiverattes ★☆
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.