Petra Ответов: 5

инкремент в C++


Привет всем, кто-нибудь может мне помочь?
У меня есть эта простая программа:

#include<iostream.h>
пустота главная()
{
int A, B= 8;
A = ++B + ++B;
соиь<&ЛТ;а&ЛТ;&ЛТ;Б;
}

Я ожидал, что результат а будет 9+10 = 19, но результат был 20, и я пробовал много программ, но не мог понять причину их результатов.

Может ли кто-нибудь объяснить мне причины?
спасибо Вам за все

5 Ответов

Рейтинг:
37

Aescleal

Стандарт C++ (1998) гласит::

"Между предыдущей и следующей точками последовательности скалярный объект должен иметь свое сохраненное значение, измененное не более одного раза путем вычисления выражения. Кроме того, доступ к предыдущему значению должен осуществляться только для определения значения, подлежащего хранению. Требования настоящего параграфа должны выполняться для каждого допустимого порядка подвыражений полного выражения; в противном случае поведение не определено."

Когда вы дважды изменяете скалярный объект (B) перед следующей точкой последовательности (завершающей точкой с запятой), то, что происходит, не определено. Когда что - то не определено, все ставки отменяются-компилятор может выбросить любой старый мусор, который он хочет. Иногда мусор-это то, что вы хотите, но довольно часто это не так.

Прочтите о Обсуждение Анжелика Лангер [^] точек последовательности Для немного большего фона.

Овации,

Пепел


Richard MacCutchan

Изящно выражаясь, я хотел бы иметь терпение, чтобы прочитать стандарт (и память, чтобы запомнить его).

Рейтинг:
30

Richard MacCutchan

Вы нарушаете правила C++. Использование инкремента / декремента несколько раз в одном выражении для одной и той же переменной дает результаты, которые не могут быть гарантированы, поскольку автор компилятора может свободно вычислять выражение в любым способом они считают нужным. Вы должны использовать кодовый блок типа:

int A,B= 8;
A = ++B;    // A == 9
++B;        // B == 10
A += B;     // A == 19
}


Рейтинг:
2

Steven J Jowett

Вы пробовали заключить в скобки формуле, т. е.. :

A = (B++) + (B++)


Рейтинг:
2

Sauro Viti

Вы используете предварительное приращение, то приращения по вашей переменной выполняются так же, как они записываются в отдельном операторе, а не в текущем. Другими словами, эта линия:

int A, B = 8;
A = ++B + ++B;


обрабатывается компилятором таким же образом, как и:

int A, B = 8;
B = B + 1;
B = B + 1;
A = B + B;


Рейтинг:
0

Rohit from Delhi

напишите A=(++B)+(++B);

или

:роза: