МиниКвест. Недавно выловил такой вот баг в программе: Требовалось перебрать все значения байта от 0 до 255. Как оказалось, это сделать не так-то просто Очевидный, на первый взгляд код, не работает: Code: for (byte b = 0; b <= 255; b++) Console.WriteLine(b); Кто скажет почему не работает этот код? (желательно без компиляции )
так там после 255 идет 0 т.е. если будет число 255, то оно проверится по условию. цикл выполнится, далее число увеличится на 1. А так как это байт, то оно станет = 0 и тогда опять процдет проверку. достаточно было бы поставить < 256 чтобы исключить такое. Это собственно говоря проблема любого языка.
А да точно. туплю. Просто не ткомпилятора под рукой чтобы проверить. тогда типа так: Code: for (byte b = 0; b <= 255; b++) { Console.WriteLine(b); if (b == 255) break; } но вообще в данных условиях лучше просто расширить переменную хотябы до short
Это вообще говоря некорректно, потому как 256 выходит за рамки байта, и сравнивать с байтом - не очень хорошо (компилятор морщится на это варнингом). Ну и кроме того, как уже сказали, это не решает проблему. А вот здесь ты не прав. На delphi аналогичный код работает на ура Code: procedure TForm1.Button1Click(Sender: TObject); var i:byte; begin for i:=0 to 255 do self.text := intToStr(i); end;
тут как-то замешано то, что все типы в .net основаны на object, и byte - это не привычные 8 битов. Решение: Использовать CompareTo() рабочий пример: Code: byte b = 0x0; for (; b.CompareTo(0xFF)<0 ; b++) Console.WriteLine("{0}",b);
for (byte i = byte.MaxValue; i > byte.MinValue; i--) { Console.WriteLine(byte.MinValue + i); } rofl, теперь нет нуля? ))))
а с char'ом ещё смешнее - он ещё и signed я так обходил Code: UCHAR b = 0; do{ ... }while(--b); // или ++
Вариант 1 Code: byte b = 0; do Console.WriteLine(b++); while(b); Вариант 2 Code: byte b = 0; do Console.WriteLine(b); while(++b);
Code: static bool print(byte b) { Console.WriteLine(b); return true; } static void Main(string[] args) { for (byte b = 0; (print(b++)) && (b != 0); ); } опа... в плюсах можно ещё красивее сделать