Easyelectronics.ru

Электроника для всех
Текущее время: 23 сен 2019, 10:22

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 42 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Можно ли делать так if (i++ < 100) {;} ?
СообщениеДобавлено: 12 июл 2017, 16:49 
Заглядывает иногда

Зарегистрирован: 16 сен 2016, 11:21
Сообщения: 198
Это счётчик тиков в обработчике прерывания по переполнению аппаратного счётчика.
Красиво, кратко, компилятор молчит, но что-то не работает, Мега вообще не запускается после прошивки.
По-простому конечно нужно так if (i < 100) {i++;},
но в этом ли косяк пока не могу проверить, идея только сейчас пришла, до проверки смогу добраться только через 2-3 дня.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Можно ли делать так if (i++ < 100) {;} ?
СообщениеДобавлено: 12 июл 2017, 17:37 
Старожил
Аватара пользователя

Зарегистрирован: 18 апр 2017, 03:01
Сообщения: 1128
Конечно нельзя. Ну если только нужен просто инкремент i, но тогда уж лучше так и написать: i++.
В общем компилятор из этого оставляет только инкремент - он не дурак )))


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Можно ли делать так if (i++ < 100) {;} ?
СообщениеДобавлено: 12 июл 2017, 17:53 
Заглядывает иногда

Зарегистрирован: 16 сен 2016, 11:21
Сообщения: 198
h4lf писал(а):
Конечно нельзя. Ну если только нужен просто инкремент i, но тогда уж лучше так и написать: i++.
В общем компилятор из этого оставляет только инкремент - он не дурак )))
Вот, чёрт, так я и думал. Глаз немного резало, но всё было так красиво. Увижу разработчиков компилятора, всё скажу, что про них думаю. :-)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Можно ли делать так if (i++ < 100) {;} ?
СообщениеДобавлено: 12 июл 2017, 18:18 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 3937
Откуда: КЧР, поселок Нижний Архыз
Естественно, компилятор даже на уровне 1 оптимизации пустой ненужный цикл выбросит нафиг. Поэтому либо объявить i как volatile, либо воткнуть nop() внутрь тела if.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Можно ли делать так if (i++ < 100) {;} ?
СообщениеДобавлено: 12 июл 2017, 19:24 
Старожил

Зарегистрирован: 17 дек 2014, 04:38
Сообщения: 677
Компилятор все делает правильно ! Вы указали не условный инкремент, а без условный ! В вашем выражении происходит сравнение, без условный инкремент, действие от результата сравнения (у вас бездействие). Если вы желаете условный инкремент, то делайте "По-простому"
Код:
if (i < 100) i++;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Можно ли делать так if (i++ < 100) {;} ?
СообщениеДобавлено: 12 июл 2017, 19:30 
Старожил
Аватара пользователя

Зарегистрирован: 14 июн 2015, 17:41
Сообщения: 2599
Откуда: Русь, Новороссийск
У меня временные флаги ставятся так (например):
if (++Minutes > 59) {...};
Точно работает.
Разумеется, не я придумал, а где-то слямзил.

Но я в программировании - "практический ноль".


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Можно ли делать так if (i++ < 100) {;} ?
СообщениеДобавлено: 12 июл 2017, 19:43 
Старожил
Аватара пользователя

Зарегистрирован: 18 апр 2017, 03:01
Сообщения: 1128
TSV, скажите, что они всё правильно сделали? Ведь то, что выполняется по условию - должно быть после скобочек, а раз там ничего нет, то и сравнивать не зачем - будет только выполняться инкремент.
Или это о том, что желательно предупреждать, что в самом условии (внутри скобочек) что-то меняется? Так же как есть предупреждение о присвоении вместо сравнения.

Eddy_Em, volatile i тут не поможет, сравнения всё равно не будет. Вы поняли - что написал автор? Он написал:
Код:
if (i++ < 100) {;}
вместо
Код:
if (i < 100) i++;
да, если внутрь тела условия поместить что-то невыкидываемое компилятором, то сравнение будет, но, боюсь, всё равно будет работать не так, как задумал автор. А именно - будет происходить сравнение, потом инкремент i а потом, по результату сравнения будет выполняться/пропускаться тело сравнения - т.е. инкремент i будет при каждом сравнении независимо от его результата. Хотя, может автор так и задумывал(как в случае VladyMile), но вряд-ли.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Можно ли делать так if (i++ < 100) {;} ?
СообщениеДобавлено: 12 июл 2017, 22:24 
Старожил
Аватара пользователя

Зарегистрирован: 18 апр 2017, 03:01
Сообщения: 1128
Наверное с примерами будет проще, что к чему.
Это:
Код:
if (++i < 100) {тело условия}
тоже самое что:
Код:
i++;
if (i < 100) {тело условия}

