ANTICHAT — форум по информационной безопасности, OSINT и технологиям
ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию.
Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club,
и теперь снова доступен на новом адресе —
forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
 |
|

19.12.2009, 22:06
|
|
Участник форума
Регистрация: 06.02.2006
Сообщений: 177
Провел на форуме: 1576821
Репутация:
88
|
|
Код:
for (unsigned char b = 0; (std::cout<<(int)b++<<"\n")&&(b!=0); );
тоже самое на плюсах
|
|
|

19.12.2009, 22:26
|
|
Постоянный
Регистрация: 29.10.2008
Сообщений: 306
Провел на форуме: 1819761
Репутация:
180
|
|
Сообщение от Irdis
Код:
for (unsigned char b = 0; (std::cout<<(int)b++<<"\n")&&(b!=0); );
тоже самое на плюсах
Код:
for (byte b = 0; (std::cout << b++ << std::endl) && b; );
P.S.: не помню, как в VS, но в билдере по умолчанию typedef unsigned char byte; есть
Последний раз редактировалось M_script_; 19.12.2009 в 22:33..
|
|
|

19.12.2009, 22:34
|
|
Познающий
Регистрация: 19.02.2009
Сообщений: 83
Провел на форуме: 181715
Репутация:
50
|
|
не, конечно не спорю что JS разделяет переменные по типам, но насколько я помню в самом коде переменные не объявляются - т.к. JS работает с переменными взависимости от обращения, если я напишу:
var s;
s=2+3;
s=s+"0";
s=document.getElementById("someID");
то сначала перем-ая s будет обрабатываться как число, затем как строка, а затем и вовсе как объект... 
|
|
|

19.12.2009, 22:41
|
|
Постоянный
Регистрация: 29.10.2008
Сообщений: 306
Провел на форуме: 1819761
Репутация:
180
|
|
Algol, миниквест пора заканчивать. Говори правильный ответ. Мне кажется постпроверка с префиксным инкрементом в этом случае оптимальный вариант. По крайней мере по количеству используемой памяти )
|
|
|

19.12.2009, 23:08
|
|
Познающий
Регистрация: 19.02.2009
Сообщений: 83
Провел на форуме: 181715
Репутация:
50
|
|
SitraIT, ыыы, типа вот этого чтоли:
Код:
function MyClass(){
this.name="Some";
}
var s=new MyClass();
хотя я с JS работаю весьма недолго - я знаю это, но я и не писал что там нельзя этого делать
З.Ы. вообще имхо это не классы и объекты, а костыли)))
|
|
|

20.12.2009, 00:44
|
|
Постоянный
Регистрация: 08.04.2007
Сообщений: 853
Провел на форуме: 5812656
Репутация:
1540
|
|
по-моему ответ где-то тут
Код:
.method private hidebysig static void Main() cil managed
{
.entrypoint
// Code size 47 (0x2f)
.maxstack 2
.locals init (uint8 V_0,
bool V_1)
IL_0000: nop
IL_0001: ldc.i4.0
IL_0002: stloc.0
IL_0003: br.s IL_001b
IL_0005: ldstr "{0}"
IL_000a: ldloc.0
IL_000b: box [mscorlib]System.Byte
IL_0010: call void [mscorlib]System.Console::WriteLine(string,
object)
IL_0015: nop
IL_0016: ldloc.0
IL_0017: ldc.i4.1
IL_0018: add
IL_0019: conv.u1
IL_001a: stloc.0
IL_001b: ldloca.s V_0
IL_001d: ldc.i4 0xff
IL_0022: call instance int32 [mscorlib]System.Byte::CompareTo(uint8)
IL_0027: ldc.i4.0
IL_0028: clt
IL_002a: stloc.1
IL_002b: ldloc.1
IL_002c: brtrue.s IL_0005
IL_002e: ret
} // end of method c::Main
|
|
|

