Hyeladi Bassi Ответов: 3

Нужны объяснения, пожалуйста! ! !


У меня возникли проблемы с объяснением этого кода, и я действительно хотел бы получить подробное объяснение того, как он работает.
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int x=-3, y=0, k,j;

    for( k=j=-3 ; x= x+(k<j),++j ; y+=2);
    printf("x=%d  y=%d k=%d  j=%d",x,y,k,j);

    getch();
}

Кстати, ответы таковы: x=-1 y=4 k=-3 j=0.

Что я уже пробовал:

Я пытался решить ее систематически, но постоянно застреваю на этапе инкремента задачи (++j), и мои ответы в конечном итоге отличаются от выполняемой программы

GKP1992

Вы уверены, что это правильное тело цикла for? Там нет надлежащего состояния.

Hyeladi Bassi

да, это правильный орган, это был вопрос, заданный студентам около двух лет назад в моей школе, но объяснение никогда не давалось просто ответ

CPallini

Это действительно неудобный код, я не вижу смысла в таком кодировании (я даже не вижу смысла пытаться понять его).

3 Ответов

Рейтинг:
28

OriginalGriff

Это отвратительный код!
Это всегда плохая идея иметь такую конструкцию:

for (...);
printf(...);
потому что не очень трудно увидеть ";" в конце for петля - так это выглядит для случайного глаза, как будто вы написали это:
for(...)
   {
   printf(...);
   }
Что привело бы к совершенно иным результатам. На самом деле, современные компиляторы будут жаловаться или, по крайней мере, предупреждать вас об этом, потому что это действительно вызывает много путаницы.
Поэтому начните с реструктуризации вашего кода:
int main()
{
    int x = -3, y = 0, k, j;

    for( k = j = -3 ; ++j ; y += 2)
       {
       x = x + (k < j);
       }
    printf("x=%d  y=%d k=%d  j=%d",x,y,k,j);
    return 0;
}
Теперь это легче читать и гораздо более очевидно, что происходит.
1) предварительно установите x на -3, y на 0.
2) предустановленные значения k и j до -3.
3) Войдите в цикл.
3.1) сравните k и j.
3.1.1) если k меньше j, добавьте единицу к x (помните, что в C результат любой логической операции равен нулю для false или единице для true, поэтому k < j возвращает 0 или 1)
3.1.2) в противном случае добавьте ноль к x.
3.2 добавления 2 к г
3.3 добавьте единицу к j, и если это значение не равно нулю, выполните обратный цикл до (3).
4) распечатайте результаты.

Видите, насколько легче читать и понимать, когда вы пишете это правильно?
Однако это все еще неприятный код: я бы предпочел увидеть либо это:
int main()
{
    int x = -3, y = 0, k, j;

    for( k = j = -3 ; ++j ; y += 2)
       {
       if (k < j)
          {
          x++;
          }
       }
    printf("x=%d  y=%d k=%d  j=%d",x,y,k,j);
    return 0;
}
Или вот это:
int main()
{
    int x = -3, y = 0, k, j;

    for( k = j = -3 ; ++j ; y += 2)
       {
       x += (k < j) ? 1 : 0;
       }
    printf("x=%d  y=%d k=%d  j=%d",x,y,k,j);
    return 0;
}
Где значения, с которыми вы играете, более явны.


Рейтинг:
1

KarstenK

Чтобы понять этот код, вам нужно узнать о цикл for и префиксный оператор инкремента .

Этот цикл for немного запутан. Обычно в голове находится только контрольная и встречная логика, а та-в теле.

int main()
{

 for( int y = 0 ; y < 5; y+=2) //normally you check the counter
 {
   j++;
   x= x+(k<j);// strange should be x + 1 (true) ???
   if( j > y ) //alternative exit
   {
     break;
   }
 }
 
  printf("x=%d  y=%d k=%d  j=%d",x,y,k,j);

    getch();
}
Этот демонстрационный код может привести к другим результатам, чем ваш код.


Рейтинг:
0