 |
|

30.12.2009, 18:46
|
|
Участник форума
Регистрация: 07.07.2008
Сообщений: 161
С нами:
9391926
Репутация:
234
|
|
Дружно учим C#:
PHP код:
checked
{
for (byte b = 0; b <= 255; b++)
Console.WriteLine(b);
}
Последний раз редактировалось jawbreaker; 30.12.2009 в 18:48..
|
|
|

30.12.2009, 19:17
|
|
Banned
Регистрация: 24.12.2009
Сообщений: 141
С нами:
8622379
Репутация:
45
|
|
каким образом Algol вывел логическую цепочку от целеноправленного введения for в бесконечны цикл.... до отсутствия реализации for как цельной структуры а не цикла while не понятно (для программиста компилятора это узкоспециализированная задача и реализовывать он ее может в соответствии с быстродействием или оптимизацией памяти, никто же не заставляет его использовать реализацию while)
... по вашей логике все в этом мире сведется к циклу loop (ассемблера) а все остальное от лукавого??????
цикл for в примере algol-а не на миг не ушел от описния Керниган Ричи....(не делали же списиально списифического описания for для шарпа) дак что же задавать вопрос о том "..а почему он не разворачивает конфеты?"
Вопросы переполнения переменных это азы Си 8)))
Школьники многих школ .... где преподают Си вместо Паскаля ВАМ ПОДТВЕРДЯТ ЭТО
для С# не придумывали новый синтаксис ни для 'for' ни для if ни для while или until, используется стандартные функции подходящие под описание языка Си и мне программировать совершенно без разницы на TurboC MSVC Net или шарпе без разницы что касается основных структур языка а если я хочу переполнять .... ПОЧЕМУ РАЗРАБОТЧИК КОМПИЛЯТОРА должен запретить мне в соответствии с синтаксисом переполнять переменную чтоб превратить ее в ноль?
такой прием я видел дважды один раз в реализаци победителя конференции AES - блочном шифровании 2fish...
каждый можете сделать аналог for
и понять разницу
между
while(... ) {.....}
и do {....} while(....);
только тот кто использует for 8))) и сам знает как им пользоваться В СООТВЕТСВИИ С ОПИСАНИЕМ 8))!
Последний раз редактировалось Retimiled; 30.12.2009 в 20:03..
|
|
|

30.12.2009, 22:36
|
Регистрация: 29.05.2002
Сообщений: 1,793
С нами:
12604706
Репутация:
0
|
|
Сообщение от Root-access
Мне это напомнило такой код на с:
Код:
int a[10], i;
for(i=0;i<=10;i++) a[i]=0;
На старых компиляторах он уходил в бесконечный цикл.
Вот и задачка. А ну-ка скажите, почему это происходит? 
Кстати, если чуть подправить код, программа и в новых компиляторах будет получаться вечная.
Память под a[] не выделяется?
|
|
|

30.12.2009, 22:41
|
Регистрация: 29.05.2002
Сообщений: 1,793
С нами:
12604706
Репутация:
0
|
|
Сообщение от jawbreaker
Дружно учим C#:
PHP код:
checked
{
for (byte b = 0; b <= 255; b++)
Console.WriteLine(b);
}
Это конечно здорово, но в подавляющем числе случаев - checked не используется, а описанное поведение является неожиданным для программиста.
|
|
|

30.12.2009, 23:04
|
|
Участник форума
Регистрация: 18.06.2008
Сообщений: 222
С нами:
9419426
Репутация:
648
|
|
Сообщение от Algol
Память под a[] не выделяется?
Почему же? Выделяется вполне...
|
|
|

