Перейти к содержанию
    

Странный дефайн

Явное приведение типов к char? По-хорошему вместо (char)-1 нужно написать ((char) -1)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Явное приведение типов к char? По-хорошему вместо (char)-1 нужно написать ((char) -1)

а что в результате получиться? в коде есть сравнение if (var != STATE2)

получается дефайн выражается определенным десятичным числом. я бы сказал 6 но зачем char?

Изменено пользователем Jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а что в результате получиться? в коде есть сравнение if (var != STATE2)

получается дефайн выражается определенным десятичным числом. я бы сказал 6 но зачем char?

А какой тип у var ?

Для корректного сравнения в If величины дб одного типа.

Например, сравнивать арифметически -5 и 0x1234 бессмыслено.

(-5 может быть char, int, long и их бинарный вид будет разный и занимать разное кол-во байт)

В if работает "неявное" приведение типов, но иногда ОНО справится не может, тогда и указывают тип явно.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А какой тип у var ?

Для корректного сравнения в If величины дб одного типа.

Например, сравнивать арифметически -5 и 0x1234 бессмыслено.

(-5 может быть char, int, long и их бинарный вид будет разный и занимать разное кол-во байт)

В if работает "неявное" приведение типов, но иногда ОНО справится не может, тогда и указывают тип явно.

var он тоже char. я никогда раньше не видел такого определения. ума не приложу зачем оно понадобилось.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

var он тоже char. я никогда раньше не видел такого определения. ума не приложу зачем оно понадобилось.

Если так, то это какаято платформенно-прикладной ньюанс.

Возможно - из-за того, что char по умолчанию может быть настроен в опциях компилятора и на знаковый, и на беззнаковый.

Если ОНО настроено в компиляторе как беззнаковое - будет выдано warn или ошибка компилятора.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если так, то это какаято платформенно-прикладной ньюанс.

Возможно - из-за того, что char по умолчанию может быть настроен в опциях компилятора и на знаковый, и на беззнаковый.

Если ОНО настроено в компиляторе как беззнаковое - будет выдано warn или ошибка компилятора.

понял более не менее. спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В if работает "неявное" приведение типов, но иногда ОНО справится не может, тогда и указывают тип явно.
Иногда, это по настроению или как? ;)

Читать https://www.securecoding.cert.org/confluenc...onversion+rules

гуглить c integer promotion rules

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Иногда, это по настроению или как? ;)
Иногда - это значит, что знаковость char стандартом не определена. В одном компиляторе по умолчанию он может быть знаковым, а в другом - беззнаковым. Знаковость char по умолчанию может меняться от версии к версии. Для криворуких программистов сделали возможность задавать ее ключами компилятора. Более пряморукие используют char только для хранения символов, для байтов используют (un)signed char. Самые правильные программисты используют char для символов, а для байтов используют uint(_fast|_least)8_t.

 

В данном случае без явного приведения будет предупреждение, если char вдруг окажется беззнаковым.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...