реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Странный дефайн
Jenya7
сообщение Oct 1 2017, 09:21
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Встретился мне такой дефайн
Код
#define STATE1  (char)-1
#define STATE2  (char)-2

это как?
Go to the top of the page
 
+Quote Post
arhiv6
сообщение Oct 1 2017, 09:36
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 633
Регистрация: 21-05-10
Из: Томск
Пользователь №: 57 423



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


--------------------
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Oct 1 2017, 09:45
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(arhiv6 @ Oct 1 2017, 14:36) *
Явное приведение типов к char? По-хорошему вместо (char)-1 нужно написать ((char) -1)

а что в результате получиться? в коде есть сравнение if (var != STATE2)
получается дефайн выражается определенным десятичным числом. я бы сказал 6 но зачем char?

Сообщение отредактировал Jenya7 - Oct 1 2017, 09:48
Go to the top of the page
 
+Quote Post
k155la3
сообщение Oct 1 2017, 10:11
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(Jenya7 @ Oct 1 2017, 12:45) *
а что в результате получиться? в коде есть сравнение if (var != STATE2)
получается дефайн выражается определенным десятичным числом. я бы сказал 6 но зачем char?

А какой тип у var ?
Для корректного сравнения в If величины дб одного типа.
Например, сравнивать арифметически -5 и 0x1234 бессмыслено.
(-5 может быть char, int, long и их бинарный вид будет разный и занимать разное кол-во байт)
В if работает "неявное" приведение типов, но иногда ОНО справится не может, тогда и указывают тип явно.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Oct 1 2017, 10:13
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(k155la3 @ Oct 1 2017, 15:11) *
А какой тип у var ?
Для корректного сравнения в If величины дб одного типа.
Например, сравнивать арифметически -5 и 0x1234 бессмыслено.
(-5 может быть char, int, long и их бинарный вид будет разный и занимать разное кол-во байт)
В if работает "неявное" приведение типов, но иногда ОНО справится не может, тогда и указывают тип явно.

var он тоже char. я никогда раньше не видел такого определения. ума не приложу зачем оно понадобилось.
Go to the top of the page
 
+Quote Post
k155la3
сообщение Oct 1 2017, 10:27
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(Jenya7 @ Oct 1 2017, 13:13) *
var он тоже char. я никогда раньше не видел такого определения. ума не приложу зачем оно понадобилось.

Если так, то это какаято платформенно-прикладной ньюанс.
Возможно - из-за того, что char по умолчанию может быть настроен в опциях компилятора и на знаковый, и на беззнаковый.
Если ОНО настроено в компиляторе как беззнаковое - будет выдано warn или ошибка компилятора.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Oct 1 2017, 11:05
Сообщение #7


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(k155la3 @ Oct 1 2017, 15:27) *
Если так, то это какаято платформенно-прикладной ньюанс.
Возможно - из-за того, что char по умолчанию может быть настроен в опциях компилятора и на знаковый, и на беззнаковый.
Если ОНО настроено в компиляторе как беззнаковое - будет выдано warn или ошибка компилятора.

понял более не менее. спасибо.
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Oct 5 2017, 08:02
Сообщение #8


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Цитата
В if работает "неявное" приведение типов, но иногда ОНО справится не может, тогда и указывают тип явно.
Иногда, это по настроению или как? wink.gif
Читать https://www.securecoding.cert.org/confluenc...onversion+rules
гуглить c integer promotion rules


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 5 2017, 08:40
Сообщение #9


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (sigmaN @ Oct 5 2017, 11:02) *
Иногда, это по настроению или как? wink.gif
Иногда - это значит, что знаковость char стандартом не определена. В одном компиляторе по умолчанию он может быть знаковым, а в другом - беззнаковым. Знаковость char по умолчанию может меняться от версии к версии. Для криворуких программистов сделали возможность задавать ее ключами компилятора. Более пряморукие используют char только для хранения символов, для байтов используют (un)signed char. Самые правильные программисты используют char для символов, а для байтов используют uint(_fast|_least)8_t.

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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 7th July 2025 - 21:20
Рейтинг@Mail.ru


Страница сгенерированна за 0.01418 секунд с 7
ELECTRONIX ©2004-2016