30.12.2009, 23:10
|
Регистрация: 29.05.2002
Сообщений: 1,793
С нами:
12604706
Репутация:
0
|
|
Сообщение от Retimiled
каким образом Algol вывел логическую цепочку от целеноправленного введения for в бесконечны
.....
Из всего этого набора слов (отмечаешь наверное уже  ) я так понял ты критикуешь мою фразу о том что "в си-подобных языках нет оператора for в чистом виде" ?
Могу объяснить более подробно, что и имел ввиду:
1) Цикл for в Си действительно органозован через while. И даже не столько в синтаксическом плане, сколько в логическом. На каждой итерации - проверяется некое условие, и выполняется некое действие. По сути - это while, просто синтаксически оформленный иначе. Но, если мы посмотрим на теорию программирования (безотносително к какому-либо языку), то смысл for - совсем другой. Смысл for - повторить свое тело заданное число раз. Причем некоторые языки дают даже более жесткое определение - повторение своего тела определенное и заданное наперед число раз. Именно такое поведение реализуется в Паскале (Школьники многих школ .... где преподают Паскаль вместо Си ВАМ ПОДТВЕРДЯТ ЭТО  ). И это правильно, ибо это ближе к изначальному определению for. В Си же (как и во многих других вещах) решили не париться и сделали for через while.
А приведенный выше пример как раз и демонстрирует недостаток такого подхода. В Паскале же этот цикл работает без проблем. Он и не может не работать, ведь смысл конструкции for i:=0 to 255 do; в том, что i последовательно принимает значения от 0 до 255, и никаких i++ тут нет, поэтому и переполнения тут никакого быть не может в принципе. Конечно, где-то там внутри , в откомпилированном exe i++ где-то есть , но отсутсвие побочных эффектов, переполения нам гарантирует компилятор, и мы об этом не должны думать.
Надеюсь понятно изложил? Да и к тому же фразу о том, что в Си по факту нет for - придумал не я. Слышал давно очень, уже и не вспомню откуда
2) Касаемо C#. Да, сишарп по синтаксису близок к Си, но семантика и идеология языка - гораздо ближе к Паскалю, чем к Си. Именно поэтому я и написал что си-подобное поведение шарпа в данном случае не очень ожидаемо.
|
|
|

30.12.2009, 23:12
|
Регистрация: 29.05.2002
Сообщений: 1,793
С нами:
12604706
Репутация:
0
|
|
Сообщение от Root-access
Почему же? Выделяется вполне...
Я просто не пишу на Си, но мне казалось что под массив нужно явно выделить память. Нет ?
|
|
|

30.12.2009, 23:20
|
|
Постоянный
Регистрация: 16.08.2006
Сообщений: 640
С нами:
10386906
Репутация:
599
|
|
память под а выделяется. тока она на стеке. а цикл идет <= 10, компиль видимо генерит так, что переменная i лежит за массивом(a[10] указывает на i). таким образом i при значении 10 затирается нулем, с помощью выхода за границы массива. видимо как то так
Фактически for это цикл while, для которого указано условие продолжения (b<=255) и некторый оператор, изменяющий b (b++).
а вот это бред. тогда уж скорее while - это for, у кторого не задан первый и последний параметр типа
Последний раз редактировалось Ra$cal; 30.12.2009 в 23:24..
|
|
|

30.12.2009, 23:23
|
Регистрация: 29.05.2002
Сообщений: 1,793
С нами:
12604706
Репутация:
0
|
|
Сообщение от Ra$cal
память под а выделяется. тока она на стеке. а цикл идет <= 10, компиль видимо генерит так, что переменная i лежит за массивом(a[10] указывает на i). таким образом i при значении 10 затирается нулем, с помощью выхода за границы массива. видимо как то так
Ясно, ну здесь уже проблема с отсутствием контроля границ массива. В шарпе и паскале тут бы выпал эксепшен.
|
|
|

30.12.2009, 23:37
|
|
Banned
Регистрация: 24.12.2009
Сообщений: 141
С нами:
8622379
Репутация:
45
|
|
8)) ... ну еще раз повторюсь .... програмисты используют особенности работы for (в Си понимании) .... кароче ВСЕХ С НОВЫМ ГОДОМ !! 
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|