С программированием в то время как - PullRequest
4 голосов
/ 29 сентября 2011
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])  
{   
    int x=0;
    int y=0;
    while (x<15)y++,x+=++y;
    printf ("%i %i",x, y);
    getchar ();
    getchar ();
    return 0;
}

Я не знаю, почему х равен 20, а у - 8 в конце.Пожалуйста, объясните это шаг за шагом.

Ответы [ 8 ]

4 голосов
/ 29 сентября 2011
while (x<15)y++,x+=++y;

=>

while (x<15) {

    y++;
    x += ++y;

}

=>

while (x < 15) {
    y += 2;
    x += y;
}

Итак:

Before 1st iteration: x = 0, y = 0;

After 1st iteration: x = 2, y = 2;
After 2nd iteration: x = 6, y = 4;
After 3rd iteration: x = 12, y = 6;
After 4th iteration: x = 20, y = 8;

Обратите внимание, что для этих значений существует простая замкнутая формулаа также: x = n*n - n и y = 2*n.

3 голосов
/ 29 сентября 2011

Помните, что:

  1. y ++ увеличивает y
  2. x + = ++ y сначала увеличивает y, а затем добавляет его к x

, что даетследующие значения для x и y:

iterations   x    y
0            0    0
1            2    2
2            6    4
3            12   6
4            20   8
1 голос
/ 29 сентября 2011

x <15 -> y = 1, x = 0 + (y = 2) = 2

2 <15 -> y = 3, x = 2 + (y = 4) = 6

6 <15 -> у = 5, х = 6 + (у = 6) = 12

12 <15 -> у = 7, х = 12 + (у = 8) =20

Выполнено x = 20, y = 8

Оператор запятой обеспечивает порядок выполнения.x, y означает, что сначала выполняется x, а затем y.

1 голос
/ 29 сентября 2011

Если вы следите за тем, что произойдет с вашими переменными:

First Loop:
x=0, y=0
y++ => y=1
x+=++y => x=2, y=2

Second Loop:
x=1, y=2
y++ => y=3
x+=++y => x=6, y=4

Third Loop:
y++ => y=5
x+=++y => x=12, y=6

Fourth Loop:
y++ => y=7
x+=++y => x=20, y=8

И в то время как цикл завершится.

0 голосов
/ 29 сентября 2011

в каждой итерации

y increased by 2 ( y +=2 ) ,
after that x increased by x + y ( x= x+y)
it skips when x = 20 ( as x is now > 15  ) 
0 голосов
/ 29 сентября 2011

Хорошо, это то, что происходит в каждом цикле в предложении while:

  • Увеличение y на единицу
  • Увеличение y на единицу дополнительно
  • добавление y кx
  • если x> = 15, остановите цикл

Теперь в числах, прямо перед концом цикла:

  1. x = 0, у= 0
  2. x = 2, y = 2
  3. x = 6, y = 4
  4. x = 12, y = 6
  5. x = 20, у = 8 -> х> 15 -> завершить цикл.
0 голосов
/ 29 сентября 2011

Давайте пройдемся по циклам (условия после цикла):

  1. x = 2, y = 2
  2. x = 6, y = 4
  3. x = 12, y = 6
  4. x = 20, y = 8

В каждом цикле эффективно выполняется следующее:

y+=2
x+=y

, что приводит кв состояниях, написанных выше.

0 голосов
/ 29 сентября 2011

Я изменил его на

#include <stdio.h>
int main()
{
    int x=0;
    int y=0;
    while (x<15) {
        y++,x+=++y;
        printf ("%i %i\n",x, y);
    }
    return 0;
}

и это дает

H:\Temp>a.exe
2 2
6 4
12 6
20 8

сейчас.

Почему? Потому что y увеличивается дважды на каждом шаге, а x добавляет новое значение. Таким образом, вы получите 2 + 4 + 6 + 8 = 20.

Но я не уверен, что это определенное поведение. Это если оператор , определяет точку последовательности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...