А вот это:
Код:
if (i++ < 100) {тело условия}
тоже самое что и:
Код:
if (i < 100) {тело условия}
i++;
а точнее, для случая если i используется в теле этого же условия, вот так:
Код:
if (i < 100) {i++; тело условия}
else i++;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Можно ли делать так if (i++ < 100) {;} ?
СообщениеДобавлено: 12 июл 2017, 22:38 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 3937
Откуда: КЧР, поселок Нижний Архыз
h4lf писал(а):
Вы поняли - что написал автор?

Тьфу ты! Я как-то автоматом эту бесполезную конструкцию рассмотрел как while(i++<100){}.
Действительно, компилятор в любом случае это бесполезное сравнение будет убирать, если ничего внутрь тела не засунуть.
Непонятно, зачем писать так, а не просто ++i.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Можно ли делать так if (i++ < 100) {;} ?
СообщениеДобавлено: 13 июл 2017, 12:18 
Старожил

Зарегистрирован: 06 фев 2011, 15:16
Сообщения: 617
Откуда: Челябинск
TSV писал(а):
h4lf писал(а):
Конечно нельзя. Ну если только нужен просто инкремент i, но тогда уж лучше так и написать: i++.
В общем компилятор из этого оставляет только инкремент - он не дурак )))
Вот, чёрт, так я и думал. Глаз немного резало, но всё было так красиво. Увижу разработчиков компилятора, всё скажу, что про них думаю. :-)

Нечего на разработчиков пенять, коль ...
Чего вы хотели добиться этим оператором?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Можно ли делать так if (i++ < 100) {;} ?
СообщениеДобавлено: 13 июл 2017, 14:49 
Старожил
Аватара пользователя

Зарегистрирован: 04 окт 2011, 10:19
Сообщения: 1740
А что бы не посмотреть в дизассемблере с разными оптимизациями и вариантами ?
volatile еще добавить в список вариантов.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Можно ли делать так if (i++ < 100) {;} ?
СообщениеДобавлено: 13 июл 2017, 15:29 
Заглядывает иногда

Зарегистрирован: 16 сен 2016, 11:21
Сообщения: 198
Eddy_Em писал(а):
Непонятно, зачем писать так, а не просто ++i.
Да просто короче хотелось запись сделать, типа - красивше смотрится. if меньше - инкремент и выход, else - выход без инкремента. И всё в одной строчке.


Последний раз редактировалось TSV 13 июл 2017, 15:42, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Можно ли делать так if (i++ < 100) {;} ?
СообщениеДобавлено: 13 июл 2017, 15:31 
Заглядывает иногда

Зарегистрирован: 16 сен 2016, 11:21
Сообщения: 198
x893 писал(а):
А что бы не посмотреть в дизассемблере с разными оптимизациями и вариантами ?
В ассемблере я NULL. Меня пока Си переполняет, из ушей лезет.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Можно ли делать так if (i++ < 100) {;} ?
СообщениеДобавлено: 13 июл 2017, 15:36 
Заглядывает иногда

Зарегистрирован: 16 сен 2016, 11:21
Сообщения: 198
Bill писал(а):
Нечего на разработчиков пенять, коль ...
Зачем же так сразу про ....? Я же там смайлик поставил, как смог. Понимаю, что сам неправ.
Bill писал(а):
Чего вы хотели добиться этим оператором?
Хотел просто короче сделать запись, красивее. Сначала сравниваем, if меньше - инкремент и выход, else - выход без инкремента. Не продумал, как это может быть воспринято компилятором. Опыт же - сын ошибок трудных.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Можно ли делать так if (i++ < 100) {;} ?
СообщениеДобавлено: 13 июл 2017, 16:34 
Старожил
Аватара пользователя

Зарегистрирован: 18 апр 2017, 03:01
Сообщения: 1128
x893 писал(а):
А что бы не посмотреть в дизассемблере с разными оптимизациями и вариантами ?
volatile еще добавить в список вариантов.
я смотрел ещё перед первым своим постом тут. Правда не в православном ARMCC, а в ARM GCC с оптимизацией -Og (для отладки), volatile на всякий случай тоже посмотрел - в этом случае он ничего не даёт и не должен, так как мысли читать пока не умеет.
Но тут и по чисто Сишной логике не должно быть так, как задумывал автор, ибо условие в любом случае выполняется (проверяется, и например, если там есть функции - они всегда вызываются), а вот тело условия уже в зависимости от результата. Так что сократить код тут таким образом не выйдет.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Можно ли делать так if (i++ < 100) {;} ?
СообщениеДобавлено: 13 июл 2017, 17:17 
Старожил
Аватара пользователя

Зарегистрирован: 14 июн 2015, 17:41
Сообщения: 2599
Откуда: Русь, Новороссийск
TSV писал(а):
просто короче хотелось запись сделать, типа - красивше смотрится. if меньше - инкремент и выход, else - выход без инкремента. И всё в одной строчке.
Ну так переверните условия и проверку, например, вот так:
if (++i > 99) {return;} //или break, смотря где это у вас
else {...полезная часть программы...;}
Получится то же самое, что и у вас.


