- 1
if(0){}else for (... тут всякий код...) и тут всякий код
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
−17
if(0){}else for (... тут всякий код...) и тут всякий код
Из реализации foreach в Qt. Не ГК. Кто первый скажет почему не ГК получит пирожок с полочки.
krypt 17.05.2012 10:09 # 0
bormand 17.05.2012 10:18 # 0
krypt 17.05.2012 10:21 # 0
if (1) for ...
или вообще не
{ for (...)
{
}}
?
krypt 17.05.2012 10:24 # +1
Arigato 17.05.2012 22:10 # 0
bormand 18.05.2012 05:10 # 0
krypt 18.05.2012 11:20 # 0
absolut 18.05.2012 08:43 # 0
TheCalligrapher 19.05.2012 19:48 # +9
переменная 'i' не должна существовать после тела 'for'. А в старом VC++ она продолжала жить и далее.
Только в явно выписанном коде подобный трюк с 'if;else' не имеет никакого смысла - можно было просто взять этот 'for' в дополнительные скобки '{}' и дело с концом. Из поста не ясно, было ли это в оригинале макросом, или все таки было выписано посередине обыкновенного кода. В последнем случае - есть элемент "говнокодовости".
Так вот, этот трюк с 'if;else' применяется именно для написания макроса/макросов, решающего данную проблему. В частности, самым радикальным вариантом будет просто сделать
т.е. фактически нагло "переопределить" ключевое слово 'for' и вопрос решен.
А сам трюк с 'if;else' (вне зависимости от проблемы с 'for') произрастает из техники правильного написания многострочных (т.е. много-stetement-ных) макросов. Правильно написанный многострочный макрос должен быть либо заооболочен в скобки 'do{ ... } while (false)', либо в скобки 'if (false); else { ... }'. Подобная "оболочка" вокруг макроса делает его поведение правильным при использовании в ветках внешних if-ов.
HaskellGovno 19.05.2012 22:57 # +2
bormand 20.05.2012 05:34 # 0
Да, код взят из макроса foreach.
HaskellGovno 20.05.2012 09:26 # 0
не угодил?
TheCalligrapher 20.05.2012 10:10 # +11
ветка 'else' будет проассоциирована с "невидимым" if-ом спрятанным внутри макроса 'for'. Это, разумеется, будет большой неожиданностью для автора кода и доставит ему массу счастливых часов недоуменной отладки.
HaskellGovno 20.05.2012 12:40 # 0
JavaGovno 20.05.2012 13:13 # +1
3.14159265 20.05.2012 14:03 # +2
SemaReal 14.10.2017 01:34 # 0
bormand 14.10.2017 07:26 # 0
inho 12.10.2017 13:09 # 0
AnalPerOral 12.10.2017 15:24 # −1
SemaReal 13.10.2017 03:15 # +1