20.12.2009, 02:35
|
Регистрация: 29.05.2002
Сообщений: 1,793
Провел на форуме: 2050916
Репутация:
0
|
|
Сообщение от M_script_
Algol, миниквест пора заканчивать. Говори правильный ответ. Мне кажется постпроверка с префиксным инкрементом в этом случае оптимальный вариант. По крайней мере по количеству используемой памяти )
Эээ... А разве здесь может быть правильный ответ
Правильный - любой который работает
Лично я бы писал так как предлагал slesh:
Код:
for(byte b=0;b<=255;b++)
{
Console.WriteLine(b);
if(b==255) break;
}
Некрасиво конечно, но по другому не получится.
Еще мне понравился вариант desTiny, что на C# выглядело бы типа такого
Код:
byte b = 0;
do
Console.WriteLine(b);
b++;
while(b!=0);
Он конечно содержит минимум операторов, но у него есть недостаток - он в общем случае не работает, если границы перебора заранее не известны.
Да и кстати, вообще-то я спрашивал почему же исходный код не работает, а все почему то начали приводить примеры работающих кодов
Раз никто не ответил, отвечу сам:
На самом деле, в си-подобных языках нет оператора for в чистом виде. Фактически for это цикл while, для которого указано условие продолжения (b<=255) и некторый оператор, изменяющий b (b++).
Причем условние продолжения цикла проверяется на каждой итерации.
Когда значение b достигает 255, цикл отрабатывает, и далее выполняется операция b++, результатом которой является снова 0! Далее проверяется условие b<=255 - оно очевидно выполняется, и цикл идет дальше, таким образом зацикливаясь в бесконечность.
Для си в принципе это поведение нормальное, однако для C# лично мне это кажется не очень логичным поведением. Логичнее было бы на 255++ генерировать исключение (что то типа OverflowException) - ведь фктически происходит переполение. Но нет, он тихо сбрасывается в ноль и идет себе дальше 
Точно такая же ситуация возникает и для всех остальных целочисленных типов. Например цикл
for(int i=0;i<=int.MaxInt;i++) - тоже зацикливается.
Получается что стандартный код типа
for(int i=1;i<=arr.Count;i++)
является небезопасным, так как если arr.Count==int.MaxInt, то цикл будет бесконечным :[
Последний раз редактировалось Algol; 20.12.2009 в 02:37..
|
|
|

20.12.2009, 02:50
|
|
Участник форума
Регистрация: 06.02.2006
Сообщений: 177
Провел на форуме: 1576821
Репутация:
88
|
|
спасибо кэп...
|
|
|

30.12.2009, 16:44
|
|
Участник форума
Регистрация: 18.06.2008
Сообщений: 222
Провел на форуме: 2223440
Репутация:
648
|
|
Мне это напомнило такой код на с:
Код:
int a[10], i;
for(i=0;i<=10;i++) a[i]=0;
На старых компиляторах он уходил в бесконечный цикл.
Вот и задачка. А ну-ка скажите, почему это происходит? 
Кстати, если чуть подправить код, программа и в новых компиляторах будет получаться вечная.
|
|
|

30.12.2009, 18:34
|
|
Постоянный
Регистрация: 08.04.2007
Сообщений: 853
Провел на форуме: 5812656
Репутация:
1540
|
|
Сообщение от Algol
Раз никто не ответил, отвечу сам:
На самом деле, в си-подобных языках нет оператора for в чистом виде. Фактически for это цикл while, для которого указано условие продолжения (b<=255) и некторый оператор, изменяющий b (b++).
Причем условние продолжения цикла проверяется на каждой итерации.
Когда значение b достигает 255, цикл отрабатывает, и далее выполняется операция b++, результатом которой является снова 0! Далее проверяется условие b<=255 - оно очевидно выполняется, и цикл идет дальше, таким образом зацикливаясь в бесконечность.
Для си в принципе это поведение нормальное, однако для C# лично мне это кажется не очень логичным поведением. Логичнее было бы на 255++ генерировать исключение (что то типа OverflowException) - ведь фктически происходит переполение. Но нет, он тихо сбрасывается в ноль и идет себе дальше 
Точно такая же ситуация возникает и для всех остальных целочисленных типов. Например цикл
for(int i=0;i<=int.MaxInt;i++) - тоже зацикливается.
Получается что стандартный код типа
for(int i=1;i<=arr.Count;i++)
является небезопасным, так как если arr.Count==int.MaxInt, то цикл будет бесконечным :[
предлагаю обратиться с этим на формуы msdn или к разработчикам платформы .net
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|