• Register
- academy algorithms and android app arrays asp bgcoder c c# c#-fundamentals c#-курс cloud cms code console course css css3 data database design development dice dom error exam expressions front-end-course functions game google help homework homeworks html html-basics-course html5 java javascript jquery js less linux methods microsoft mobile mvc mysql net online oop operators photoshop php problem programming qa question sass seo server slice software sql studio system teamwork telerik telerik-academy test ui video visual visual-studio web windows windows-8 wordpress workshop xaml администрация академия видео видео-уроци въпрос въпроси грешка данни дата домашни домашно домашното задача задачи задачи-домашно записване изпит изпити качествен-програмен-код книга кпк курс курсове лаптоп лекции лекция линукс масиви материали на обучение онлайн ооп операционни-системи основи оценяване подготовка помощ предложение проблем програма програмиране проект проекти работа работа-в-екип резултати сайт семинар софтуерна софтуерна-академия споделяне-на-знания срок съвети телерик тест уеб-дизайн уроци форум 1 2 3 4 5 7 8 2012 2013
Форум на академията Студентска система

C# бъг в for цикъл

+2 votes

При писане на for цикъл с водеща променлива от тип byte и обратно броене се получава безкраен цикъл.

Пример:

using System;
class ByteLoop
{
    static void Main()
    {
        for (byte i = 7; i >= 0; i--)
        {
            Console.WriteLine(i);
        }
    }
}
 
Програмата трябва да изведе числата от 7 до 0, но цикълът продължва въпреки условието >=0 и в резултат се получава безкраен цикъл. Според мен това поведение е некоректно.
 
Edit: Problem solved
 
Използвам тип, който приема само положителни стойноти. Когато променливата стигне стойност 0 се изпълнява тялото на цикъла, след това променливата се декриментира и типа се  превърта - става 255, което отново е >=0 и затова се получава безкрайният цикъл.
asked Sep 29, 2012 in C# Programming by and0 (1,570 points)
edited Sep 29, 2012 by and0

3 Answers

+1 vote
Byte е винаги полужително число от 0 до 255, ако изпозлваш sbyte няма да имаш такъв проблем.
answered Sep 29, 2012 by Teodor Kurtev 1 Master Ninja (53,820 points)
Работи с всички типове освен byte. Също така не излизам от дефинираните стойности на типа.
Пробва ли дали работи с uint, ulong, ushort ? Те също имат само положителни стойности и с тях просто няма да работи. Както казах byte е положително число което е от 0 до 255 и просто условието на цикъла ти няма как да се изпълни т.к. byte няма как да слезе под 0 :)
Поздрави
Теодор
Да прав си. Отива до 0, декрементира го и след това типа превърта. Моя грешка :)
просто ти не си написал условието като хората, за това трябва да се внимава, с unsigned числата ;)
+1 vote

 

Може и така, ако държиш на byte :)
for (byte i = 8; i > 0;i--)
        {
            i--;
            Console.WriteLine(i);
            i++;
        }
 
 
answered Sep 29, 2012 by vlad0 Senior Ninja (27,420 points)
+2 votes

тип  byte е беззнаков от 0 до 255. на последната итерация когато е 0-ла ти се опитваш да го направиш отрицателно число и заради това прави проблем.

Реално се получава така, че когато опиташ да направиш  i = -1, то превърта и става 255, затова зацикляш програмата. 

Това е некоректно поведение в типа и е много неприятно. Такива ефекти може да сеполучат и при събиране, изваждане на числа. За целта е измислен една функция "checked". Ще я учите по нататък. Ако ти е интересно може да прочетеш за нея тук : http://msdn.microsoft.com/en-us/library/74b4xzyw.aspx

кода може да го преобразуваш в следното нещо:

 

public static void Main()
        {
            try
            {                   
                checked
                { 
                    for(byte i = 7; i>=0; i--)
                    {
                        System.Console.WriteLine(i);
                    }
                }
            }
            catch(Exception e){System.Console.WriteLine("error");}           
        } 

 

Препоръчвам за for цикли стандартно да се ползва "int" или някой друг тип ако се наложи, но да подържа отрицателни числа.

Поздрави,

 

 

 

answered Sep 29, 2012 by Boris Gutsev Ninja (18,280 points)
...