GetSmart 0 29 августа, 2015 Опубликовано 29 августа, 2015 (изменено) · Жалоба Ошибку того, что программист получил не то, что он думал. Ибо компилятор получил в качестве инструкции БЕССМЫСЛЕННОЕ, хотя и однозначное выражение. Дальше у компилятора два варианта - решить, что это написал не программист а "Джамшут" и не пытаться от него чего-либо еще добиваться, либо таки сообщить о подозрительном выражении. Для определения "Джамшут"/программист у хороших компиляторов есть опция соответствующего warnig. Это уже не потенциальные, а реально НЕОБОСНОВАННЫЕ обвинения и опасения. Контраргументация ранее была изложена в достаточном объёме. ------ Предлагаю желающим обсудить другой криминал. Не запрещено ли всевышним использование пустых фигурных скобок. А так же точки с запятой после скобок. Или внутри скобок обязательно должна стоять хотя бы точка с запятой. Часто циклы ожидания какого-то события делают пустыми, а в конце {}; Изменено 29 августа, 2015 пользователем GetSmart Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 29 августа, 2015 Опубликовано 29 августа, 2015 · Жалоба Контраргументация ранее была изложена в достаточном объёме. Попробуйте убедить своей "контраргументацией" разработчиков компиляторов, которые ругаются на while(CONST). Мне рассказывать, что ныне принято писать дерьмокод и посему это "нормально", пожалуйста, не надо. Из гарантированно мне известных это IAR и MS. Из гарантрованно плюющих помню только GCC. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GetSmart 0 29 августа, 2015 Опубликовано 29 августа, 2015 (изменено) · Жалоба А разве while(1) не сам всевышний написал? :) Попробуйте убедить своей "контраргументацией" разработчиков компиляторов, которые ругаются на while(CONST). Мне рассказывать, что ныне принято писать дерьмокод и посему это "нормально", пожалуйста, не надо. Из гарантированно мне известных это IAR и MS. Из гарантрованно плюющих помню только GCC. IAR в СИ-коде не выдаёт error или warning на while (Const). Если читаете ремарки Иара, то не передёргивайте. --- Надо создать доску позора с необоснованными ошибками компиляторов. Сам иногда удивляюсь логике ругательств. Изменено 29 августа, 2015 пользователем GetSmart Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 29 августа, 2015 Опубликовано 29 августа, 2015 · Жалоба А разве while(1) не сам всевышний написал? :) Всевышний, как написано в библии K&R а так-же в примерах в стандарте, в том числе и C11, написал совершенно однозначное for( ; ; ) :) Потом уже еретики начали писать while(1),while(2),while(3),.....,while(TRUE),while(true),while((_Bool)1) и так далее. Причем без всякой на то надобности. Надо создать доску позора с необоснованными ошибками компиляторов. Сам иногда удивляюсь логике ругательств. Начние с MISRA - там МНОГО веселее :). А с компиляторами все просто - если по какой-то причине, пусть даже по причине собвстенного несовершенства, компилятор сомневается, как понять, лучше пусть ПРЕДУПРЕЖДАЕТ. Я, если вдруг не смогу выразить мысль в однозначно понятной компилятору форме, лучше прагмой в этом месте сообщение подавлю, нежели получу неведомо что. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GetSmart 0 29 августа, 2015 Опубликовано 29 августа, 2015 (изменено) · Жалоба У цикла while только один аргумент - предусловие выполнения. Этот цикл логически естественнен для многих алгоритмов. А с компиляторами все просто - если по какой-то причине, пусть даже по причине собвстенного несовершенства, компилятор сомневается, как понять, лучше пусть ПРЕДУПРЕЖДАЕТ. Компилятор Кейла ругается ошибкой на STM Rz!,{Rx-Ry} если Rz находется внутри сохраняемых регистров. Ошибка, не предупреждение. Писатели компиляторов слишком много себе позволяют. Изменено 29 августа, 2015 пользователем GetSmart Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 29 августа, 2015 Опубликовано 29 августа, 2015 · Жалоба Что касается предупреждений по поводу управляющего выражения, то тут, по-моему, стоит разделять два случая: 1. Когда выражение изначально представляет собой константу: while(1) {...} if(123) {...} /* Правда, выглядит ужасно? */ Тут предупреждение явно ни к чему. 2. Когда выражение обращается в константу на этапе компиляции: unsigned int x; if(x >= 0) {...} В этом случае есть явный повод для предупреждения. Оформление бесконечного цикла - это уже дело вкуса программиста. Я, пожалуй, соглашусь, что for(;;) {..} лучше, просто на основании того, что if(1) {...} мне представляется ужасным. Но while(1) {...} все же ни малейшего отторжения не вызывает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 29 августа, 2015 Опубликовано 29 августа, 2015 · Жалоба У цикла while только один аргумент - предусловие выполнения. Этот цикл логически естественнен для многих алгоритмов. Я что-то писал о неестественности цикла? Нет? Возражения только против того, что именно-то и УСЛОВИЯ быть-то и НЕ должно, ибо цикл БЕЗУСЛОВНЫЙ. Вот посему for c ОТСУТСТВУЮЩИМ условием есть логично, а while c БЕССМЫСЛЕННЫМ ВЫРАЖЕНИМ условия, есть настораживающий факт. что if(1) {...} мне представляется ужасным. Тем неменее изрядно часто используется if(0){...} для того что-бы закомментировать кусок исходника. Кому-то это уже ужасным не кажется :( - типа очередной супертрюк - одним символом комментировать/раскомментировать. Задавлены предупреждения и понеслись писать говнокод. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 29 августа, 2015 Опубликовано 29 августа, 2015 · Жалоба Гы-гы. Развели мегасрач на пустом месте. Модераторы за прыжок на месте расстреливают, а тут такое... Я их не понимаю :laughing: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GetSmart 0 29 августа, 2015 Опубликовано 29 августа, 2015 (изменено) · Жалоба Вот посему for c ОТСУТСТВУЮЩИМ условием есть логично, а while c БЕССМЫСЛЕННЫМ ВЫРАЖЕНИМ условия, есть настораживающий факт. Все сразу отсутствующие аргументы лично у меня вызывают диссонанс. Как и do .. while (0) в дефайнах из-за доисторических компиляторов, выдававших варнинг на голую точку с запятой. Последнее напоминает решение проблемы через одно место. Константа обязана быть корректным аргументом для опциональной совместимости. Бессмысленность, при желании, можно усмотреть даже в существовании людей. Или себя. И аргументировать это повышением уровня интеллекта/самосознания или сменой точки отсчёта. Вас уже просили использовать терминологию стандарта. У программистов есть законное право использовать любой из разрешённых вариантов. Изменено 29 августа, 2015 пользователем GetSmart Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 134 29 августа, 2015 Опубликовано 29 августа, 2015 · Жалоба Восклицательный знак в желтом треугольнике напротив опасной строки. :rolleyes: И подчеркивает красненьким опасное место. При наведении мыши на подчеркнутое или на значок выдается: warning: operator '<<' has lower precedence than '+'; '+' will be evaluated first На самом деле предупреждает не зря. Одно дело 1 << 7 + 16, а сам неоднократно накалывался на word = byte1 << 8 + byte2, хотя точно знаю, что приоритет у сложения выше. И только благодаря этому предупреждению не тратил время на поиски очевидной, но тем не менее пролетающей между глаз ошибки. По поводу вашего спора о do {} while (0). Единственное место, где это выражение необходимо - подобный функции макрос из более чем одного выражения. Который можно не задумываясь и однообразно вставлять в любое место, где допустим вызов функции, в том числе и в выражение if(cond) macro(); else ... И идите лесом с убеждениями меня в бессмысленности while(0) - он здесь делает именно то, что от него требуется. И я буду его использовать в линейном коде do { if(!func1()) break;... if(!func2()) break; ..... } while(0); потому что это совершенно однозначная конструкция, существенно упрощающая исходник. И мне глубоко фиолетово, что кому-то она эстетически неприятна. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 29 августа, 2015 Опубликовано 29 августа, 2015 · Жалоба И мне глубоко фиолетово, что кому-то она эстетически неприятна. Дело совершенно не в эстетике. В безвыходных случаях можно использовать все. Вот я тоже использую, например для того, что-бы до поры до времени не трогать чужие исходники, например того-же FreeRTOS, где макросов дофига. Только у меня warning на это активизированы и давятся прагмами по месту. А в общем случае сложные макросы-псевдофункции просто не надо использовать - есть механизм заинлайнивания функций. Такой подход безопаснее. Warnig активизированы всегда по максимуму. Не для себя, а для того, что-бы были в качестве одного из индикаторов какчества попадающих в мои руки чужих исходников. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 29 августа, 2015 Опубликовано 29 августа, 2015 · Жалоба Ошибку того, что программист получил не то, что он думал Горе тому программисту, который написав while(0) думает получить что то иное.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 29 августа, 2015 Опубликовано 29 августа, 2015 · Жалоба Горе тому программисту, который написав while(0) думает получить что то иное.... Горе тому, кто не может ни думать (а чего тут думать - трясти надо писать while(1) надо - так все индийские студенты пишут) ни даже читать: http://electronix.ru/forum/index.php?showt...t&p=1361255 ...собственно компилятор НЕ знает, что в исходнике написано while( 1 ) - он получает после препроцессора текст, а там могло быть написано и while( EPRST - eklmn() + 1 ) Тут можно уже подозревать ошибку, или? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 29 августа, 2015 Опубликовано 29 августа, 2015 · Жалоба Препроцессор тут с визгом притянут за уши. Это не аргумент. Совсем. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 29 августа, 2015 Опубликовано 29 августа, 2015 · Жалоба Препроцессор тут с визгом притянут за уши. Это не аргумент. Совсем. А зачем писать на самом деле НЕПОНЯТНОЕ, хотя и "привычная", но бессмысленная конструкция while(1), на которую хоть и некоторые компиляторы, но ругатся (и правильно делают), вместо канонического варианта - цикл БЕЗ проверки условий, прямо для такого случая предусмотренного? Зачем? Что это вообще - "пока один"? Ну? Тогда-уж агитировали-бы за while( 1 == 1 ) по любому бессмысленная проверка неизменного условия, но хоть какой-то смысл типа "понятнее" можно было притянуть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться