Почему печатается 16 вместо 17, а переменная не увеличивается? - PullRequest
1 голос
/ 30 апреля 2020
#include<iostream.h>
void main()
{
    int A=5,B=10;
    for(int I=1;I<=2;I++)
    {
        cout<<"Line1="<<A++<<"&"<<B-2<<endl;
        cout<<"Line2="<<++B<<"&"<<A+B<<endl;
    }
}

Вывод этой программы

Line1=5&8
Line2=11&16
Line1=6&9
Line2=12&18

Я думал, что она выдаст 17 и 19 вместо 16 и 18 во второй и четвертой строках вывода. Это связано с тем, что при первом запуске l oop сначала значение A равно 5, а первая команда печатает 5 и 8 и должно увеличивать значение A на 1, делая его 6. Во второй команде должно выводиться 11 & (6 + 11), который должен печатать 11 и 17, но вывод не тот.

Где в моих рассуждениях лазейка?

1 Ответ

0 голосов
/ 30 апреля 2020

Я не специалист по этому вопросу, но я полагаю, что это из-за порядка операций, выполняемых в фоновом режиме.

В основном «<<» - это то, что называется перегруженным оператором, что в основном означает что кто-то где-то написал, что он должен делать и как это делать. И если у вас есть куча вещей, написанных одна за другой, например, у вас есть: </p>

cout<<"Line2="<<++B<<"&"<<A+B<<endl;

Компилятор должен сделать несколько причудливых трюков, чтобы заставить его работать. Программа проходит через такой код справа налево. Так что, по сути, все происходит наоборот, как вы думаете. Сначала он нажимает endl, затем он делает A + B и толкает его, затем он нажимает &, затем он увеличивает B и также толкает его, в конце концов он толкает Line2 =, формируя полное "предложение". Затем они переносятся на консоль (или что-то еще, что у вас может быть) для одновременной печати на экране.

В качестве решения проблемы попробуйте разделить cout на 2 строки; что-то вроде этого:

cout <<"Line2="<<++B<<"&";
cout <<A+B<<endl;

Или, если позволено, попробуйте поменять местами ++ B и A + B, это также должно решить проблему, однако ваши результаты также будут изменены на обратные.

cout<<"Line2="<<A+B<<"&"<<++B<<endl;

tl; dr: A + B происходит до B ++, выполнение их в отдельных строках или смена позиций должны решить проблему

...