Последний раз редактировалось VladyMile 13 июл 2017, 17:22, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Можно ли делать так if (i++ < 100) {;} ?
СообщениеДобавлено: 13 июл 2017, 17:19 
Старожил

Зарегистрирован: 06 фев 2011, 15:16
Сообщения: 617
Откуда: Челябинск
TSV писал(а):
Хотел просто короче сделать запись, красивее. Сначала сравниваем, if меньше - инкремент и выход, else - выход без инкремента. Не продумал, как это может быть воспринято компилятором. Опыт же - сын ошибок трудных.

Понятно, что хочется короче. А все-таки.... Где у вас else?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Можно ли делать так if (i++ < 100) {;} ?
СообщениеДобавлено: 13 июл 2017, 17:22 
Старожил

Зарегистрирован: 06 фев 2011, 15:16
Сообщения: 617
Откуда: Челябинск
VladyMile писал(а):
TSV писал(а):
просто короче хотелось запись сделать, типа - красивше смотрится. if меньше - инкремент и выход, else - выход без инкремента. И всё в одной строчке.
Ну так переверните условия и проверку, например, вот так:
if (++i > 99) {return;}
else {...полезная часть программы...;}
Получится то же самое, что и у вас.
else после return можно опустить. Или нет?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Можно ли делать так if (i++ < 100) {;} ?
СообщениеДобавлено: 13 июл 2017, 17:26 
Старожил
Аватара пользователя

Зарегистрирован: 14 июн 2015, 17:41
Сообщения: 2599
Откуда: Русь, Новороссийск
Зависит от.
Можно всё.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Можно ли делать так if (i++ < 100) {;} ?
СообщениеДобавлено: 13 июл 2017, 17:32 
Старожил

Зарегистрирован: 07 авг 2014, 17:15
Сообщения: 383
Откуда: дальнее надмосковье
Развели тут топик на 20 постов по теме бесполезной строки кода "if (i++ < 100) {}" который просто равносильно строке "i++;" :) И все это за пределами "детскоко" раздела :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Можно ли делать так if (i++ < 100) {;} ?
СообщениеДобавлено: 13 июл 2017, 17:40 
Старожил
Аватара пользователя

Зарегистрирован: 18 апр 2017, 03:01
Сообщения: 1128
VladyMile писал(а):
Ну так переверните условия и проверку, например, вот так:
if (++i > 99) {return;} //или break, смотря где это у вас
else {...полезная часть программы...;}
Получится то же самое, что и у вас.

Нет, тут всё равно инкремент будет при каждой проверке. Но если автору именно это и нужно, то хорошо. Я как то уже не уверен, что понимаю, что именно ему было нужно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Можно ли делать так if (i++ < 100) {;} ?
СообщениеДобавлено: 13 июл 2017, 17:59 
Старожил
Аватара пользователя

Зарегистрирован: 06 ноя 2013, 16:07
Сообщения: 652
Откуда: Германия
TSV писал(а):
Хотел просто короче сделать запись, красивее.


Далеко не всегда стоит пытаться уместить все в одну строку. Кто догадается, что делает следующий код (JavsScript, задача известная всем с детства) ;)

Код:
return t.split('').slice(0, Math.floor(t.length/2)).reduce((a,v)=>a+v*1,0) == t.split('').slice(Math.ceil(t.length/2)).reduce((a,v)=>a+v*1,0)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Можно ли делать так if (i++ < 100) {;} ?
СообщениеДобавлено: 13 июл 2017, 18:16 
Заглядывает иногда

Зарегистрирован: 16 сен 2016, 11:21
Сообщения: 198
Bill писал(а):
Понятно, что хочется короче. А все-таки.... Где у вас else?
Там он был просто не нужен. Это я в письме пояснил свою тогдашнюю задумку через if-else.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Можно ли делать так if (i++ < 100) {;} ?
СообщениеДобавлено: 13 июл 2017, 18:21 
Заглядывает иногда

Зарегистрирован: 16 сен 2016, 11:21
Сообщения: 198
h4lf писал(а):
Нет, тут всё равно инкремент будет при каждой проверке. Но если автору именно это и нужно, то хорошо. Я как то уже не уверен, что понимаю, что именно ему было нужно.
Нет, как раз вся соль была в отсутствии инкремента при невыполнении условия. Пока меньше - делаем ++, как дошли до порога - стоп. Это счётчик в обработчике прерывания, по которому срабатывает кусок в основном коде.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Можно ли делать так if (i++ < 100) {;} ?
СообщениеДобавлено: 13 июл 2017, 18:33 
Старожил
Аватара пользователя

Зарегистрирован: 18 апр 2017, 03:01
Сообщения: 1128
TSV, ну значит я правильно понял. Тогда инкремент нужно делать только в теле условия. Т.е. просто и наглядно, как в самом первом Вашем посте:
Код:
if (i < 100) i++;
надеюсь эта тема не зря так раздулась и повысит Ваш скилл и понимание в C :)
Про volatile, надеюсь, и так уже в курсе.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 42 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB