Сергей Борщ 143 25 декабря, 2008 Опубликовано 25 декабря, 2008 · Жалоба Угу, и у тебя тоже :) не все включено, ибо еще, если мне не изменяет склероз, должено быть что-то типа Еxpression is constant.Абижяешь, начальник! Я их никогда не отключаю. Нет предупреждения ни в С ни в С++ режиме. ИАР для ARM, 4.30Вобще-то сие однозначно со всех точек зрения пишется так:Согласен, так и пишу. Но тут надо было повторить исходные условия эксперимента. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 26 декабря, 2008 Опубликовано 26 декабря, 2008 · Жалоба Абижяешь, начальник! Я их никогда не отключаю. Нет предупреждения ни в С ни в С++ режиме. Я же не говорил про отключение я говорил про "не все включено" :). Ой, а что у меня это, если написать while(1) : IAR ARM ANSI C/C++ Compiler ..... D:\ARM_WORK\COMMON\LPC2000\console.c(356) : Remark[Pe236]: controlling expression is constant Просто в IAR по умолчанию ремарки отключены :( надо включать, тем более, что под remark в IAR попадают и такие суровые приколы, как Remark[Pe193]: zero used for undefined preprocessing identifier Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 26 декабря, 2008 Опубликовано 26 декабря, 2008 · Жалоба Не во всех компиляторах. В avr-gcc вызов линкера с опцией --relax приводит к замене пар call/ret на jmp, а jmp (там, где длина перехода позволяет) - на rjmp. Это вполне себе оптимизация и занимается ей именно линкер. Thnx, не знал, добавлю в копилку :beer: Но по сравнению с тем, что способен сделать компилятор - это всетаки 'не оптимизация' B) Оптимизации такого уровня способен делать любой компонент в цепочке компиляции, например в Sun'овском ассемблере он мог делать inline подстановки специальных функций (они были описанны в специальных файлах) вместо их вызовов Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DenisIV 0 26 декабря, 2008 Опубликовано 26 декабря, 2008 · Жалоба Вобще-то сие однозначно со всех точек зрения пишется так: for(;; ) { .... } А есть разница? :) while(1) { .... } По-моему нет. В справке к Hi-Tech C они предлагают для бесконечного цикла for(;;) { .... } При каком-то кол-ве циклов внутри цикла for{ for { for { for {}}}} компилятор вешается поэтому приходится комбинировать for... while... if... и т.д. В IAR пока не смотрел. Вроде таких проблем не было. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 26 декабря, 2008 Опубликовано 26 декабря, 2008 · Жалоба А есть разница? :) Разумеется. Если for( ; ; ) есть прямое и безусловно однозначное указание компилятору изобразить вечный цикл, то while(1) есть указание крутиться и слушать пока рак на горе свистнет. Что не есть одно и то-же. Хотя сколь-нибудь приличный оптимизирующий компилятор знакомый с русским фольклером и анатомическим строением ракообразных :) тоже сделает безусловный вечный цикл. Ну и, естественно, хороший компилятор при этом обязан предупредить - ты чего тут барин загадки загадываешь? Точно этого хотел, али опосля вчерашнего того..... При каком-то кол-ве циклов внутри цикла for{ for { for { for {}}}} компилятор вешается поэтому приходится комбинировать for... while... if... и т.д. Опять :( ужасы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sergeeff 1 26 декабря, 2008 Опубликовано 26 декабря, 2008 · Жалоба Бьярн Страустрап, 1995 г. Введение в язык С++. Глава 3 Выражения и операторы : " Странная запись for(;;) - это стандартный способ задать бесконечный цикл; можно произносить это как "навсегда". Это вырожденная форма оператора for; альтернатива - while(1)." Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DenisIV 0 26 декабря, 2008 Опубликовано 26 декабря, 2008 · Жалоба Разумеется. Если for( ; ; ) есть прямое и безусловно однозначное указание компилятору изобразить вечный цикл, то while(1) есть указание крутиться и слушать пока рак на горе свистнет. Что не есть одно и то-же. Хотя сколь-нибудь приличный оптимизирующий компилятор знакомый с русским фольклером и анатомическим строением ракообразных :) тоже сделает безусловный вечный цикл. Ну и, естественно, хороший компилятор при этом обязан предупредить - ты чего тут барин загадки загадываешь? Точно этого хотел, али опосля вчерашнего того..... Опять :( ужасы. Ну я бы так не сказал: если в for(;;) нет условия, это может быть ошибкой, а for(;1;) тоже, что и while(1) и раз уж так, то while() { .... } должно работать так же как и for(;;) ? Т.е. в for не надо вставлять условие ??? а в while надо ??? Правильным будет всегда с условием. Это точно не противоречит стандарту С. А то, что как вы сказали "оптимизирующий компилятор знакомый с русским фольклором" - это скорее исключение, а не правило. Поэтому и обидно... :( Если я буду всем советовать for(;;) то это не будет правильно. Что for(;;) что while() - Варнинги обеспечены по любому. А хотелось бы писать правильно. И запись for(;1;) будет правильней. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 26 декабря, 2008 Опубликовано 26 декабря, 2008 · Жалоба Что for(;;) что while() - Варнинги обеспечены по любому. :) нет. Для этого просто надо знать язык - по стандарту ВСЕ ТРИ expression у for() ОПЦИОНАЛЬНЫ. В отличии от while() у которого один, но ОБЯЗАТЕЛЬНЫЙ. При этом оговаривается, что отсутствующее второе выражение у for() заменяется ненулевой константой. А хотелось бы писать правильно. И запись for(;1;) будет правильней. Не, глупее :( и при этом вменяемый компилятор обязан предупредить, как и в случае с while( 1 ) чем-нибудь типа 'controlling expression is constant'. Кстати, а почему 1, а не 666??? :) глупость, короче, если и писать глупости, то хоть без конкретики - while( TRUE ) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sergeeff 1 26 декабря, 2008 Опубликовано 26 декабря, 2008 · Жалоба Уважаемый гуру! 1 - она и в Африке 1. А что такое TRUE? Макро, которое может и не быть определено или ты забыл подключить нужный .h файл. А если определено, то как 1. Как написано у Кернигана & Ритчи "Какой цикл выбрать: while или for - это дело вкуса". Нельзя считать, что миллионы программистов, исповедующие другой стиль написания программ, пишут глупости (не скромно это, как-то). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 26 декабря, 2008 Опубликовано 26 декабря, 2008 · Жалоба Как написано... Вы слишком много читаете, настолько много, что смысл прочитанного от Вас ускользает а в памяти остаются только культовые имена. Не найдете Вы в этой классической книге ни одого while( 1 ). А for( ; ; ) найдете, ибо автор 'C' отличался хорошим вкусом. А Ваша читата просто вырвана из другого, не связанного с организацией бесконечных циклов контекста. А что такое TRUE? Общепринятое, максимально читабельное и соответствующее сущности значение. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 26 декабря, 2008 Опубликовано 26 декабря, 2008 · Жалоба А не пора ли уже прекратить "религиозные" споры? Если результат компиляции одинаков, то стилистика пускай на совести программиста останется. Конечно нет пределов совершенству и самосовершенствованию, но и насильно в свою "религию" тоже обращать не стоит. Мнения прозвучали, теперь каждый может сделать выводы. Только уже "молча". Чтобы до размахивания авторитетами и до оскорблений дело не дошло. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HARMHARM 0 26 декабря, 2008 Опубликовано 26 декабря, 2008 · Жалоба ... Оптимизации такого уровня способен делать любой компонент в цепочке компиляции, например в Sun'овском ассемблере он мог делать inline подстановки специальных функций (они были описанны в специальных файлах) вместо их вызовов Это называется макрос и есть в любом ассемблере, оптимизацией это называть сложно. Тогда уж всё, что позволяет программу писать не прямо в машинных кодах, есть оптимизация :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 26 декабря, 2008 Опубликовано 26 декабря, 2008 · Жалоба А не пора ли уже прекратить "религиозные" споры? Если результат компиляции одинаков Результат разный - в случае for( 1 ) приличными компиляторами выдается предупреждение, на которое можно, конечно, наплевать, что сделает компилятор при отключенной оптимизации - тоже на его совести. Можете считать это "религиозным" убеждением, наплевательское отношение к делу, равно, как и безграмотная писанина, мне не по душе. Впрочем в данном случае я смог высказаться полностью, более мне добавить нечего, а далее могущий понять да поймет - продолжать не буду. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 27 декабря, 2008 Опубликовано 27 декабря, 2008 · Жалоба Это называется макрос и есть в любом ассемблере, оптимизацией это называть сложно. Тогда уж всё, что позволяет программу писать не прямо в машинных кодах, есть оптимизация :) Это не есть макрос - он заменяет не макровызов (по ID макроса), а обычную ассемблерную комманду call Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 27 декабря, 2008 Опубликовано 27 декабря, 2008 · Жалоба в случае for( 1 ) приличными компиляторами выдается предупреждение, на которое можно, конечно, наплевать, что сделает компилятор при отключенной оптимизации - тоже на его совести.Хотя я и не имел в виду именно эту конструкцию, но и ее тоже проверил. В последних версиях IAR не выдает ни warning, ни remark ни на while(1), ни на for(;1;) . По-вашему фирма IAR "прогнулась" под привычки программистов? Как-то не соотносится это (желание "прогнуться") с введением той же MISRA C в их компиляторы, не находите? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться