Сомнения в коде, использующем цикл do while - PullRequest
1 голос
/ 22 июня 2010

Это небольшой фрагмент кода, показанный ниже, который использует циклы do while.Я действительно не понимаю непредвиденное поведение, которое я вижу, когда я выполняю этот код. Этот код, показанный ниже, использует условие цикла do while, и, насколько мне известно, цикл do while выполняется таким образом, что если сначала выполняется оператор, а затем проверяется времячастично, если условие истинно или нет. Но когда я выполняю этот код, он никогда не выходит из цикла и продолжается вечно. Может кто-нибудь сказать мне, почему это происходит?

           unsigned int A = 5;
           int B = 0;
           main()
          {
               do
               {
                   A = A + 5;
                   B = B - 1;
               }while(B > A);

           printf("hello\n");
          }

Теперь я никогда не получаю«Привет» напечатано.

Заранее спасибо, Мэдди

Ответы [ 5 ]

4 голосов
/ 22 июня 2010

Как говорят другие ответы, сравнение значения со знаком и без знака является плохой идеей (GCC предупредит об этом, если будут указаны правильные флаги).Причина, по которой вы застряли в «бесконечном цикле», заключается в том, что значение B со знаком для целей сравнения считается неподписанным.В первый раз, когда вы получаете while(B > A), B равно -1 (оно началось с 0 и было уменьшено один раз).Когда рассматривается как беззнаковое, оно становится максимально возможным целым числом, поэтому сравнение является истинным.Это остается верным в течение длительного времени, поэтому цикл, кажется, никогда не заканчивается.В конечном итоге увеличение A и уменьшение B заставит их проходить друг друга, и цикл завершится, но это займет больше времени, чем вы ожидали

1 голос
/ 22 июня 2010

Сравнение подписанного и неподписанного может привести к путанице.Вы должны сделать A и B одного типа.

1 голос
/ 22 июня 2010

Вы сравниваете целое число без знака с отрицательным числом. Попробуйте превратить A в подписанное int.

0 голосов
/ 22 июня 2010

Вы сравниваете подписанный с неподписанным. Но вы увидите "привет" в конце концов. Как A, так и B будут переполнены, чтобы сделать B> A ложным.

0 голосов
/ 22 июня 2010

печатает "привет" для меня. занимает некоторое время (ну, секунду или две).

изменено на это ...

void main()
{
    unsigned int A = 5;
    unsigned int loop = 0;
    int B = 0;
    do
    {
        A = A + 5;
        B = B - 1;
        loop++; 
    }while(B > A);

    printf("hello %d  %d %d\n", B, A, loop);
}

распечатывает: -

hello -715827882  -715827881 715827882
...