GetSmart 0 29 августа, 2015 Опубликовано 29 августа, 2015 (изменено) · Жалоба Для zltigo: Качество кода ремарками не измеряется. Не вводите в заблуждение читателей, называя их ругательством компилятора. Например: if (1) ... до препроцессора могло быть if (Expr) ..., где Expr определялось дефайном. Вся конструкция вызывала бы опциональную инициализацию периферии, например. В отличие от #if допускает даже рунтайм-условие (вроде Fclk > 100). И безусловно должно допускать простейшую константу или выражение, вычисляемое на этапе компиляции. Неполиткорректно называть это ужасным. Ну а что позволено if-у, то юпитеру while и подавно. ИМХО всё вполне читабельно.Так же ИМХО, должно вызывать ремарку компилятора, если условие известно на этапе компиляции. Смысла в таких конструкциях более чем достаточно. Хватит вопить про бессмысленность и всякий криминал. Даже просто if (0 или 1) (это без вмешательства препроцессора) могло быть промежуточной (но 100% рабочей) версией кода, расчитанной на изменение условия в дальнейшем. Вобщем код опционален и этот блок можно включить или выключить по необозначенному явно условию. Смысл в константах есть. Нарушений стандарта нет. Изменено 29 августа, 2015 пользователем GetSmart Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 29 августа, 2015 Опубликовано 29 августа, 2015 · Жалоба Что это вообще - "пока один"? Ну? Тогда-уж агитировали-бы за while( 1 == 1 ) по любому бессмысленная проверка неизменного условия, но хоть какой-то смысл типа "понятнее" можно было притянуть. 1 - это nonzero constant, как раз то, что возникает на пустом месте в for(;;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 29 августа, 2015 Опубликовано 29 августа, 2015 · Жалоба Для zltigo: Качество кода ремарками не измеряется. Не вводите в заблуждение читателей, называя их ругательством компилятора. Поскольку я многие годы много вычитываю чужого кода, то могу утверждать, что еще как измеряется. Писатели не могущие четко выражать свои мысли компилятору, в результате чего компилятору приходится принимать какое-либо неоднозначное решение, получают такой-же нечеткий результат. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 29 августа, 2015 Опубликовано 29 августа, 2015 · Жалоба На самом деле предупреждает не зря. Одно дело 1 << 7 + 16, а сам неоднократно накалывался на word = byte1 << 8 + byte2, хотя точно знаю, что приоритет у сложения выше. И только благодаря этому предупреждению не тратил время на поиски очевидной, но тем не менее пролетающей между глаз ошибки. Согласен, здесь приоритеты не очевидны. Может, действительно, не жалеть скобок... Надо было сделать приоритеты этих операторов равными. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GetSmart 0 29 августа, 2015 Опубликовано 29 августа, 2015 (изменено) · Жалоба Писатели не могущие четко выражать свои мысли компилятору получают такой-же нечеткий результат. На while (const) ? Критикуйте конструктивней и точечней. Необоснованность ругательств компиляторов нужно разбирать в каждом конкретном случае. Компиляторописатели тоже лажают. Встречал граблю когда в конструкции if (0) стоит метка и вне if-а, ниже по коду, стоит на неё переход. Виновен компиляторописатель. Необычный код, но по стандарту ошибки нет. Изменено 29 августа, 2015 пользователем GetSmart Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 29 августа, 2015 Опубликовано 29 августа, 2015 · Жалоба 1 - это nonzero constant, как раз то, что возникает на пустом месте в for(;;) А где все-же ответ на вопрос http://electronix.ru/forum/index.php?showt...t&p=1361373 А зачем писать на самом деле НЕПОНЯТНОЕ, хотя и "привычная", но бессмысленная конструкция while(1), на которую хоть и некоторые компиляторы, но ругатся (и правильно делают), вместо канонического варианта - цикл БЕЗ проверки условий, прямо для такого случая предусмотренного? Зачем? ? А по поводу "возникновения" - уже отвечал: http://electronix.ru/forum/index.php?showt...t&p=1361241 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 29 августа, 2015 Опубликовано 29 августа, 2015 · Жалоба Кстати, я никогда не пишу #if (0) или #if (1), а только #if (true), #if (false) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 29 августа, 2015 Опубликовано 29 августа, 2015 · Жалоба Критикуйте конструктивней и точечней. Читайте внимательнее и не фантазируйте. Warning на constant expression это не единственный warning выдаваемый компиляторами из тех, ктороые нерадивые любят давить. Кстати, я никогда не пишу #if (0) или #if (1), а только #if (true), #if (false) А смысл? Тем более для препроцессора, для которого это никаким боком не ключевые слова, как впрочем и для произвольного (не C11? C99?) Си компилятора. Только в свежих стандартах true и false определены и в том числе для препроцесора. Зато какие прелесные эффекты будут с каким-нибудь GCC препроцессором, который молча без всяких предупреждений подсунет вместо недефинированого true нолик. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 29 августа, 2015 Опубликовано 29 августа, 2015 · Жалоба А смысл? Тем более для препроцессора, для которого это никаким боком не ключевые слова, как впрочем и для произвольного (не C11? C99?) Си компилятора. Только в свежих стандартах true и false определены и в том числе для препроцесора. Зато какие прелесные эффекты будут с каким-нибудь GCC препроцессором, который молча без всяких предупреждений подсунет вместо недефинированого true нолик. На то есть #include <stdbool.h> А смысл - лично для меня, эстета. :rolleyes: "Истина" круче "единицы". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 29 августа, 2015 Опубликовано 29 августа, 2015 · Жалоба На то есть #include <stdbool.h> А смысл - лично для меня, эстета. :rolleyes: "Истина" круче "единицы". Повторяю - ЕСЛИ ЕСТЬ, а есть только начиная, помнится, с C99, а если нет, то... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 29 августа, 2015 Опубликовано 29 августа, 2015 · Жалоба Повторяю - ЕСЛИ ЕСТЬ, а есть только начиная, помнится, с C99, а если нет, то... Напомните, сколько лет прошло с 1999 года? Что ж цепляться за старое? В том, чем я пользуюсь, есть. Прикажете забить (забыть)? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GetSmart 0 29 августа, 2015 Опубликовано 29 августа, 2015 · Жалоба Warning на constant expression это не единственный warning выдаваемый компиляторами из тех, ктороые нерадивые любят давить. Список компиляторов в студию. И текст исходника. Экономьте время собеседников на уточнения. Для do и while зато упоминаются expression. А constant expression частный случай expression. Сможете опровергнуть? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 29 августа, 2015 Опубликовано 29 августа, 2015 · Жалоба А где все-же ответ на вопрос http://electronix.ru/forum/index.php?showt...t&p=1361373 Зачем? Потому что это нормальная языковая конструкция. Специально посмотрел: использую оба варианта, но чаще while(1). Объясняется это очень просто - в старые времена компиляторы под ARM отвратительно компилировали циклы for, из-за чего повсеместно использовал do-while. Потом пришлось специально заставлять себя писать for, потому как последний для обычных циклов нагляднее. Но для бесконечного цикла разницы не делаю. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 29 августа, 2015 Опубликовано 29 августа, 2015 · Жалоба Напомните, сколько лет прошло с 1999 года? Что ж цепляться за старое? Абсолютно согласен, что использовать следует C99. Но жизнь, есть жизнь. Я вот до сих пор вынужден пользовать И компиляторы не поддерживающие C99. C99 просто нет. Есть и глупые варианты, например, пару месяцев назад начал рабтать с котроллерос с ядром BA22. Есть GCC toolchain весь из себя C99. Но весь говнокод идущий с контроллером компилируется не в С99. Какого черта - вопрос не ко мне, а к "программистам" тупо по умолчанию собравших. А там действительно чистый говнокод, который-бы сто лет не читал-бы, но он идет, в соответствии с новейшими тенденциями, ВМЕСТО документации :(. Зачем? Потому что это нормальная языковая конструкция. В вопросе, по причине того, что такой "ответ" повторяется вместо мантры, был сразу и второй - почему на "нормальную" ругаются компиляторы? Их разработчики так-же, как и я "заблуждаются"? Список компиляторов в студию Не сочтите за труд ознакомится с ранее данным ответом на этот вопрос. Сможете опровергнуть? Частные случаи на то и частные, что не всегда эквиваленты общим. По этой причне в стандарте эти понятия и РАЗДЕЛЕНЫ и constant expression в контесте while() НЕ упоминаются, в отличие, кстати, от for() Специально посмотрел: использую оба варианта, но чаще while(1). Объясняется это очень просто - в старые времена компиляторы под ARM отвратительно компилировали циклы for, из-за чего повсеместно использовал do-while. У меня еще для одного изделия на AM186CC еще живет BCC 3.1 за него, правда уже не уверен, но 2.0 для while( 1 ) генерил лишний код в цикле, в отличие от for( ; ; ). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 29 августа, 2015 Опубликовано 29 августа, 2015 · Жалоба В вопросе, по причине того, что такой "ответ" повторяется вместо мантры, был сразу и второй - почему на "нормальную" ругаются компиляторы? Их разработчики так-же, как и я "заблуждаются"? Как Вы сами заметили, уже перестают. Времена меняются, язык тоже. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться