Вопросы по С/С++ (СИ)
Re: Вопросы по С/С++ (СИ)
упс
Последний раз редактировалось Martian Пт май 03, 2024 05:48:39, всего редактировалось 1 раз.
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: Вопросы по С/С++ (СИ)
Я сейчас вот такой код попробовал.
Результат 0xFF01.
Ворнинга нет. Компилятор IAR. Пробовал выбирать Stantard C, C89 и С++.
Код: Выделить всё
volatile uint8_t a=0xFF;
volatile uint16_t v=a<<8 | (uint8_t)1;Ворнинга нет. Компилятор IAR. Пробовал выбирать Stantard C, C89 и С++.
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Вопросы по С/С++ (СИ)
Если прогуливать уроки физики в школе, то мир наполнится магией и волшебством 
Точно так же, если не читать стандарты на язык программирования. Ключевые слова "Integer Promotions".
Точно так же, если не читать стандарты на язык программирования. Ключевые слова "Integer Promotions".
Re: Вопросы по С/С++ (СИ)
Значит, OKF прав, а я - нет. Поставим ему плюсик...
И всё же, я предпочту явное приведение неявному. И кучу скобок. Возможно, ресурс клавиатуры при этом сокращается, но зато в разы меньше проявляется ошибок, чем когда писал в стиле "тут и ежу понятно". И я точно помню, что когда-то давно сталкивался с отсутствием расширяющегося приведения операндов при сдвиге. Увы, не смог вспомнить, где.
И всё же, я предпочту явное приведение неявному. И кучу скобок. Возможно, ресурс клавиатуры при этом сокращается, но зато в разы меньше проявляется ошибок, чем когда писал в стиле "тут и ежу понятно". И я точно помню, что когда-то давно сталкивался с отсутствием расширяющегося приведения операндов при сдвиге. Увы, не смог вспомнить, где.
Re: Вопросы по С/С++ (СИ)
[uquote="Martian",url="/forum/viewtopic.php?p=4575532#p4575532"]a << сb | c(d)[/uquote]
Давненько не писал на Си, а для МК - вообще никогда. Но заинтересовала эта конструкция. Следуя K & R, насколько я их помню, едино что приходит на ум - процедура c с парамеиром d . Но это, конечно, не так?
Давненько не писал на Си, а для МК - вообще никогда. Но заинтересовала эта конструкция. Следуя K & R, насколько я их помню, едино что приходит на ум - процедура c с парамеиром d . Но это, конечно, не так?
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Вопросы по С/С++ (СИ)
Это точно не процедура, в С тупо нет процедур, а есть функции. А c(d) может быть как вызовом функции, так и макросом или даже приведением типа. Всё зависит от того что есть c.
Re: Вопросы по С/С++ (СИ)
[uquote="VladislavS",url="/forum/viewtopic.php?p=4575611#p4575611"]Если прогуливать уроки физики в школе, то мир наполнится магией и волшебством 
Точно так же, если не читать стандарты на язык программирования. Ключевые слова "Integer Promotions".[/uquote]
Да. Люблю волшебство.) Ну а беда в том что стандарт не определяет последовательность вычисления операндов:
Except where noted, evaluations of operands of individual operators and of subexpressions of individual expressions are unsequenced ... The value computations of the operands of an operator are sequenced before the value computation of the result of the operator. If a side effect on a memory location (4.4) is unsequenced relative to either another side effect on the same memory location or a value computation using the value of any object in the same memory location, and they are not potentially concurrent (4.7) , the behavior is undefined (ISO/IEC 14882:2017 разд. 4.6(17) стр. 14)
Точно так же, если не читать стандарты на язык программирования. Ключевые слова "Integer Promotions".[/uquote]
Да. Люблю волшебство.) Ну а беда в том что стандарт не определяет последовательность вычисления операндов:
Except where noted, evaluations of operands of individual operators and of subexpressions of individual expressions are unsequenced ... The value computations of the operands of an operator are sequenced before the value computation of the result of the operator. If a side effect on a memory location (4.4) is unsequenced relative to either another side effect on the same memory location or a value computation using the value of any object in the same memory location, and they are not potentially concurrent (4.7) , the behavior is undefined (ISO/IEC 14882:2017 разд. 4.6(17) стр. 14)
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Вопросы по С/С++ (СИ)
Последовательность вычисления не может перепрыгнуть через приоритеты операций и не меняет разрядность вычислений. В выражениях без побочных эффектов непринципиальна.
Re: Вопросы по С/С++ (СИ)
В примере к WCH RISC-V встретилась любопытная конструкция:
Мне казалось, что аргументом функции должен стать результат одного из результатов тернарной операции, но это не так (да и он всегда истинен)
Тут тоже как-то хитро работает приоритетность?
Код: Выделить всё
GPIO_WriteBit(GPIOD, GPIO_Pin_0, (i == 0) ? (i = Bit_SET) : (i = Bit_RESET));Тут тоже как-то хитро работает приоритетность?
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: Вопросы по С/С++ (СИ)
Я крайне редко пользуюсь тернарным оператором. Боюсь ошибиться.
Но ведь он не просто выполняет одно из выражений , но и возвращает его результат.
Добавлено after 2 minutes 22 seconds:
Но ведь он не просто выполняет одно из выражений , но и возвращает его результат.
Добавлено after 2 minutes 22 seconds:
кто?Martian писал(а):да и он всегда истинен)
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Вопросы по С/С++ (СИ)
Третьим аргументом функции GPIO_WriteBit() будет значение выражения которое при каждом вызове будет менять своё значение с Bit_SET на Bit_RESET и наоборот. Так дрыганье ногой сделали. Пример в Compiler Explorer.
ЗЫ:
У меня в коде вот такая приколюха с тернарником есть
Код: Выделить всё
(i == 0) ? (i = Bit_SET) : (i = Bit_RESET)ЗЫ:
У меня в коде вот такая приколюха с тернарником есть
Код: Выделить всё
bool isKeyPressed() { return key_pressed ? key_pressed=false,true : false; }
Re: Вопросы по С/С++ (СИ)
тоже красиво )
я решил глянуть, как в ассемблере вышло и застрял за разбирательством "что такое риск-ви"
А ведь это очень удобно...
Добавлено after 3 minutes 34 seconds:
[uquote="Z_h_e",url="/forum/viewtopic.php?p=4588480#p4588480"]кто?[/uquote] результат присваивания i = x; По крайней мере,
если слегка ошибиться и написать if (i = x), то у меня было когда-то, что это принималось за истину, и даже где-то читал описание, что в данном случае условие всегда истинно. Ща проверю.
Добавлено after 3 minutes 41 second:
ага, здесь точно также, условие определяется итоговым значением переменной.
класс. ещё одно моё заблуждение...
Z_h_e, спасибо за вопрос.
я решил глянуть, как в ассемблере вышло и застрял за разбирательством "что такое риск-ви"
о как! я думал на такое, но отбросил, как не кажущееся логичным. VladislavS, спасибо!VladislavS писал(а):будет менять своё значение с Bit_SET на Bit_RESET и наоборот. Пример в Compiler Explorer.
А ведь это очень удобно...
Добавлено after 3 minutes 34 seconds:
[uquote="Z_h_e",url="/forum/viewtopic.php?p=4588480#p4588480"]кто?[/uquote] результат присваивания i = x; По крайней мере,
если слегка ошибиться и написать if (i = x), то у меня было когда-то, что это принималось за истину, и даже где-то читал описание, что в данном случае условие всегда истинно. Ща проверю.
Добавлено after 3 minutes 41 second:
ага, здесь точно также, условие определяется итоговым значением переменной.
класс. ещё одно моё заблуждение...
Z_h_e, спасибо за вопрос.
Последний раз редактировалось Martian Пт июн 07, 2024 13:37:47, всего редактировалось 1 раз.
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: Вопросы по С/С++ (СИ)
Так тернарный оператор возвращает фактический результат, а не булевый тип. То есть результатом i=x , будет x.
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Вопросы по С/С++ (СИ)
[uquote="Martian",url="/forum/viewtopic.php?p=4588538#p4588538"]результат присваивания i = x; По крайней мере,[/uquote]Оператор присваивания возвращает правое выражение. Это позволяет делать последовательные присваивания a=b=c;
Re: Вопросы по С/С++ (СИ)
да, теперь понял.
- Gudd-Head
- Друг Кота
- Сообщения: 20091
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Вопросы по С/С++ (СИ)
[uquote="Martian",url="/forum/viewtopic.php?p=4588538#p4588538"]если слегка ошибиться и написать if (i = x), то у меня было когда-то, что это принималось за истину, и даже где-то читал описание, что в данном случае условие всегда истинно.[/uquote]
На Хабре недавно была статья, что почти все компиляторы стали выдавать предупреждение на присваивание в условии.
На Хабре недавно была статья, что почти все компиляторы стали выдавать предупреждение на присваивание в условии.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Re: Вопросы по С/С++ (СИ)
Да, те, которыми сейчас пользуюсь, все выдают. А давно когда-то пару раз уходило достаточно много времени на поиск такой опечатки...
Re: Вопросы по С/С++ (СИ)
==,!= вообще декоративные при том что - определен для всего что обычно сравнивают с их помощью
-
Darkmaster
- Встал на лапы
- Сообщения: 137
- Зарегистрирован: Вс окт 11, 2009 09:54:59
- Откуда: Пенза
Re: Вопросы по С/С++ (СИ)
Всем доброго 
Подскажите по масками, точнее как записать в порт, в младшие байты, не изменив старших.??
Временная переменная tempo
Переменная с данными Х
В итоге собственно ничегошеньки не получается. (применяется для инициализации и записи в жки).
Не работает ни в протеус'е, ни на макете.
При прямой записи вида
Всё работает
Подскажите по масками, точнее как записать в порт, в младшие байты, не изменив старших.??
Временная переменная tempo
Переменная с данными Х
Код: Выделить всё
tempo=( (X>>4) & 0x0F);
PORT |=tempo;
..
...
tempo= (X & 0x0F);
PORT |=tempo;
...
...
Не работает ни в протеус'е, ни на макете.
При прямой записи вида
Код: Выделить всё
PORT =((X>>4) & 0x0F)
Интересная,однако,штука
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Очень удобно: написать код, которому отдельный толмач нужен. Видимо, про веревку для выстрела в ногу нынче читать не модно... Перед функцией написать x = ! x и потом передать х в функцию (т.е. написать так, что даже умственно неполноценный разберется) - это не куто...
В принципе, чтобы прослыть крутым программистом, достаточно обфускатор скачать.
В принципе, чтобы прослыть крутым программистом, достаточно обфускатор скачать.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!

