Перейти к содержанию
    

Для zltigo:

Качество кода ремарками не измеряется. Не вводите в заблуждение читателей, называя их ругательством компилятора.

 

Например:

if (1) ... до препроцессора могло быть if (Expr) ..., где Expr определялось дефайном. Вся конструкция вызывала бы опциональную инициализацию периферии, например. В отличие от #if допускает даже рунтайм-условие (вроде Fclk > 100). И безусловно должно допускать простейшую константу или выражение, вычисляемое на этапе компиляции. Неполиткорректно называть это ужасным. Ну а что позволено if-у, то юпитеру while и подавно. ИМХО всё вполне читабельно.Так же ИМХО, должно вызывать ремарку компилятора, если условие известно на этапе компиляции.

 

Смысла в таких конструкциях более чем достаточно. Хватит вопить про бессмысленность и всякий криминал. Даже просто if (0 или 1) (это без вмешательства препроцессора) могло быть промежуточной (но 100% рабочей) версией кода, расчитанной на изменение условия в дальнейшем. Вобщем код опционален и этот блок можно включить или выключить по необозначенному явно условию. Смысл в константах есть. Нарушений стандарта нет.

Изменено пользователем GetSmart

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что это вообще - "пока один"? Ну? Тогда-уж агитировали-бы за while( 1 == 1 ) по любому бессмысленная проверка неизменного условия, но хоть какой-то смысл типа "понятнее" можно было притянуть.

1 - это nonzero constant, как раз то, что возникает на пустом месте в for(;;)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для zltigo:

Качество кода ремарками не измеряется. Не вводите в заблуждение читателей, называя их ругательством компилятора.

Поскольку я многие годы много вычитываю чужого кода, то могу утверждать, что еще как измеряется. Писатели не могущие четко выражать свои мысли компилятору, в результате чего компилятору приходится принимать какое-либо неоднозначное решение, получают такой-же нечеткий результат.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На самом деле предупреждает не зря. Одно дело 1 << 7 + 16, а сам неоднократно накалывался на word = byte1 << 8 + byte2, хотя точно знаю, что приоритет у сложения выше. И только благодаря этому предупреждению не тратил время на поиски очевидной, но тем не менее пролетающей между глаз ошибки.

Согласен, здесь приоритеты не очевидны. Может, действительно, не жалеть скобок...

Надо было сделать приоритеты этих операторов равными.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Писатели не могущие четко выражать свои мысли компилятору получают такой-же нечеткий результат.

На while (const) ?

 

Критикуйте конструктивней и точечней. Необоснованность ругательств компиляторов нужно разбирать в каждом конкретном случае.

 

Компиляторописатели тоже лажают. Встречал граблю когда в конструкции if (0) стоит метка и вне if-а, ниже по коду, стоит на неё переход. Виновен компиляторописатель. Необычный код, но по стандарту ошибки нет.

Изменено пользователем GetSmart

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кстати, я никогда не пишу #if (0) или #if (1), а только #if (true), #if (false)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Критикуйте конструктивней и точечней.

Читайте внимательнее и не фантазируйте. Warning на constant expression это не единственный warning выдаваемый компиляторами из тех, ктороые нерадивые любят давить.

 

Кстати, я никогда не пишу #if (0) или #if (1), а только #if (true), #if (false)

А смысл? Тем более для препроцессора, для которого это никаким боком не ключевые слова, как впрочем и для произвольного (не C11? C99?) Си компилятора. Только в свежих стандартах true и false определены и в том числе для препроцесора.

 

Зато какие прелесные эффекты будут с каким-нибудь GCC препроцессором, который молча без всяких предупреждений подсунет вместо недефинированого true нолик.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А смысл? Тем более для препроцессора, для которого это никаким боком не ключевые слова, как впрочем и для произвольного (не C11? C99?) Си компилятора. Только в свежих стандартах true и false определены и в том числе для препроцесора.

 

Зато какие прелесные эффекты будут с каким-нибудь GCC препроцессором, который молча без всяких предупреждений подсунет вместо недефинированого true нолик.

На то есть #include <stdbool.h> А смысл - лично для меня, эстета. :rolleyes: "Истина" круче "единицы".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На то есть #include <stdbool.h> А смысл - лично для меня, эстета. :rolleyes: "Истина" круче "единицы".

Повторяю - ЕСЛИ ЕСТЬ, а есть только начиная, помнится, с C99, а если нет, то...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Повторяю - ЕСЛИ ЕСТЬ, а есть только начиная, помнится, с C99, а если нет, то...

Напомните, сколько лет прошло с 1999 года? Что ж цепляться за старое? В том, чем я пользуюсь, есть. Прикажете забить (забыть)?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Warning на constant expression это не единственный warning выдаваемый компиляторами из тех, ктороые нерадивые любят давить.

Список компиляторов в студию. И текст исходника. Экономьте время собеседников на уточнения.

 

Для do и while зато упоминаются expression. А constant expression частный случай expression.

Сможете опровергнуть?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А где все-же ответ на вопрос http://electronix.ru/forum/index.php?showt...t&p=1361373

Зачем? Потому что это нормальная языковая конструкция.

 

Специально посмотрел: использую оба варианта, но чаще while(1). Объясняется это очень просто - в старые времена

компиляторы под ARM отвратительно компилировали циклы for, из-за чего повсеместно использовал do-while.

Потом пришлось специально заставлять себя писать for, потому как последний для обычных циклов нагляднее.

Но для бесконечного цикла разницы не делаю.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Напомните, сколько лет прошло с 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( ; ; ).

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В вопросе, по причине того, что такой "ответ" повторяется вместо мантры, был сразу и второй - почему на "нормальную" ругаются компиляторы? Их разработчики так-же, как и я "заблуждаются"?

Как Вы сами заметили, уже перестают. Времена меняются, язык тоже.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...