ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2

ANTICHAT — форум по информационной безопасности, OSINT и технологиям

ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию. Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club, и теперь снова доступен на новом адресе — forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
Вернуться   Форум АНТИЧАТ > Программирование > С/С++, C#, Delphi, .NET, Asm
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #21  
Старый 19.12.2009, 22:06
Irdis
Участник форума
Регистрация: 06.02.2006
Сообщений: 177
Провел на форуме:
1576821

Репутация: 88
Отправить сообщение для Irdis с помощью ICQ
По умолчанию

Код:
	for (unsigned char b = 0; (std::cout<<(int)b++<<"\n")&&(b!=0); );
тоже самое на плюсах
 
Ответить с цитированием

  #22  
Старый 19.12.2009, 22:26
M_script_
Постоянный
Регистрация: 29.10.2008
Сообщений: 306
Провел на форуме:
1819761

Репутация: 180
Отправить сообщение для M_script_ с помощью ICQ
По умолчанию

Цитата:
Сообщение от 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..
 
Ответить с цитированием

  #23  
Старый 19.12.2009, 22:34
Markus_13
Познающий
Регистрация: 19.02.2009
Сообщений: 83
Провел на форуме:
181715

Репутация: 50
Отправить сообщение для Markus_13 с помощью ICQ
По умолчанию

Цитата:
Сообщение от Algol  
Есть
не, конечно не спорю что JS разделяет переменные по типам, но насколько я помню в самом коде переменные не объявляются - т.к. JS работает с переменными взависимости от обращения, если я напишу:
Цитата:
var s;
s=2+3;
s=s+"0";
s=document.getElementById("someID");
то сначала перем-ая s будет обрабатываться как число, затем как строка, а затем и вовсе как объект...
 
Ответить с цитированием

  #24  
Старый 19.12.2009, 22:41
M_script_
Постоянный
Регистрация: 29.10.2008
Сообщений: 306
Провел на форуме:
1819761

Репутация: 180
Отправить сообщение для M_script_ с помощью ICQ
По умолчанию

Algol, миниквест пора заканчивать. Говори правильный ответ. Мне кажется постпроверка с префиксным инкрементом в этом случае оптимальный вариант. По крайней мере по количеству используемой памяти )
 
Ответить с цитированием

  #25  
Старый 19.12.2009, 23:08
Markus_13
Познающий
Регистрация: 19.02.2009
Сообщений: 83
Провел на форуме:
181715

Репутация: 50
Отправить сообщение для Markus_13 с помощью ICQ
По умолчанию

SitraIT, ыыы, типа вот этого чтоли:
Код:
function MyClass(){
this.name="Some";
}
var s=new MyClass();
хотя я с JS работаю весьма недолго - я знаю это, но я и не писал что там нельзя этого делать
З.Ы. вообще имхо это не классы и объекты, а костыли)))
 
Ответить с цитированием

  #26  
Старый 20.12.2009, 00:44
scrat
Постоянный
Регистрация: 08.04.2007
Сообщений: 853
Провел на форуме:
5812656

Репутация: 1540


Отправить сообщение для scrat с помощью ICQ
По умолчанию

по-моему ответ где-то тут
Код:
.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
 
Ответить с цитированием

  #27  
Старый 20.12.2009, 02:35
Algol
Регистрация: 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..
 
Ответить с цитированием

  #28  
Старый 20.12.2009, 02:50
Irdis
Участник форума
Регистрация: 06.02.2006
Сообщений: 177
Провел на форуме:
1576821

Репутация: 88
Отправить сообщение для Irdis с помощью ICQ
По умолчанию

спасибо кэп...
 
Ответить с цитированием

  #29  
Старый 30.12.2009, 16:44
Root-access
Участник форума
Регистрация: 18.06.2008
Сообщений: 222
Провел на форуме:
2223440

Репутация: 648
Отправить сообщение для Root-access с помощью ICQ
По умолчанию

Мне это напомнило такой код на с:
Код:
int a[10], i;
for(i=0;i<=10;i++) a[i]=0;
На старых компиляторах он уходил в бесконечный цикл.
Вот и задачка. А ну-ка скажите, почему это происходит?
Кстати, если чуть подправить код, программа и в новых компиляторах будет получаться вечная.
 
Ответить с цитированием

  #30  
Старый 30.12.2009, 18:34
scrat
Постоянный
Регистрация: 08.04.2007
Сообщений: 853
Провел на форуме:
5812656

Репутация: 1540


Отправить сообщение для scrat с помощью ICQ
По умолчанию

Цитата:
Сообщение от 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
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ПК как лаборатории для "выращивания" цифровой жизни b1oxa Мировые новости 0 05.10.2009 21:54
Sale of ICQ Hertz ICQ - Покупка, продажа 1 28.09.2009 04:27
Фразы о жизни novichok Болталка 10 15.07.2006 21:04



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