BikaXh Axom Majumdar Ответов: 2

Выход до и после инкрементов/декрементов


Hello guys i am new to c language. The output of the following is 6264 but i can't figure out how they got that. Please explain it. 


пустота главная()
{
int a, b;
a=b=4;
b=a++;
функции printf("%д%д%д%д",++,--б,++а,б--);
геч();
}

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

я пробовал youtube и некоторые другие форумы, но не смог получить четкого ответа.

[no name]

Ясный ответ заключается в том, что ответ, который вы получите, будет зависеть от компилятора. Я получаю 6274, когда запускаю это, и другие получат другие ответы. Зависит от того, как компилятор реализует операторы.

Rick York

Это хороший пример конструкции, которую следует избегать, поскольку результаты неоднозначны. На самом деле вопрос в том, какое значение a используется в вызове. Первое переданное значение - ++ с постинкрементом. Некоторые компиляторы помещают значение в стек, а затем применяют приращение перед отправкой последующих значений. Другие будут применять приращение после нажатия последующих значений, поэтому вы видите разные результаты. Поскольку это выражение можно обрабатывать разными, но действительными способами, я думаю, что его следует избегать вообще. То есть, если вы хотите писать переносимый код. Дело в том, что даже разные версии одного и того же компилятора могут давать разные результаты. Ради программистов обслуживания и во избежание двусмысленности я почти всегда избегаю выражений post / pre-increment и не могу вспомнить, когда в последний раз использовал их.

2 Ответов

Рейтинг:
4

Patrice T

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

printf("%d%d%d%d",a++,--b,++a,b--);

непредсказуемо, это зависит от внутренних компонентов компилятора.
Вопреки
printf("%d%d",a++,--b);
printf("%d%d",++a,b--);

что вполне предсказуемо.


BikaXh Axom Majumdar

спасибо :)

Рейтинг:
17

Afzaal Ahmad Zeeshan

Потому что это не шесть тысяч, а двести шестьдесят четыре. Это всего лишь "шесть два шесть 4". Однако, когда я запускаю ту же программу онлайн (Оболочка C++ [^]), Я получаю следующий вывод,

// Example program
#include <stdio.h>
#include <string>

int main()
{
    int a,b;
    a=b=4;
    b=a++;
    printf("%d%d%d%d",a++,--b,++a,b--);
}
// 6274

Происходит то, что значения переменных увеличиваются или уменьшаются. "а++" означает " А = А + 1 "и аналогично для"--". Разница, или главное, что здесь нужно понять, заключается в префиксе и постфиксе операторов. В префиксе выражение (полное выражение) разрешается до того, как используется текущее выражение и обновленное значение, однако в другом случае (постфикс) текущее выражение разрешается с использованием старого значения, а затем значение увеличивается/уменьшается.

В вашем коде только
b = a++;
// Here b = 4, but after this line a = 5

Это линия, где это входит в Трюк, в противном случае все остальное должно быть в порядке.

Я бы посоветовал вам прочитать их, прежде чем пытаться снова, c-в чем разница между префиксными и постфиксными операторами? - переполнение стека[^]
Постфиксные операторы инкремента и декремента: ++ и --[^]


BikaXh Axom Majumdar

Спасибо. Я попробовал тот же код с помощью Codeblock, и он возвращает 6274. чего я не могу понять, так это того, существует ли стандартный способ решения таких проблем?
P. s. Я использую borland.

Afzaal Ahmad Zeeshan

Да есть такое. То x++ решает x в выражении, но устанавливает x = x + 1; С другой стороны, ++x решает x + 1 и устанавливает x = x + 1.

Они оба увеличивают значение, разница такова когда И есть так много статей, которые объясняют внутренности этого механизма и почему они доступны в программировании на C/C++.

Начните с чего угодно,
http://www.crasseux.com/books/ctutorial/Postfix-and-prefix----and---.html
http://stackoverflow.com/questions/29173422/postfix-and-prefix-in-printf-and-for-function-c
http://stackoverflow.com/questions/24853/what-is-the-difference-between-i-and-i

BikaXh Axom Majumdar

было бы очень полезно, если бы вы могли показать мне шаг за шагом.

BikaXh Axom Majumdar

Спасибо :)