#c #boolean #conditional
#c #логическое значение #условный
Вопрос:
У меня часто есть код вида:
uint8_t bool_var = 0;
for (;;) {
...
if (!bool_var) {
do_something();
bool_var = 1;
}
...
}
Существует ли более краткий, не макросный способ выражения условия if и блока?
Комментарии:
1. Вам придется расширить контекст, потому что код в целом будет выполняться только один раз, если вы не сделаете что-то, чтобы заставить его работать снова, например, поместить его в цикл.
2. Для меня выглядит идеально читаемым и кратким. В C вы могли бы проделать некоторые трюки с функторами, но в обычном C все, что короче, сделает его загадочным IMO.
3. @DavideVisentin — Значит, только не вводите этот блок снова для 255 итераций?
4. @DavideVisentin Я думал об этом, но в конечном итоге это завершится, особенно на ATmegas с
uin8_t
s.5. если вы исключаете макросы для скрытия кода, я думаю, что это лучший способ. Если у вас есть
for(int i=0; i<...; i)
, вы можете удалить логическую переменную и заменить ее наif (i==0)
but other than that …
Ответ №1:
Ваш код настолько удобочитаем и прост, насколько это возможно для большинства случаев.
Однако для очень специфических целей вы можете оказаться в ситуации, когда вы хотите всегда вызывать функцию, но иногда без эффекта. Тогда, возможно, имеет смысл использовать какой-нибудь трюк с указателями на функции:
typedef void func_t (void);
...
func_t* do_stuff = do_something;
...
while(stuff) // this code can't be changed for whatever reason
{
do_stuff();
}
В таком сценарии вы можете придумать это:
void nop (void) {}
...
do_stuff = nop;
Теперь вы можете продолжать вызывать do_stuff
, но ничего не произойдет.